2011-07-05 127 views
7

好吧,所以我們都知道onChange用於在選項更改時在select語句上執行javascript代碼。但是,如果使用箭頭鍵更改選擇語句,則不會調用onChange事件。有沒有解決的辦法?請幫忙!我是強迫症,我知道。Javascript onChange箭頭鍵

--edit 1--

在IE剛剛測試此鍵和方向鍵做的工作。顯然這只是Chrome。 **去檢查火狐

- 編輯2 -

測試在Firefox和實現所需要的變化之前下面談到的onblur行動的答案。所以這裏的答案是:

Internet Explorer從鍵盤識別onChange事件並點擊它們。 爲了調用onChange,Firefox和Chrome都需要關鍵事件以及blur事件。

現在通常情況下,我不喜歡Internet Explorer,因爲它是一塊垃圾......但我想我......不幸的是,不得不說他們得到了一個正確的答案。

我對Chrome和Firefox的blur事件的理解是爲了節省資源,但我不同意這一點。我覺得它應該遵循字面上的命令onChange ...唉...我想我可能是錯的某種方式,雖然。

+3

按Enter鍵後,它將被稱爲或Tab – SLaks

回答

4

回過頭來看,自從提出這個問題後,Chrome現在在關鍵事件之後觸發了更改。 Firefox似乎還在等待onblur。 http://jsfiddle.net/2aQBN/

$(document).ready(function() { 
    $("#test").on("change", function() { 
     console.log("Changed."); 
    }); 
}); 

W3C Specification出現使用input事件,而不是建議。

當輸入事件適用,任何時候用戶使元素的 值發生變化,用戶代理必須隊列的任務射擊簡單 事件命名的氣泡在輸入元件輸入。

但是,沒有輸入事件出現在 Chrome或火狐 對火選擇元素。 (只是輸入元素。)

測試演示當前值與最後一個變化值。

http://jsfiddle.net/teynon/MpyHK/5/

Firefox會的onmouseover改變數值。關鍵的變化也會改變價值。然而,改革並沒有解僱。如果在用戶打開選擇菜單時提交表單,則會提交當前突出顯示的選項。

From W3C:

如果多個屬性不存在,而該元素沒有被禁用, 則用戶代理應該允許用戶選擇相應的選項元素 其選項列表,其本身沒有被禁用。當這個選項 元件被拾起(通過點擊,或通過unfocusing 所述元件改變其值後,或通過菜單命令,或 通過任何其它機構),以及相關的用戶交互之前被排隊 事件(例如,在點擊事件之前),用戶代理必須將拾取的選項元素的選擇性設置爲真,然後將 任務排隊以使用用戶交互任務源在選定 元素處觸發名爲改變的泡沫的簡單事件作爲任務來源。

https://bugzilla.mozilla.org/show_bug.cgi?id=126379有很長的討論,有很多人要求箭頭鍵工作。 (還有一些防禦onchange方法。)

有些用戶提出W3C在select元素的change事件的規範中是錯誤的。而是建議我們對規範進行修改,以便我們如何期望select的功能正常工作。

目前的功能對於大量的人來說顯然不直觀,僅僅基於錯誤報告的數量。 (Mozilla已經40標記爲重複。)

4

我建議你在Key Up事件中編寫所需的代碼來捕獲按鍵並檢查鍵碼。希望這有助於

+0

你和AlienWebguy都回應了適當的迴應,但我不能接受這兩個答案......愚蠢的...無論如何,你的回答是對問題的適當迴應(如何解決上述問題)。 – teynon

4

滾動選擇框不被視爲更改。當blur()將select和新選項值應用於select元素時,會發生更改。

+2

這應該是正確的答案恕我直言 – Xoundboy

2

這是一個非常骯髒的黑客,但可以強制的change事件做這個火:

element.addEventListener('keyup', function(evt){ 
    evt.target.blur(); 
    evt.target.focus(); 
}, false); 

所以,你會註冊一個事件監聽器change以及當用戶通過上面的代碼按<select>上的一個鍵時,該功能將被調用。

您可能希望將此範圍僅限於Firefox,但AFAIK您必須使用UA嗅探,因此如果可以接受則由您決定。

Source

0

我想是這樣的(如果以價值沒有改變不會觸發事件):

  select.keydown(function(){ 
       var _this = $(this); 
       var _val = $(this).val(); 

       setTimeout(function(){  
        if(_this.val() !== _val){ 
         _this.trigger("change"); 
        } 
       }, 1); 
      });