2012-08-31 32 views
6

estoy usando un selector de jQuery para comprobar los caracteres en href:selector de jQuery contiene signo igual

var param = "something"; 
$("a[href*="+param+"]").css("color", "red"); 

Esto funciona bien hasta que "algo" contiene un signo =. Por ejemplo:

var param = "xkey=123"; 
$("a[href*="+param+"]").css("color", "red"); 

luego no obtengo ningún resultado. Alguien sabe una solución?

Respuesta

6

Necesita escapar del carácter = ya que tiene un significado especial cuando se usa en jQuery selector. Aquí está la lista completa de todos los personajes que necesitan ser escapado:

#;&,.+*~':"!^$[]()=>|/ 

Por lo tanto, se puede utilizar el siguiente para escapar de la param:

param.replace(/([ #;&,.+*~\':"!^$[\]()=>|\/@])/g,'\\$1') 

Desde el jQuery documentation:

Si desea utilizar cualquiera de los metacaracteres (como ! "# $% & '() * +,./:; < =>? @ [] ^` {|} ~) Como parte literal de un nombre, debe escapar del personaje con dos barras diagonales inversas: \.

Aquí hay una DEMO.

+0

¡Eso también funciona! Gracias –

3

citar el parámetro:

$("a[href*='"+param+"']") 

Y si eso no es suficiente (param pueden contener apóstrofes) y luego escapar de ellos:

$("a[href*='"+param.replace(/'/g,"\\'")+"']") 
+0

+1 por la solución más simple que sospecho maneja todo lo que param puede tener. –

+0

Excelente: exactamente lo que necesitaba. Gracias –

0

Se comporta de esa manera becuase, al final se traducirá al selector ambiguo es decir $("a[href*=xkey=123]") que de hecho no es válido.

Escapar el signo de igualdad con \\ delante y envolver la parte del parámetro con una cita

var param = "xkey\\=123"; 
$("a[href*='"+param+"']").css("color", "red"); 
+0

En este caso simple, uno u otro (citando el parámetro o escapando '=') debería funcionar. –

+0

Sí, no es necesario analizar el 'param' para todos los símbolos. Es un caso simple y debe mantenerse lo más simple posible. – Starx

+0

Al agregar las comillas, se solucionó el problema sin analizar, pero gracias por la sugerencia –

0

puede validar esta manera:

espero que se adapte a la causa :)

foo - es la cuerda;

if (! /^[a-zA-Z0-9]+$/.test(foo)) { 
    // Validation failed 
} 

O

escapar de ella como esta comprobación:

if(your_string.indexOf('=') != -1){ 
    alert("equal found."); 
} 

entonces reemplazar = con \\=

2

tiene que escapar del = con \\=.

param = param.replace(/=/g, '\\\\='); 

Pero hay otros caracteres especiales que también necesita para escapar en el selector jQuery.

function escape(param) { 
    return param.replace(/([ #;&,.+*~\':"!^$[\]()=>|\/@])/g,'\\\\$1'); 
} 

También podría utilizar el método .filter.

$('a').filter(function() { 
    return $(this).attr('href').indexOf(param) !== -1; 
})