2009-08-06 102 views
16

我有一個HTML窗體上的簡單列表框,這很基本的jQuery代碼Jquery的列表框Change事件不會觸發鍵盤滾動

//Toggle visibility of selected item 
    $("#selCategory").change(function() { 
     $(".prashQs").addClass("hide"); 
     var cat = $("#selCategory :selected").attr("id"); 
     cat = cat.substr(1); 
     $("#d" + cat).removeClass("hide"); 
    }); 

變化事件觸發罰款鼠標,但是當我使用鍵盤滾動項目的事件不會被解僱,我的代碼永遠不會執行。

是否有此行爲的原因是什麼?解決方法是什麼?

回答

21

onchange事件一般不開除,直到元素失去焦點。您還需要使用onkeypress。也許是這樣的:

var changeHandler = function() { 
    $(".prashQs").addClass("hide"); 
    var cat = $("#selCategory :selected").attr("id"); 
    cat = cat.substr(1); 
    $("#d" + cat).removeClass("hide"); 
} 

$("#selCategory").change(changeHandler).keypress(changeHandler); 

你會希望同時onchangeonkeypress,以分別佔鼠標和鍵盤交互。

+0

但在這種情況下,我得到了按鍵不工作在任何瀏覽器,除了FireFox,我在鉻,Safari瀏覽器和IE測試,並沒有工作。 – 2010-07-02 03:16:53

+0

'keypress'事件在chrome上不起作用,但'keyup'正常運行 – 2011-08-17 12:37:17

4

有時改變行爲可以爲每個瀏覽器不同,作爲一種解決方法,你可以做這樣的事情:

//Toggle visibility of selected item 
    $("#selCategory").change(function() { 
     $(".prashQs").addClass("hide"); 
     var cat = $("#selCategory :selected").attr("id"); 
     cat = cat.substr(1); 
     $("#d" + cat).removeClass("hide"); 
    }).keypress(function() { $(this).change(); }); 

你可以連你想要的任何事件和手動觸發更改事件。

IE:

var changeMethod = function() { $(this).change(); }; 
....keypress(changeMethod).click(changeMethod).xxx(changeMethod); 
+0

你說得對,這是由於跨瀏覽器不兼容。 – 2009-08-06 06:20:18

1

您所描述的行爲,改變事件通過鍵盤在一個select元素滾動觸發,實際上就是一個Internet Explorer漏洞。該DOM Level 2 Event說明書中change事件定義爲這樣的:當一個控制 失去輸入焦點並且由於獲得焦點其值 已被修改發生

的變化事件。 此事件是有效的INPUT,SELECT, 和TEXTAREA。元件。

如果你真的想要這種行爲,我認爲你應該看看鍵盤事件。

$("#selCategory").keypress(function (e) { 
    var keyCode = e.keyCode || e.which; 
    if (keyCode == 38 || keyCode == 40) { // if up or down key is pressed 
    $(this).change(); // trigger the change event 
    } 
}); 

檢查一個例子here ...

+0

如何在Firefox中產生這種行爲呢?我希望我的內容在焦點仍在框中時更改listitem更改。 – 2009-08-06 06:18:08

+3

+1我發現解決方案除了改變之外還使用了keyup事件。 – 2009-08-06 06:20:58

+0

你應該注意到,KEYUP不會被調用,如果按下並按住,直到關鍵是放手的keydown,瀏覽器可以通過列表中的不同項目滾動當按下鍵。我會確保這不會對依賴活動更改的任何代碼產生負面影響。 – 2009-08-06 06:27:11

0

我的JQuery 1.4.1下有這個問題與IE瀏覽器 - 在組合框更改事件如果使用鍵盤進行更改並沒有開火。

似乎已經固定在JQuery中1.4.2。

0
$('#item').live('change keypress', function() { /* code */ }); 
+1

'live'已棄用。使用'on'代替,如果你不使用jQuery 1.7或更高版本,請使用'delegate'。 – 2012-06-08 08:45:45

+0

@JamesAllardice謝謝:) – 2012-06-27 00:15:53

+1

不客氣:)有關詳細信息,請參閱http://liveisdeprecated.com – 2012-06-27 07:20:09