9

我有以下 jQuery 选择器:

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

是否可以更改此设置,以便我不需要指定a[href^=两次?

例如,类似:

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

编辑:我的例子httpandhttps不应该从字面上理解。我可能正在寻找以yand开头的值z

4

4 回答 4

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://)')
于 2012-08-09T16:23:37.330 回答
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");
});​
于 2012-08-09T16:28:19.060 回答
0

你可以简单地做

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

因为href^=just 意味着“开始于”,除非您需要确保://也包含在内。

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

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

于 2012-08-09T16:28:36.853 回答
0

默认情况下,您不能在 jQuery 中执行此操作.. 它没有任何类型的选择器“或”条件(除了逗号,排序,这是您想要避免的)。

如果您愿意,可以创建自定义过滤器:

http://jsfiddle.net/yJZDg/

除非您需要经常做这种事情,否则这是非常过分。该示例也仅适用于完全匹配。您必须调整“开始于”或其他类型的匹配,但想法就在那里。

于 2012-08-09T16:35:39.000 回答