2009-08-06 6 views
16

ich eine einfache Listbox auf einem HTML-Formular und dieses sehr rudimentären Code jQueryJQuery Listbox ändern Ereignis wird nicht auf Tastatur Scrollen

haben
//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"); 
    }); 

Das Änderungsereignis ausgelöst wird gut, wenn das aktuelle Element ausgewählt wird unter Verwendung der Maus, aber wenn ich mit der Tastatur durch die Elemente scrolle, wird das Ereignis nicht ausgelöst und mein Code wird nie ausgeführt.

Gibt es einen Grund für dieses Verhalten? Und was ist die Problemumgehung?

Antwort

21

Die onchange Ereignis wird im Allgemeinen nicht gefeuert, bis das Element den Fokus verliert. Sie möchten auch onkeypress verwenden. Vielleicht so etwas wie:

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); 

Sie werden sowohl onchange und onkeypress wollen sowohl für jeweils Maus und Tastatur Interaktion zu berücksichtigen.

+0

aber ich habe das Tastenkürzel in diesem Fall funktioniert nicht in jedem Browser außer FireFox, ich habe auf Chrom, Safari und IE getestet und hat nicht funktioniert. –

+0

'keypress' Ereignis funktionierte nicht auf Chrom, aber' keyup' funktionierte korrekt –

4

Manchmal kann das Änderungsverhalten pro Browser unterscheiden, wie dieses Problem zu umgehen Sie so etwas tun könnten:

//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(); }); 

Sie können Kette, was Ereignisse, die Sie wollen, und manuell das Änderungsereignis ausgelöst.

IE:

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

Sie haben recht, wenn Sie sagen, dass dies auf Browserinkompatibilität zurückzuführen ist. –

1

Das Verhalten, das Sie beschreiben, das Ereignis Änderung von Tastatur Auslösung in einem ausgewählten Elemente Scrollen, ist eigentlich ein Internet Explorer-Fehler. Die DOM Level 2 Event Spezifikation definiert die change Ereignis wie folgt aus:

Das Änderungsereignis tritt auf, wenn ein Steuer den Fokus Eingang verliert und seinen Wert seit gewinnt Fokus geändert. Dieses Ereignis ist gültig für INPUT, SELECT, und TEXTAREA. Element.

Wenn Sie dieses Verhalten wirklich wollen, sollten Sie sich Tastaturereignisse ansehen.

$("#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 
    } 
}); 

prüfen ein Beispiel here ...

+0

Wie kann ich dieses Verhalten dann in Firefox erzeugen? Ich möchte, dass mein Inhalt auf der Liste aktualisiert wird, während der Fokus immer noch auf der Box liegt. –

+3

+1 Ich fand die Lösung Keyup-Ereignis zusätzlich zu ändern. –

+0

Sie sollten beachten, dass keyup nicht aufgerufen wird, wenn ein Keydown gedrückt und gehalten wird, bis die Taste losgelassen wird, kann der Browser verschiedene Elemente in der Liste durchlaufen, während die Taste gedrückt wird. Ich würde sicherstellen, dass das keinen Code beeinträchtigt, der auf aktiven Änderungen beruht. –

0

hatte ich dieses Problem mit IE unter JQuery 1.4.1 - Änderungsereignisse auf Combo-Boxen feuern nicht, wenn die Tastatur die Änderung verwendet wurde.

Scheint in JQuery 1.4.2 behoben wurden.

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

'live' ist veraltet. Verwenden Sie stattdessen "on", und wenn Sie jQuery 1.7 oder höher nicht verwenden, verwenden Sie 'delegate'. –

+0

@JamesAllardice Danke :) –

+1

Gern geschehen :) Für weitere Informationen siehe http://liveisdeprecated.com –

Verwandte Themen