场景:
我有两个 jQuery 表达式:
/* A */ $('select').find('option[selected]');
/* B */ $('select').find('option').filter('[selected]');
假设文档中只有一个 select
,则:
- A: 获取
select
,然后查找所有具有名为selected
的属性的option
后代。 - B: 获取
select
,然后查找所有option
后代,然后过滤出那些具有名为selected
的属性的选项。
期望行为:
A 和 B 应该给出相同的结果。
实际行为:
用户更改下拉列表中的选择后,
- A 返回默认选中的
option
。 - B 返回新选择的
option
。
问题:
所以它们为什么不同?我的 CSS 选择器理解有误吗?
演示:
源代码:
HTML:
<select>
<option value='p'>p</option>
<option value='q' selected>q</option>
<option value='r'>r</option>
<option value='s'>s</option>
</select>
<input type='button' value='click me!'/> <br/>
ResultA : <span id='ResultA'>
here
</span> <br/>
ResultB : <span id='ResultB'>
here
</span> <br/>
Javascript:
function SetResult(ResultObj, ElementObj) {
ResultObj.text("length=" + ElementObj.length + " " + "val()=" + ElementObj.val());
}
$(function() {
$('input[type=button]').click(function() {
var SelectObj = $('select');
SetResult($("#ResultA"), SelectObj.find('option[selected]'));
SetResult($("#ResultB"), SelectObj.find('option').filter('[selected]'));
});
});
测试结果:
+---------------------------+--------------+---------------------+---------+-----+
| Browser | Environment | jQuery | A | B |
+---------------------------+--------------+---------------------+---------+-----+
| Chrome 22.0.1229.94m | Win7 | 1.8.2, 1.7.2, 1.6.4 | default | new |
| Chrome 23.0.1271.64 m | Win7 | 1.8.2, 1.7.2, 1.6.4 | default | new |
| Firefox 15.0.1 | Win7 | 1.8.2, 1.7.2, 1.6.4 | default | new |
| Firefox 16.0.2 | Win7 | 1.8.2, 1.7.2, 1.6.4 | default | new |
| IE 6 | WinXP | 1.8.2, 1.7.2, 1.6.4 | *new* | new |
| IE 9 | Win7 | 1.8.2, 1.7.2, 1.6.4 | default | new |
| Opera 12.02 | Win7 | 1.8.2, 1.7.2, 1.6.4 | default | new |
| Opera 12.10 | Win7 | 1.8.2, 1.7.2, 1.6.4 | default | new |
| Safari 5.1.7 (7534.57.2) | Win7 | 1.8.2, 1.7.2, 1.6.4 | default | new |
+---------------------------+--------------+---------------------+---------+-----+
| Chrome 22.0.1229.94 | MacOS 10.7.5 | 1.8.2, 1.7.2, 1.6.4 | default | new |
| Chrome 23.0.1271.64 | MacOS 10.7.5 | 1.8.2, 1.7.2, 1.6.4 | default | new |
| Firefox 13.0 | MacOS 10.7.5 | 1.8.2, 1.7.2, 1.6.4 | default | new |
| Firefox 14.0.1 | MacOS 10.7.5 | 1.8.2, 1.7.2, 1.6.4 | default | new |
| Firefox 16.0.2 | MacOS 10.7.5 | 1.8.2, 1.7.2, 1.6.4 | default | new |
| Opera 12.01 | MacOS 10.7.5 | 1.8.2, 1.7.2, 1.6.4 | default | new |
| Opera 12.10 | MacOS 10.7.5 | 1.8.2, 1.7.2, 1.6.4 | default | new |
| Safari 6.0.1 (7536.26.14) | MacOS 10.7.5 | 1.8.2, 1.7.2, 1.6.4 | default | new |
+---------------------------+--------------+---------------------+---------+-----+
| Chrome 21.0.1180.82 | iOS 4.3.5 | 1.8.2, 1.7.2, 1.6.4 | default | new |
| Opera 7.0.5 | iOS 4.3.5 | 1.8.2 | default | new |
| Safari | iOS 4.3.5 | 1.8.2, 1.7.2, 1.6.4 | default | new |
+---------------------------+--------------+---------------------+---------+-----+
- default 表示返回默认选中的
option
。 - new 表示返回新选中的
option
。
如您所见,除了 IE6 以外的所有浏览器都会给出不同的结果。
#ResultA
,使用option:selected
而不是option[selected]
将产生与#ResultB
相同的输出。 - sp00m