2012-02-07 21 views
0

有什麼方法可以找出在Internet Explorer(> = IE8) - 鍵盤或鼠標的選擇框上導致onChange事件的原因?如何找到IE中的選擇框 - 鍵盤或鼠標導致onChange事件?

我有一個代碼,當用戶選擇一個值時會做些什麼,而且這段代碼在Firefox和Chrome中非常好用,但是在IE中卻沒有(不出意外,呵呵)。在IE中,只有當用戶使用鼠標而不是鍵盤時,它才能正常工作,因爲它在每次按鍵時都會觸發onchange事件(而不是像普通瀏覽器一樣輸入)。

所以,要解決這個問題,我需要知道事件是否使用鍵盤觸發,然後我會過濾它。

更新:

好了,打了一下後,我找到了一個很好的解決方案。張貼在這裏,以防有人會發現它有用。下面的解決方案使用jQuery,但它也可以在純Javascript中完成。

這是造成問題的代碼:

$("#mySelectBox").change(function() { 
    // Do something 
}); 

這是我的解決方案。這可能不是完美的,但它對我來說很有用。當然,事件處理程序可以鏈接在jQuery中。下面的代碼存儲了select的初始值,並使用它來避免在初始鼠標單擊時執行某些操作 - 當用戶展開選擇框時。它還過濾除Enter之外的所有按鍵。

function doSomething(el) { 
    if (el.data["valueOnFocused"] !== el.val()) { 
     // Do something 
    } 
} 

$("#mySelectBox").focusin(function() { 
    $(this).data["valueOnFocused"] = $(this).val(); 
}); 

$("#mySelectBox").keyup(function (e) { 
    if (e.which === 13) 
    { 
     doSomething($(this)); 
    } 
}); 

$("#mySelectBox").click(function() { 
    doSomething($(this)); 
}); 

回答

1

基本上onchange事件是應該被解僱當用戶然後選擇離開輸入(不論是選擇,文本框,單選按鈕,等等)。由於這在IE中不起作用,您可以嘗試使用onblur來檢測用戶何時離開盒子。此時您可以閱讀選擇哪個項目並據此採取行動。這更像是一種解決方法,但可以做你需要的。

編輯:另一種選擇是將檢測按Enter鍵,就像這樣:

if(e && e.which){ // NN4 specific code 
e = e 
characterCode = e.which 
} 
else { 
e = event 
characterCode = e.keyCode // IE specific code 
} 

的characterCode變量現在具有的按下按鈕,在「代碼」。如果是輸入密鑰,那麼代碼將會是13.你可以聽這個。

+0

是的,我已經嘗試過onblur,但它並不等同於我的情況,因爲它需要額外的一步才能離開一個並不明顯的控制。另外,用戶看不到可能會引起混淆的即時操作。 – graycrow 2012-02-07 14:53:28

+0

您可以嘗試檢測何時按下Enter鍵。我修改了我的答案以包含該選項。 – 2012-02-07 14:57:24

+0

會試試,謝謝。 – graycrow 2012-02-07 15:13:03