2012-08-09 65 views
9

我有以下jQuery选择:jQuery的属性选择:X = Y]或[X = Z]

$("a[href^='http://'],a[href^='https://']"); 

是否有可能改变这种做法,我并不需要指定a[href^=两次?

例如,像:

$("a[href^='http://'||'https://']"); 

编辑:我的httphttps例如不应从字面上理解。我可能会寻找以yz开头的值。

+2

也许http://stackoverflow.com/questions/190253/jquery-selector-regular-expressions是答案。 – Barmar 2012-08-09 16:27:15

回答

2

,如果你愿意使用第二个函数调用非常简单:

$('a').filter('[href^="http://"],[href^="https://"]'); 

或者与令牌:

var startsWith = ['http://', 'https://']; 
$('a').filter(function() { 
    var i; 
    for (i = 0; i < startsWith.length; i++) { 
     if ($(this).is('[href^="' + startsWith[i] + '"]')) { 
      return true; 
     } 
    } 
    return false; 
}); 

或用自定义表达式:

$.expr[':']​​​​​​.hrefStartsWith = function (ele, i, info) { 
    var tokens; 
    tokens = info[3].split(','); 
    for (i = 0; i < tokens.length; i++) { 
     if ($(ele).is('[href^="' + tokens[i] + '"]')) { 
      return true; 
     } 
    } 
    return false; 
}; 

哪将用作:

$('a:hrefStartsWith(http://,https://)') 
+1

“是否可以改变这个,以便我不需要指定'[href^='两次?我认为你没有仔细阅读这个问题 – 2012-08-09 16:27:20

+0

@ngmiceli平心而论,这只会指定'[href^='两次,但是如果有一种方法可以做到这一点,而不需要指定任何两次。 +1,迄今为止的最佳答案。 – Curt 2012-08-09 16:28:26

0

小提琴http://jsfiddle.net/X8CYQ/


你应该能够使用这样的事情:

$.expr[':'].exturl = function(obj) { 
    return (/^https?:\/\//i).test($(obj).attr("href")); 
} 

然后使用这样的选择:

$("a:exturl") 

HTML

<a href="http://www.google.com">External link #1</a><br /> 
<a href="ftp://www.donotinclude.dk">No match link #1</a><br /> 
<a href="?nope">No match link #2</a><br /> 
<a href="https://www.google.dk">External link #2</a><br /> 
<a href="http://www.google.se">External link #3</a><br /> 
<a href="ssh://whywouldyouevendothis">No match link #3</a><br /> 
<a href="https://www.google.co.uk">External link #4</a><br /> 
<a href="http://www.facebook.com">External link #5</a><br /> 
<a href="/index.html">No match link #4</a><br /> 
<a href="https://www.facebook.com">External link #6</a><br />​ 

JS

$.expr[':'].exturl = function(obj) { 
    return (/^https?:\/\//i).test($(obj).attr("href")); 
} 
$(document).ready(function() { 
    $("a:exturl").css("color", "red"); 
});​ 
+0

阅读我的问题的编辑部分。 http://stackoverflow.com/q/11887602/370103 – Curt 2012-08-09 16:30:55

+0

然后你就可以用另一个正则表达式替换'/^https?:\/\ // i',比如'/ ^(x | y | z )/ i' – h2ooooooo 2012-08-09 16:32:14

0

你可以简单地做

$("a[href^='http']") 

由于href^=仅仅表示 “开头” 除非你有一个需要被当然也包括://

这是与其他属性和值的示例:

http://jsbin.com/owehow/2/edit

+0

请参阅我的问题的编辑部分http://stackoverflow.com/q/11887602/370103 – Curt 2012-08-09 16:29:08

+3

将不适用于'How 404 works' – 2012-08-09 16:30:41

0

你不能在默认情况下做到这一点jQuery的..它没有任何形式的“或”条件选择(除了逗号之外,这是你想要避免的)。

,如果你想你可以创建一个自定义过滤器:

http://jsfiddle.net/yJZDg/

这是非常矫枉过正,除非你需要做这种事情很多。该示例也只适用于完全匹配。你将不得不调整一个“开始”或其他类型的比赛,但这个想法就在那里。

相关问题