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

我正在使用提供的解决方案 这里 对于有条件的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 );
    }
})();
有帮助吗?

解决方案

解决方案的问题是 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) {});
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top