Pourquoi le jQuery 3 ne peut-il pas identifier le caractère '#' dans un sélecteur d'attributs?

Je tentais simplement de passer mon application à jQuery 3. Je passais par des essais et tout fonctionnait comme prévu, jusqu'à ce que je vienne à une partie de ma application qui utilisait un symbole «#» dans un sélecteur. J'ai un jQuery qui ressemble à ceci:

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

En utilisant jQuery 3, j'ai une erreur:

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

Est-ce que quelqu'un sait pourquoi jQuery ne peut plus analyser les sélecteurs contenant ce symbole?

Notez que le changement a apparemment eu lieu à la version 2.0, en tant que version 2.1.3 élément renvoyé à l'aide du sélecteur

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

Jsfiddle https://jsfiddle.net/f8nej922/2/

Bien qu'ils n'aient pas été en mesure de localiser une référence spécifique ou une description du changement à jQuery 2.2 et 1.12 Documentation publiée .

Comme l'a noté @BoltClock, le changement est lié au sélecteur: Supprimez l'exception "#" pour les jetons d'identifiants .


Vous pouvez évaser # caractère avec \\ ; Valeur de devis au sélecteur d'attributs; Ou utilisez $.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') + ']'); 

Jsfiddle https://jsfiddle.net/f8nej922/4/

Par la documentation de jQuery , la valeur de l'attribut:

Peut être un identifiant valide ou une chaîne citée.

L'identifiant valide étant un identifiant css valide:

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

Dans CSS, les identificateurs (y compris les noms d'éléments, les classes et les ID dans les sélecteurs) ne peuvent contenir que les caractères [a-zA-Z0-9] et ISO 10646 caractères U + 00A0 et plus, plus le trait d'union (-) et le trait de soulignement ( _) ; Ils ne peuvent pas commencer par un chiffre, deux traits d'union ou un trait d'union suivi d'un chiffre. Les identificateurs peuvent également contenir des caractères échappés et tout caractère ISO 10646 comme code numérique (voir l'élément suivant). Par exemple, l'identifiant "B & W?" Peut être écrit comme "B \ & W \?" Ou "B \ 26 W \ 3F".

Comme vous désirez utiliser # , vous devez échapper ou citer la valeur:

  //Note the quotes v --------- v .find('.filterFeedItem[data-component-type="#somefilter"]');