Core JQuery Event Modification Problem
-
15-10-2019 - |
Frage
Ich versuche, ein Core JQuery -Event zu überschreiben, in diesem Fall die keydown
Veranstaltung. Meine Absicht ist zu preventDefault()
Funktionalität von Left(37)
, Up(38)
, Right(39)
und Down(40)
Um die Konsistenz von Heißschlüssel in meiner Webanwendung zu erhalten.
Ich benutze die bereitgestellte Lösung hier Für das bedingte Charcode PREIVORDEFAULT -Problem.
Aus irgendeinem Grund schießt mein Funktion überschreiben einfach nicht und ich kann das Problem nicht mit dem Finger einsetzen. Ich befürchte, dass dieses Problem in den letzten 30 Minuten zu einem gewissen Haarausfall geführt hat. Hat jemand das Mittel?
/*
Modify Keydown Event to prevent default PageDown and PageUp functionality
*/
(function(){
var charCodes = new Array(37,38,39,40);
var original = jQuery.fn.keydown;
jQuery.fn.keydown = function(e){
var key=e.charCode ? e.charCode : e.keyCode ? e.keyCode : 0;
alert('now why is my keydown mod not firing?');
if($.inArray(key,charCodes))
{
alert('is one of them, do not scroll page');
e.preventDefault();
return false;
}
original.apply( this, arguments );
}
})();
Lösung
Ein Problem mit Ihrer Lösung ist das keydown
Akzeptiert kein Ereignis als Argument, sodass Ihr mentales Modell dessen, was vor sich geht, falsch ist. Wie das Ereignis erstellt wird, ist wahrscheinlich kompliziert. Warum also nicht einfach ein Plugin schreiben, das verwendet keydown
und baut darauf auf und setzt Ihre Logik vor einem bestimmten Rückruf ein:
(function($){
var charCodes = new Array(37,38,39,40);
$.fn.limitedkeydown = function(callback) {
this.keydown(function(e) {
if ($.inArray(e.keyCode, charCodes))
e.preventDefault();
callback(e);
});
};
})(jQuery);
Auf diese Weise steht Ihnen die ursprüngliche (unberührte) Version weiterhin zur Verfügung, sodass Sie beide Methoden gleichermaßen verwenden können:
$('selector').keydown(function(e) {});
$('selector').limitedkeydown(function(e) {});