2012-08-09 2 views
9

Ho il seguente selettore jQuery:jQuery selettore di attributo: [x = y] o [x = z]

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

E 'possibile cambiare questo in modo che non ho bisogno di specificare a[href^= due volte?

Per esempio, qualcosa come:

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

EDIT: Il mio esempio di http e https non deve essere preso alla lettera. Potrei cercare valori a partire da y e z.

+2

Forse http://stackoverflow.com/questions/190253/jquery-selector-regular-expressions è la risposta. – Barmar

risposta

2

Abbastanza semplice, se siete disposti ad utilizzare una seconda chiamata di funzione:

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

O con gettoni:

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

O con un'espressione personalizzata:

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

Quale sarebbe utilizzato come:

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

"È possibile modificare questo in modo che non sia necessario specificare' a [href^= 'due volte?" Non penso che tu abbia letto abbastanza attentamente la domanda –

+0

@ngmiceli In tutta onestà, questo sarebbe solo specificare '[href^=' due volte, ma sarebbe bello se ci fosse un modo per farlo senza specificare due volte qualcosa. +1, la migliore risposta finora. – Curt

0

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


si dovrebbe essere in grado di utilizzare qualcosa di simile:

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

quindi utilizzare il selettore di come questo:

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

Leggi la parte di modifica della mia domanda. http://stackoverflow.com/q/11887602/370103 – Curt

+0

Quindi saresti in grado di sostituire '/^https?: \/\ // i' con un'altra regex, come'/^ (x | y | z)/i' – h2ooooooo

0

Si può semplicemente fare

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

Come il href^= significa solo "inizia con" se non si ha la necessità di essere sure :// è incluso pure.

Ecco un esempio con altri attributi e valori:

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

+0

Vedere la parte di modifica della mia domanda http://stackoverflow.com/q/11887602/370103 – Curt

+3

non funziona per 'How 404 works' –

0

Non si può fare questo in jQuery per difetto .. non ha alcun tipo di "o" condizione per selettori (fatta eccezione per la virgola, sorta di, che è ciò che si desidera evitare).

è possibile creare un filtro personalizzato se si voleva:

http://jsfiddle.net/yJZDg/

Questo è molto eccessivo a meno che non avete bisogno di fare questo genere di cose molto. L'esempio funzionerà anche solo per una corrispondenza esatta. Dovresti modificare un "inizia con" o qualche altro tipo di abbinamento, ma l'idea è lì.