2010-12-03 29 views
2

好吧,我花了一段时间才想出一个这个问题的标题。jQuery的更改事件不会在IE中触发时释放多个选择的鼠标

假设您有多个选择列表,并使用jQuery来检测更改事件。在正常情况下,这将在Firefox和IE下正常工作。但在IE中,如果您在列表中选择了某些内容,并且直到光标处于选择范围之外时才释放鼠标,则该事件不会被触发。这在Firefox中起作用。

HTML:

<select size="4" name="ListBox" multiple="multiple" id="ListBox"> 
    <option value="32">32</option> 
    <option value="48">48</option> 
</select> 

的Javascript:

$(ListBox).change(function() 
{ 
    alert("Change fired"); 
}); 

您可以测试这里的例子:http://jsfiddle.net/as7EN/1/

FF 3.6.12:WORKS
IE8:不工作

谢谢任何​​suggestio ñ。

+1

上面提到的你在FF中对我无效http://jsfiddle.net/as7EN/1/ – Raynos 2010-12-03 17:00:47

+0

也许你可以在焦点上做一个事件 - 一旦失去焦点检查它。 – Bob 2010-12-03 17:02:46

回答

2

原来这是一个jQuery 1.4。*的错误!

我再次用早期版本的jQuery 1.3.2测试了Fiddle,果然它的工作原理!

我在jQuery的发布一个bug报告,请投我的报告那里,如果你希望他们来修复它(非常小箭头旁边的“上一页票”链接票以上):

http://bugs.jquery.com/ticket/7698

0

一个hackish的解决方案

[编辑解决方案]

var clickDown = false; 
var currentlySelected = null; 

$("#ListBox").mousedown(function (event) 
{ 
    clickDown = this; 
}); 

$(document).mouseup(function() { 
    setTimeout(function() { 
     if (clickDown) { 
      if (currentlySelected != clickDown.selectedIndex) { 
       alert("change"); 
       currentlySelected = clickDown.selectedIndex; 
      } 
      clickDown = false; 
     } 
    }, 0); 
}); 

基本上在鼠标按下我们设置一个标记,你点击列表框。

然后我们在整个文档中检查 mouseUp。我们在超时中包装整个函数以确保IE8正确设置selectedIndex。如果设置了clickDown标志,我们知道clickUp来自列表框。为了方便起见,我还将列表框对象存储在JavaScript中的对象(object === true)中。

然后我们只需检查包含当前索引的变量是否已更改。如果发生变化,我们更新该变量以反映新索引。

最后,我们必须再次将clickDown设置为false外层明智的文档中的其他点击ups会从列表框中出现。

这涉及到检查每点击起来绝不是一个优雅的解决

http://jsfiddle.net/as7EN/37/

[编辑]这只是固定它的铬。不适用于IE8。在它上面工作。

我已经缩小到IE触发mouseUp事件后更改selectedIndex的事实。

这个错误可以通过将其封装在timeOut中来避免,以便在IE8将selectedIndex设置为实际值后调用该函数。我不在乎IE6/7自己修复。

另外如果你想多选工作告诉我,我会砍围绕藏汉

相关问题