JQuery Синтаксическая ошибка, непризнанное выражение:

17

Почему я получаю эту ошибку и как я могу ее протестировать, поэтому она не будет ломаться, я попытался проверить значение null, но, очевидно, это не сработает, спасибо.

Пожалуйста, не советуйте не писать идентификатор, как это, потому что я знаю его неправильно, но это возможно.

var jsonTest = [
  {
    "myId": "''''''\"\"\"\"'''''''''''''\"#####$'''''",
  }
];

alert(jsonTest[0].myId); 
// Works - alerts the myId

$('#' + jsonTest[0].myId ).length; 
// Error: Syntax error, unrecognized expression:
// #''''''""""'''''''''''''"#####$'''''
    
задан Hello-World 11.03.2013 в 13:36
источник

3 ответа

33

jQuery использует этот код для обнаружения селектора, основанного на идентификаторе:

characterEncoding = "(?:\\.|[\w-]|[^\x00-\xa0])+"
...
"ID": new RegExp( "^#(" + characterEncoding + ")" ),

Это регулярное выражение не выполняется для "''''''\"\"\"\"'''''''''''''\"#####$'''''" или более просто для "'" .

Механизм запросов ограничен, что неудивительно для столь сжатого языка и правил достоверности идентификационных данных, что так слабо. он не может обрабатывать какой-либо действительный идентификатор.

Если вам действительно нужно иметь возможность обрабатывать любой допустимый идентификатор, используйте

$(document.getElementById(jsonTest[0].myId))

Фактически, вы никогда не должны использовать $('#'+id) , поскольку он просто добавляет бесполезный (и немного опасный) уровень анализа для той же операции.

    
ответ дан Denys Séguret 11.03.2013 в 13:39
источник
8

Если я понял ваш вопрос, у вас есть идентификатор, содержащий специальные символы. Вы в основном должны избегать их , поэтому их обрабатывают как буквенные символы, а не селектора запросов:

  

Чтобы использовать любой из метасимволов (например,   ! "# $% & amp; '() * +,. /:; & lt; = & gt;? @ [] ^' {|} ~) как буквальная часть имени, она должна   сбежать с двумя обратными косыми чертами: \. Например, элемент с   id="foo.bar", можно использовать селектор $ ("# foo \ .bar").

... и в этом случае вам также потребуется дополнительный уровень экранирования для разделителя строк, " . Это безумие, но это работает:

<!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="''''''&quot;&quot;&quot;&quot;'''''''''''''&quot;#####$'''''">Foo</div>

</body>
</html>

Изменить: Конечно, ответ dystroy -отличный механизм выбора jQuery и использование getElementByID() - это более практично. jQuery manual связывает интересную запись в блоге , которая охватывает эту и другие связанные с ней методы:

  

document.getElementById () и аналогичные функции, такие как   document.getElementsByClassName () может использовать атрибут unescaped   значение, как оно используется в HTML. Конечно, вам придется   избегайте каких-либо кавычек, чтобы у вас все еще был действительный JavaScript   строка.

    
ответ дан Álvaro González 11.03.2013 в 14:07
источник
1

W3C определил для этого новую функцию: CSS.escape() . В вашем примере кода это будет выглядеть так:

var jsonTest = [
  {
    "myId": "''''''\"\"\"\"'''''''''''''\"#####$'''''",
  }
];

$('#' + CSS.escape(jsonTest[0].myId)).length; // Works 

Браузеры еще не поддерживают его, но есть библиотека полиполков, которую вы можете использовать в среднем: Ссылка

Я использовал его с успехом в моем проекте.

    
ответ дан Stan James 30.09.2015 в 19:54
источник