Подтвердить что ты не робот

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

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

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

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

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

$('#' + jsonTest[0].myId ).length; 
// Error: Syntax error, unrecognized expression:
// #''''''""""'''''''''''''"#####$'''''
4b9b3361

Ответ 1

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

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

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

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

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

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

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

Ответ 2

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

Чтобы использовать любой из метасимволов (например,! "# $% & '() * +,./:; <= > ? @[] ^` {|} ~) как буквальная часть имени, она должна сбежать с двумя обратными косыми чертами: \. Например, элемент с 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 -omit jQuery engine и использование getElementByID() - это более практично. jQuery manual связывает интересную запись в блоге, которая охватывает эту и другие связанные с ней методы:

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

Ответ 3

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

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

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

Браузеры еще не поддерживают его, но есть библиотека polyfill, которую вы можете использовать в среднем: https://github.com/mathiasbynens/CSS.escape

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