2010-12-03 39 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自己修復。

另外如果你想多選工作告訴我,我會砍圍繞藏漢

相關問題