在开放(聚焦)“选择”元素中非常奇怪的Chrome行为

这是一个元素:

  Hello Banana Balloon Something Potato Cleveland  

这里有一点JavaScript(jQuery“ready”处理程序):

 $(function() { function foo() { var s = $('select').find(':selected'); } setInterval(foo, 200); }); 

这是这个问题的jsfiddle。 。

处理程序设置一个间隔计时器,每隔200毫秒,它会找到当前选择的 ,并且对它没有任何作用。 当我在Chrome中运行小提琴(13.0.782.112),然后单击元素,然后尝试选择一个条目时,选择突出显示会继续跳回到第一个选定的元素。 我可以点击所显示的任何元素,当然,然后它会在下次执行相同的操作。

现在,如果我更改计时器处理程序,以便它不使用jQuery来查找当前选择的元素,如下所示:

 $(function() { function foo() { var select = $('select')[0]; var s = $(select.options[select.selectedIndex]); } setInterval(foo, 200); }); 

然后我不再看到效果了。

Firefox不会这样做。 我还没试过Safari。

就个人而言,我觉得这里有些事情做错了。 是Chrome吗? jQuery的?

编辑 – 还有一个细节 – 我在Linux上运行Chrome。 我会在一秒钟内尝试Windows。 (在Windows中编辑相同。)

将代码更改为:

 function foo() { var s = $('select option:selected'); } setInterval(foo, 200); 

不确定为什么会这样做,但我的猜测是它与伪选择器在jQuery中的工作方式有关。 它们被实现为与选择器名称配对的函数(在本例中为“selected”)。 因此,它们针对上下文中的每个可能元素(不仅仅是那些可能被选中的元素)运行。

也许有一些奇怪的鬼元素,当它不应该被执行时,“选定的”伪选择器被执行。 这里的解决方案是在执行伪选择器之前将上下文限制为选项。 总是一件好事。