如何实现除指定href外所有站外链接默认在新窗口打开
问题原因
原代码的判断逻辑使用了逻辑或||,只要满足「链接域名不等于本站域名」或者「href属性不等于javascript:;」其中一个条件,就会给链接设置新窗口打开属性。而javascript:;类型的链接本身没有hostname属性,必然满足第一个判断条件,所以会被误判为站外链接。
修正方案
把判断逻辑改为逻辑与&&,只有同时满足「链接域名不等于本站域名」、「href属性不等于javascript:;」两个条件时,才设置新窗口打开:
// 给无href属性的a标签设置默认值 document.querySelectorAll("a:not([href])").forEach(element => { element.setAttribute("href", "javascript:;") }); const allLinks = document.querySelectorAll('a'); for (let i = 0; i < allLinks.length; i++) { const a = allLinks[i]; // 只有站外+非javascript:;的链接才设置新窗口打开 if (a.hostname !== location.hostname && a.getAttribute("href") !== 'javascript:;') { a.rel = 'noopener'; a.target = '_blank'; } }
效果验证
- 站外链接(示例中的
https://yahoo.com):域名与本站不一致且href不是javascript:;,会在新窗口打开,符合预期 - 原本无href属性的链接:被设置为
javascript:;,不满足判断条件,不会触发新窗口打开,符合预期
如果站点有后续动态插入DOM的链接,把上述逻辑封装为函数,在新链接插入后重新调用一次即可适配。
内容的提问来源于stack exchange,提问作者Millhorn
相关产品推荐
相关产品推荐

