jquery:[]选择器?

Šim*_*das 7 html javascript jquery

给定一个SELECT元素:

<select>
    <option>foo</option>
    <option>bar</option>
    <option>baz</option>
</select>
Run Code Online (Sandbox Code Playgroud)

我想选择值为"bar"的OPTION元素.

这不起作用:

$('option[text="bar"]').attr('selected', true);
Run Code Online (Sandbox Code Playgroud)

但是,这确实有效:

$('option:[text="bar"]').attr('selected', true);
Run Code Online (Sandbox Code Playgroud)

为什么?

现场演示:http://jsfiddle.net/YbfqZ/2/

use*_*716 8

这种行为的原因是你的冒号打破了选择器querySelectorAll因为它无效.

因此,它默认为Sizzle,它可以容忍冒号,即使它在技术上不受支持(这意味着它可能会在未来中断).Sizzle将检查属性和属性.因此,它不会找到text属性,但会找到元素的text属性<option>.

这是一个示例,演示Sizzle将匹配属性而不仅仅是与其attribute-equals选择器的属性匹配.


代码示例:

  // set a custom property on the last option
$('#id option').slice(-1)[0].customProp = 'customValue';

  // breaking the selector with : we default to Sizzle,
  //    which matches our custom property
$('#id option:[customProp="customValue"]').attr('selected', true);
Run Code Online (Sandbox Code Playgroud)

编辑: 我的示例链接先前引用了别人的示例,因为我键入了错误的修订号.固定.

  • @eykanal:好问题.我不知道这是不是一个错误.我的意思是我认为你可以认为它允许错误的`:`成为一个错误,但是这是一个防止代码破坏的错误.关于匹配属性而不仅仅是属性,我想这一定是他们的意图.有许多Sizzle功能是无效的CSS.`:eq():has():first:last`仅举几例.我倾向于避免使用它们,因为如果我只围绕有效的选择器规划我的代码,那么在支持`qsa`的浏览器中我总体上会得到更好的性能. (2认同)