2012-08-09 2 views
9

Ich habe folgende jQuery-Selektor:jQuery Attributselektor: [x = y] oder [x = z]

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

Ist es möglich, dies zu ändern, so dass ich brauche, um a[href^= zweimal nicht angeben?

Zum Beispiel so etwas wie:

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

EDIT: Mein Beispiel http und https sollte nicht wörtlich genommen werden. Ich könnte stattdessen nach Werten suchen, die mit y und z beginnen.

+2

Vielleicht http://stackoverflow.com/questions/190253/jquery-selector-regular-expressions ist die Antwort. – Barmar

Antwort

2

Ganz einfach, wenn Sie bereit sind, eine zweite Funktionsaufruf zu verwenden:

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

Oder mit Token:

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; 
}); 

oder mit einem benutzerdefinierten Ausdruck:

$.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; 
}; 

Welche würde verwendet werden als:

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

"Ist es möglich, dies zu ändern, so dass ich' a [href^= 'zweimal nicht angeben muss?" Ich glaube nicht, dass Sie die Frage sorgfältig genug gelesen haben. –

+0

@ngmiceli In aller Fairness würde dies nur "[href^=' zweimal spezifizieren, aber es wäre gut, wenn es eine Möglichkeit gäbe, dies ohne zweimaliges Spezifizieren zu tun. +1, beste Antwort bisher. – Curt

0

Fiddle: http://jsfiddle.net/X8CYQ/


Sie sollten so etwas wie diese in der Lage sein zu verwenden:

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

Dann nutzen Sie die Wähler wie folgt aus:

$("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

Lesen Sie den Bearbeitungsteil meiner Frage. http://StackOverflow.com/q/11887602/370103 – Curt

+0

Dann wäre es möglich, '/^https?: \/\ // i' mit einem anderen Regex, wie zum Beispiel'/^ (x | y | z)/i' – h2ooooooo

0

können Sie einfach tun

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

Als href^= bedeutet nur, "beginnt mit" es sei denn, Sie haben ein Bedürfnis zu sein sicher ist :// auch enthalten. Hier

ist ein Beispiel mit anderen Attributen und Werten:

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

+0

Siehe den Bearbeitungsteil meiner Frage http://stackoverflow.com/q/11887602/370103 – Curt

+3

funktioniert nicht für 'How 404 works' –

0

Sie nicht diese in jQuery standardmäßig tun können .. es hat keine Art „oder“ Bedingung für Selektoren (bis auf das Komma, sozusagen, was du vermeiden willst.

Sie können einen benutzerdefinierten Filter erstellen, wenn man wollte:

http://jsfiddle.net/yJZDg/

Dies ist sehr übertrieben, wenn Sie diese Art der Sache viel tun müssen. Das Beispiel funktioniert auch nur für eine exakte Übereinstimmung. Sie müssten für eine "beginnt mit" oder eine andere Art von Match zwicken, aber die Idee ist da.