0

我试图覆盖一个核心 jQuery 事件,在这种情况下是keydown事件。我的目的是在我的 Web 应用程序中保持,和的preventDefault()功能并保持热键的一致性。Left(37)Up(38)Right(39)Down(40)

我正在使用此处提供的解决方案来解决条件 charCode preventDefault 问题。

出于某种原因,我的函数覆盖根本没有触发,我无法解决这个问题。恐怕在过去的 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 );
    }
})();
4

1 回答 1

1

您的解决方案的一个问题是它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) {});
于 2011-01-04T20:51:19.993 回答