javascript - ejemplos - Error de sintaxis de Jquery, expresión no reconocida:
jquery selector (3)
Si entendí tu pregunta, tienes una identificación que contiene caracteres especiales. Básicamente necesitas escapar de ellos para que sean tratados como caracteres literales en lugar de selectores de consulta:
Para usar cualquiera de los meta-caracteres (como! "# $% & ''() * +,. / :; <=>? @ [] ^` {|} ~) Como parte literal de un nombre, debe escaparse con dos barras invertidas: /. Por ejemplo, un elemento con id = "foo.bar", puede usar el selector $ ("# foo / .bar").
... y en este caso, también necesita un nivel de escape adicional para el delimitador de cadena "
. Es una locura, pero esto funciona:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head><title></title>
<script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1/jquery.min.js"></script>
<script type="text/javascript"><!--
jQuery(function($){
console.log( $("#" + "//'//'//'//'//'//'///"///"///"///"//'//'//'//'//'//'//'//'//'//'//'//'//'///"//#//#//#//#//#//$//'//'//'//'//'").length );
});
//--></script>
</head>
<body>
<div id="''''''''''''""""''''''''''''''''''''''''''"#####$''''''''''">Foo</div>
</body>
</html>
Edición: Por supuesto, la respuesta de Dystroy, que es el motor de selección de jQuery y usa getElementByID()
, es mucho más práctica. El manual de jQuery enlaza una interesante entrada de blog que cubre esta y otras técnicas relacionadas:
document.getElementById () y funciones similares como document.getElementsByClassName () solo pueden usar el valor de atributo sin escapar, de la forma en que se usa en el HTML. Por supuesto, tendría que escapar de cualquier cita para que aún termine con una cadena de JavaScript válida.
¿Por qué recibo este error y cómo puedo probarlo para que no se rompa? Intenté verificar que no existía, pero obviamente no funciona, gracias
Por favor, no aconseje no escribir la identificación de esta manera porque sé que está mal, pero es una posibilidad.
var jsonTest = [
{
"myId": "''''''''''''/"/"/"/"''''''''''''''''''''''''''/"#####$''''''''''",
}
];
alert(jsonTest[0].myId);
// Works - alerts the myId
$(''#'' + jsonTest[0].myId ).length;
// Error: Syntax error, unrecognized expression:
// #''''''''''''""""''''''''''''''''''''''''''"#####$''''''''''
W3C ha definido una nueva función para esto: CSS.escape()
. En su código de ejemplo, se vería así:
var jsonTest = [
{
"myId": "''''''''''''/"/"/"/"''''''''''''''''''''''''''/"#####$''''''''''",
}
];
$(''#'' + CSS.escape(jsonTest[0].myId)).length; // Works
Los navegadores aún no lo admiten, pero hay una biblioteca de relleno múltiple que puede usar mientras tanto: https://github.com/mathiasbynens/CSS.escape
Lo he usado con éxito en mi proyecto.
jQuery''s usa este código para detectar un selector basado en id:
characterEncoding = "(?:////.|[//w-]|[^//x00-//xa0])+"
...
"ID": new RegExp( "^#(" + characterEncoding + ")" ),
Este regex falla para "''''''''''''/"/"/"/"''''''''''''''''''''''''''/"#####$''''''''''"
o más simplemente para "''"
.
El motor de consulta es limitado, lo que no es muy sorprendente para un lenguaje tan conciso y reglas de validez de identificación tan relajadas. no puede manejar ninguna identificación válida.
Si realmente necesita poder manejar cualquier tipo de identificación válida, use
$(document.getElementById(jsonTest[0].myId))
De hecho, nunca debe usar $(''#''+id)
ya que simplemente agrega una capa de análisis inútil (y un poco peligrosa) para la misma operación.