Основная проблема модификации события jQuery - PullRequest
0 голосов
/ 04 января 2011

Я пытаюсь переписать основное событие jQuery, в данном случае событие keydown. Мое намерение - preventDefault() функциональность Left(37), Up(38), Right(39) и Down(40) для обеспечения согласованности горячих клавиш в моем веб-приложении.

Я использую предоставленное решение здесь для условной проблемы charCode предотвращение дефолта.

По какой-то причине моя функция перезаписи просто не срабатывает, и я не могу разобраться в проблеме. Боюсь, что за последние 30 минут эта проблема привела к некоторому выпадению волос. У кого-нибудь есть лекарство?

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

1 Ответ

1 голос
/ 04 января 2011

Проблема с вашим решением состоит в том, что keydown не принимает событие в качестве аргумента, поэтому ваша ментальная модель происходящего неверна. Как создается событие, вероятно, сложно, так почему бы просто не написать плагин, который использует keydown и основывается на нем, вставляя свою логику перед заданным обратным вызовом:

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

Таким образом, оригинальная (нетронутая) версия все еще доступна для вас, поэтому можно одинаково использовать оба метода:

$('selector').keydown(function(e) {});
$('selector').limitedkeydown(function(e) {});
...