2012-08-09 15 views
9

Tengo el siguiente selector de jQuery:jQuery selector de atributo: [x = y] o [x = z]

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

¿Es posible cambiar esto para que no necesito para especificar a[href^= dos veces?

Por ejemplo, algo como:

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

EDIT: Mi ejemplo de http y https no debe tomarse literalmente. Podría estar buscando valores comenzando con y y z en su lugar.

+2

Tal vez http://stackoverflow.com/questions/190253/jquery-selector-regular-expressions es la respuesta. – Barmar

Respuesta

2

Muy simple, si usted está dispuesto a utilizar una segunda llamada a la función:

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

O con fichas:

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 una expresión personalizada:

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

Qué se usaría como:

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

"¿Es posible cambiar esto para no tener que especificar' a [href^= 'dos veces?" No creo que hayas leído la pregunta con suficiente atención –

+0

@ngmiceli Con toda justicia esto solo especificaría '[href^=' dos veces, pero sería bueno si hubiera una forma de hacerlo sin especificar nada dos veces. +1, la mejor respuesta hasta ahora. – Curt

0

violín: http://jsfiddle.net/X8CYQ/


usted debería ser capaz de usar algo como esto:

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

continuación, utilizar el selector de la siguiente manera:

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

Lea la parte de edición de mi pregunta. http://stackoverflow.com/q/11887602/370103 – Curt

+0

Entonces usted podría reemplazar '/^https?: \/\ // i' con otra expresión regular, como'/^ (x | y | z)/i' – h2ooooooo

0

Se puede hacer simplemente

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

A medida que el href^= sólo significa "comienza con" a menos que tenga una necesidad de ser seguro :// está incluido también.

He aquí un ejemplo con otros atributos y valores:

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

+0

Ver la parte de edición de mi pregunta http://stackoverflow.com/q/11887602/370103 – Curt

+3

no funcionará para 'How 404 works' –

0

No se puede hacer esto en jQuery por defecto .. no tiene ningún tipo de "o" condición para selectores (a excepción de la coma, más o menos, que es lo que quieres evitar).

Se puede crear un filtro personalizado si desea:

http://jsfiddle.net/yJZDg/

Esto es muy exagerado a menos que tiene que hacer este tipo de cosas mucho. El ejemplo también solo funcionará para una coincidencia exacta. Tendría que modificar para un "comienza con" o algún otro tipo de coincidencia, pero la idea está allí.

Cuestiones relacionadas