如何将 target="_blank" 添加到指定 div 中的链接?

IT技术 javascript hyperlink external-links
2021-02-02 17:15:42

假设我有以下代码:

<div id="link_other">
    <ul>
        <li><a href="http://www.google.com/">google</a></li>
        <li>
            <div class="some_class">
                dsalkfnm sladkfm
                <a href="http://www.yahoo.com/">yahoo</a>
            </div>
        </li>
    </ul>
</div>

在这种情况下,JavaScript 将添加target="_blank"到 div 中的所有链接link_other

我如何使用 JavaScript 做到这一点?

6个回答
/* here are two different ways to do this */
//using jquery:
$(document).ready(function(){
  $('#link_other a').attr('target', '_blank');
});

// not using jquery
window.onload = function(){
  var anchors = document.getElementById('link_other').getElementsByTagName('a');
  for (var i=0; i<anchors.length; i++){
    anchors[i].setAttribute('target', '_blank');
  }
}
// jquery is prettier. :-)

你也可以添加一个标题标签来通知用户你正在这样做,警告他们,因为正如已经指出的那样,这不是用户所期望的:

$('#link_other a').attr('target', '_blank').attr('title','This link will open in a new window.');
他要求使用 javascript,而不是 jQuery。
2021-03-21 17:15:42
更准确地说,您可以使用锚点: let anchors = document.querySelectorAll('#sources + div a'); // 更改选择器并使用 ES6 代替 for 循环:anchors.forEach((elem) => { elem.setAttribute('target', '_blank') }
2021-03-24 17:15:42

非jQuery:

// Very old browsers
// var linkList = document.getElementById('link_other').getElementsByTagName('a');

// New browsers (IE8+)
var linkList = document.querySelectorAll('#link_other a');

for(var i in linkList){
 linkList[i].setAttribute('target', '_blank');
}
在使用 elementor 将 target="_blank" 添加到 RSS 提要时,这个版本在 wordpress 中对我来说就像一个魅力
2021-03-21 17:15:42
而不是 getAttributesByTagName,它不应该是 getElementsByTagName 吗?
2021-04-04 17:15:42
或者只是 linkList[i].target = '_blank';
2021-04-10 17:15:42

请记住,Web 开发人员和可用性专家通常认为这样做是不好的做法。Jakob Nielson 关于取消对用户浏览体验的控制是这样说的:

尽可能避免产生多个浏览器窗口 - 将“返回”按钮从用户身上移开会使他们的体验变得如此痛苦,以至于它通常远远超过您试图提供的任何好处。支持生成第二个窗口的一个普遍理论是,它可以防止用户离开您的网站,但具有讽刺意味的是,它可能会阻止他们在他们想要的时候返回,从而产生相反的效果。

我相信这是 W3C 从 XHTML 1.1 规范中删除目标属性的基本原理。

如果您坚决采用这种方法,Pim Jager 的解决方案是不错的选择。

一个更好的、更用户友好的想法是将图形附加到您的所有外部链接,向用户表明跟随该链接会将它们带到外部。

你可以用 jquery 做到这一点:

$('a[href^="http://"]').each(function() {
    $('<img width="10px" height="10px" src="/images/skin/external.png" alt="External Link" />').appendTo(this)

});
我知道这是很久以前发布的,但我今天看到同样的问题经常发生。有人在回答之前大喊大叫使用所请求的信息的不利方面,但随后未能回答所提出的具体问题。jQuery 与 JavaScript 不同。
2021-03-19 17:15:42
虽然我基本同意您的说法,但我认为目标空白和“rel='external'”技巧确实有其一席之地,尤其是当您链接到 PDF 时。
2021-03-20 17:15:42
Jimmy,当您可以使用相对路径时,您这样做的理由是什么?
2021-04-05 17:15:42
在这里读到 J.Nielson 的名字让我想起bokardo.com/archives/comic-jakob-who ;-)
2021-04-07 17:15:42
rel="external" 很有趣——sitepoint.com/article/standards-compatible-world/3——尽管它看起来需要与 JavaScript 结合使用才能使其工作。不过,它确实允许您避免在 html 中使用不允许的 xhtml 属性“目标”。谢谢你提到它,迈克。rel="external" 值得一看。:-)
2021-04-11 17:15:42

使用jQuery:

 $('#link_other a').each(function(){
  $(this).attr('target', '_BLANK');
 });
更短的是: $('#link_other a').attr('target', '_blank'); 正如 artlung 发布的那样
2021-03-18 17:15:42
你不能这样做: $('#link_other a').attr('target', '_blank'); ?
2021-03-21 17:15:42

我将它用于每个外部链接:

window.onload = function(){
  var anchors = document.getElementsByTagName('a');
  for (var i=0; i<anchors.length; i++){
    if (anchors[i].hostname != window.location.hostname) {
        anchors[i].setAttribute('target', '_blank');
    }
  }
}
这对我来说非常有效,即使a链接具有指定的类。谢谢!
2021-04-10 17:15:42