2016-07-16 3 views
3

Ich habe gerade versucht, meine Anwendung auf jQuery 3 umzustellen. Ich habe einige Tests durchgeführt und alles funktionierte wie erwartet, bis ich zu einem Teil meiner Anwendung kam, der ein '#' - Symbol in einem Selektor verwendete. Ich habe ein Stück von jQuery, die wie folgt aussieht:Warum kann jQuery 3 das '#' - Zeichen in einem Attributselektor nicht identifizieren?

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

Mit jQuery 3 Ich erhalte eine Fehlermeldung:

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

Weiß jemand, warum jQuery nicht mehr Selektoren analysieren dieses Symbol enthält?

+1

Versuchen '# somefilter' mit Zitaten Einwickeln –

Antwort

6

Hinweis, die Änderung wurde offensichtlich bei der Version 2.0 als Version 2.1.3 Elemente Selektor zurück

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

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

Obwohl nicht in der Lage spezifische Bezugnahme auf oder in der Beschreibung zu finden, von Änderung bei jQuery 2.2 and 1.12 Released Dokumentation.

Wie noted von @BoltClock, Änderung bezieht sich auf .


Sie # Charakter mit \\ esacape kann; Zitatwert bei Attributselektor; oder verwenden $.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/

+0

Ich habe das als richtig markiert - solide Antwort und danke für die Geige. Hatte $ .escapeSelector vorher noch nicht benutzt. Ich entschied mich für eine Lösung, die das # -Zeichen nicht benötigte. Es ist wahrscheinlich eine schlechte Übung im Allgemeinen - ich habe nur nach Hashtags gefiltert, also war das für die Situation sinnvoll. Vielen Dank! – Robert

+1

"Nicht sicher, ob die Änderung im Zusammenhang mit Selector steht: Entfernen Sie '#' Ausnahme für Bezeichner Token?" Sicher ist es - es ist in den Release Notes verlinkt. Aber das Update selbst ist in [Sizzles Codebase] (https://github.com/jquery/sizzle/commit/f204a6112216f31685717d9fc1bf6cabf42b2ef1) - die Versionshinweise verlinken auf den Changeset in jQuerys Hauptrepo, der die Testsuite enthält, nicht Sizzle selbst. – BoltClock

+0

@BoltClock Vorgeschlagene Änderung? Oder bearbeiten Sie die Antwort, um den richtigen Weg zu notierten Dokumentationen und Codeänderungen zu finden. – guest271314

3

von jQuery's documentation, der Attributwert:

Can be either a valid identifier or a quoted string.

Der gültige Kennung ist jede gültige CSS-Kennung:

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

In CSS, identifiers (including element names, classes, and IDs in selectors) can contain only the characters [a-zA-Z0-9] and ISO 10646 characters U+00A0 and higher, plus the hyphen (-) and the underscore (_); they cannot start with a digit, two hyphens, or a hyphen followed by a digit. Identifiers can also contain escaped characters and any ISO 10646 character as a numeric code (see next item). For instance, the identifier "B&W?" may be written as "B\&W\?" or "B\26 W\3F".

Da Sie wollen # verwenden, müssen Sie den Wert entkommen oder zu zitieren:

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

Solide Antwort Patrick, ich gab es Gast271314 wegen der Geige. Vielen Dank! – Robert

+0

Dies erklärt nicht, warum jQuery den Selektor für die letzten 10 Jahre als gültig behandelt hat. – BoltClock

Verwandte Themen