为什么jQuery 3不能识别属性选择器中的'#'字符?

Rob*_*ert 4 html javascript jquery dom jquery-selectors

我只是尝试将我的应用程序切换到jQuery 3.我正在进行一些测试,一切都按预期工作,直到我找到一个在选择器中使用"#"符号的应用程序.我有一个看起来像这样的jQuery:

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

使用jQuery 3我收到一个错误:

jquery-3.0.0.js:1529 Uncaught Error: Syntax error, 
unrecognized expression: .filterFeedItem[data-component-type=#somefilter]
Run Code Online (Sandbox Code Playgroud)

有谁知道为什么jQuery不能解析包含这个符号的选择器?

gue*_*314 7

请注意,更改显然发生在2.0版本,因为版本2.1.3使用选择器返回元素

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

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

虽然未能在jQuery 2.2和1.12发布的文档中找到特定的变更或变更描述.

正如指出的通过@BoltClock,变化与选择器:用于标识令牌删除"#"的异常.


你可以用esacape #字符\\; 属性选择器的引用值; 或使用$.escapeSelector()

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

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

  • @Robert:这里使用$ .escapeSelector是不正确的 - 你最终会转义*whole*选择器字符串,而不仅仅是属性值.当您事先不知道属性值时,通常只使用$ .escapeSelector,例如,如果它来自用户输入. (2认同)
  • @ guest271314:`$ .escapeSelector('.filterFeedItem [data-component-type =#somefilter]')`转义整个事物,产生`\ .filterFeedItem\[data-component-type\= \#somefilter \]` .你应该只使用它来转义属性值.所以,是的,你需要连接. (2认同)