Почему jQuery 3 не может идентифицировать символ «#» в селекторе атрибутов?

Я просто попытался переключить свое приложение на jQuery 3. Я проходил некоторое тестирование, и все работало, как ожидалось, пока я не пришел к части моего приложения, которая использовала символ «#» в селекторе. У меня есть кусок JQuery, который выглядит следующим образом:

var $existingFilter = $container.find('.filterFeedItem[data-component-type=#somefilter]');

Используя jQuery 3 я получаю ошибку:

jquery-3.0.0.js:1529 Uncaught Error: Syntax error, 
unrecognized expression: .filterFeedItem[data-component-type=#somefilter]

Кто-нибудь знает, почему jQuery больше не может анализировать селекторы, содержащие этот символ?

 Washington Guedes16 июл. 2016 г., 23:49
Попробуйте обёртывание#somefilter с цитатами

Ответы на вопрос(2)

документация jQuery, значение атрибута:

Может быть допустимым идентификатором или строкой в ​​кавычках.

Действительным идентификатором является любой действительный идентификатор CSS:

https://www.w3.org/TR/CSS21/syndata.html#value-def-identifier

В CSS идентификаторы (включая имена элементов, классы и идентификаторы в селекторах)может содержать только символы [a-zA-Z0-9] и ISO 10646 символы U + 00A0 и выше, плюс дефис (-) и подчеркивание (_); они не могут начинаться с цифры, двух дефисов или дефиса, за которым следует цифра. Идентификаторы также могут содержать экранированные символы и любые символы ISO 10646 в виде числового кода (см. Следующий пункт). Например, идентификатор "B & W?" может быть написано как "B \ & W \?" или "B \ 26 W \ 3F".

Так как вы хотите использовать#, вам нужно экранировать или указать значение:

                         //Note the quotes v --------- v
.find('.filterFeedItem[data-component-type="#somefilter"]');
 Robert17 июл. 2016 г., 01:16
Солидный ответ Патрик, я передал его guest271314 из-за скрипки. Спасибо!
 BoltClock01 февр. 2017 г., 08:04
Это не объясняет, почему jQuery рассматривал селектор как действительный в течение последних 10 лет.
Решение Вопроса

что изменение, очевидно, имело место в версии 2.0, так как версия 2.1.3 вернула элемент с помощью селектора

var $existingFilter1 = $container.find('.filterFeedItem[data-component-type=#somefilter]');

jsfiddlehttps://jsfiddle.net/f8nej922/2/

Хотя не удалось найти конкретную ссылку или описание изменений наВыпущены jQuery 2.2 и 1.12 документация.

Какотметил @BoltClock, изменение связано сСелектор: Удалить исключение "#" для идентификаторов токенов.

Вы можете esacape# персонаж с\\; значение кавычки в селекторе атрибута; или использовать$.escapeSelector()

var $existingFilter = $container
                      .find('.filterFeedItem[data-component-type=\\#somefilter]');
var $existingFilter = $container
                      .find('.filterFeedItem[data-component-type="#somefilter"]');
var $existingFilter = $container
                      .find('.filterFeedItem[data-component-type=' 
                       + $.escapeSelector('#somefilter') + ']');

jsfiddlehttps://jsfiddle.net/f8nej922/4/

 guest27131401 февр. 2017 г., 08:23
@BoltClock Да, включены три возможных варианта ответа, которые должны возвращать тот же результат.
 BoltClock01 февр. 2017 г., 08:07
@ Роберт: использование $ .escapeSelector здесь некорректно - вы в конечном итоге избегаетевсе строка выбора, а не только значение атрибута. Как правило, вы используете $ .escapeSelector только в том случае, если заранее не знаете значения атрибута, например, если это исходит от ввода пользователя.
 guest27131401 февр. 2017 г., 08:09
@BoltClock Что неправильно в использовании$.escapeSelector()? Вы предлагаете объединить$.escapeSelector() только в атрибутной части селектора?
 BoltClock01 февр. 2017 г., 08:09
@ Guest271314:$.escapeSelector('.filterFeedItem[data-component-type=#somefilter]') избегает всего этого, в результате чего\.filterFeedItem\[data-component-type\=\#somefilter\], Вы должны использовать его только для того, чтобы избежать значения атрибута. Так что да, вам нужно согласиться.
 Robert17 июл. 2016 г., 01:17
Я пометил это как правильный - твердый ответ и спасибо за скрипку. На самом деле раньше не использовал $ .escapeSelector. Я остановился на решении, которое не требует символа «#». Это, вероятно, плохая практика в целом - я просто фильтровал по хештегам, так что это имело смысл для ситуации. Спасибо!
 guest27131401 февр. 2017 г., 08:05
@BoltClock Предложили редактировать? Или отредактируйте Ответ, чтобы отразить правильный маршрут к указанной документации и изменениям кода.
 BoltClock01 февр. 2017 г., 08:19
Продолжая мой предыдущий комментарий: «Так что да, вам нужно будет согласиться - в этом случае вы могли бы просто указать значение атрибута в части селектора и покончить с этим».
 BoltClock01 февр. 2017 г., 08:02
Msgstr "Не уверен, связано ли изменение с селектором: удалить исключение '#' для токенов идентификаторов?" Конечно, это связано с примечаниями к выпуску. Но само исправление вКодовая база Sizzle - в примечаниях к выпуску содержится ссылка на набор изменений в главном репозитории jQuery, который содержит набор тестов, а не сам Sizzle.

Ваш ответ на вопрос