2010-07-26 7 views
5

De acuerdo con los documentos de jQuery, necesito escapar de los metacaracteres que aparecen en mis cadenas de selector, cuando se producen como un literal. Sin embargo, no pude encontrar muchos ejemplos específicos de cuándo y cuándo no escapar de los selectores. Entonces, cuándo y cuándo no necesito escapar de los metacaracteres, cuando se interpretarán como literales, en:¿Cuándo debo escaparme de los Metacharectars? (Selectores de jQuery)

¿Selectores de atributos? es decir,

$("[attr=value]") 

Id selectores? es decir,

$("#id") 

Selectores de clase? es decir

$(".class"); 

Y, ¿hay una manera de escribir una función que reemplaza metachars en las cadenas de selectores, al tiempo que se preserva el carácter que comienza? es decir:

// replace all meta chars, preserving the id selection? 
$("#id.rest$of*string") 

// replace all meta chars, preserving the attribute selection? 
// going back to my previous question, do I even need to escape the metachars in this situation? 
$("[attr=blah.dee#foo*yay]") 

La razón por la que hago esta pregunta, es porque estoy trabajando con un sitio web que pasa a tener algunos selectores realmente desagradables. Y no tengo control sobre el sitio web, así que no puedo cambiar los selectores para que sea más agradable trabajar con ellos.

GRACIAS!

Respuesta

3

De la documentación de jQuery:

Si desea utilizar cualquiera de los meta-caracteres (#; &, + * ~ ': "^ $ => | /.!) como un literal parte de un nombre, que debe escapar del personaje con dos barras invertidas ...

Todo esto debe ser escapado:

  1. Identificación
  2. nombre de la clase
  3. nombre del atributo
  4. valor del atributo
  5. nombre del elemento

Los cuatro primeros son evidentes, y aquí es un ejemplo para el quinto. Los nombres de elementos en XML pueden contener un "." personaje por ejemplo y todavía ser valid.

<user.name>John Doe</user.name> 

Si tuviera que seleccionar todos los elementos de user.name, a continuación, que . debe ser escapado

$(xml).find("user\\.name"); 
0

En lugar de robar descaradamente respuesta de otra persona, te voy a apuntar a la misma: jQuery selector value escaping, donde jQuery el método de análisis del selector se describe en detalle.

La respuesta breve: puede tener problemas ya que el analizador de selector de jQuery no es 100% estándar. Según la sugerencia en la respuesta vinculada, puede solucionarlo llamando a los métodos DOM habituales (document.getElementById()), que funcionarán con selectores divertidos, y luego pasará el elemento DOM sin procesar al selector de jQuery.

$(document.getElementById("id.rest$of*string"));