如果一个链接的href属性包含特定短语,如何更改其目标属性?

5
我正在尝试使用.each()检查所有锚点标签,并将主页URL的目标设置为_self,将其他非主页URL的目标设置为_blank
到目前为止,我已经得到了以下代码:
$('a').each(function() {
    var homeURL = 'google.ca';    
    if ( $(this+'[href*='+homeURL+']')) {
        $(this).attr('target','_self');
    }else{
        $(this).attr('target','_blank');
    }  
});

这个也可以在jsBin上看到这里

由于某些原因,非主页的URL设置为target="_self"。有人能解释一下为什么吗?

3个回答

10
尝试使用这个替代方案:
if($(this).is("[href*=" + homeURL + "]")){
    $(this).attr('target','_self');
} else {
    $(this).attr('target','_blank');
}

is()函数会在所选元素匹配函数中的选择器时返回true,否则返回false。因此,如果当前链接的href attribute contains google.ca,它将更改其target属性为_self。否则,它将设置为_blank

事实上,为了提高效率,你应当缓存$(this)

var $this = $(this);
if($this.is("[href*=" + homeURL + "]")){
    $this.attr('target','_self');
} else {
    $this.attr('target','_blank');
}

1
谢谢!太好了,我开始喜欢这个网站了!我已经问了三个问题,今天是我开始发布问题的第一天,很快它们就得到了答案。这是一个非常棒的网站,里面有非常棒的人! - FoxKllD
@FoxKllD:没问题。这就是网站的目的!我喜欢在这里帮助我的同行程序员。 :) 我想指出的是,如果我的答案对你解决了问题,那么把它标记为“接受答案”以供将来的访问者参考是一个好的做法。 - Purag
我试图每分钟标记一次,第五次终于可以标记你的答案了!哈哈,我想我的问题在于我不知道问题所在。 - FoxKllD
我们所做的就是将 $(this) 存储在名为 $this 的变量中。这样可以让我们只使用一次 $(this)。由于它是一个昂贵的选择器(它相当慢,如果使用过多会明显降低页面速度),最好尽可能少地使用它。 - Purag

7
var homeURL = 'google.ca';
$('a').each(function() {        
    $(this).attr('target', (this.href.match( homeURL )) ? '_self' :'_blank');       
});

谢谢你!你向我展示了另一种实现我想要的功能的方法。我非常感激。 - FoxKllD
非常好,优雅的解决方案。 - Matthew Blancarte

2
您也可以通过以下方式实现此目的:
$(document).ready(function() {
  $("a[href^='http']").attr('target','_blank');
});

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接