2011-01-04 14 views
0

コアのjQueryイベントを上書きしようとしています。この場合は​​イベントです。私の意図は、preventDefault()の機能Left(37)Up(38)Right(39)Down(40)です。私のウェブアプリケーションでホットキーの一貫性を維持します。コアjQueryイベントの変更の問題

条件付きcharCode preventDefaultの問題については、hereのソリューションを使用しています。

何らかの理由で、私の機能の上書きは単に発砲していないので、私は問題に私の指を置くことはできません。私は過去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

あなたの解決策の問題は、何が起こっているのメンタルモデルが間違っているあなたがそう​​は、その引数としてイベントを受け付けないということです。イベントが作成されますどのように、おそらく複雑で、なぜちょうど​​を使用し、与えられたコールバックの前に、あなたのロジックをスロッティング、それに基づいて構築されたプラグインを書きません:

(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) {}); 
+0

をあなたの解決策が十分である、しかし、KeyDownイベント関数に見時、私は、KeyDownイベントが実際にイベントパラメータを持っていないことがわかります。だから、なぜ機能が発射されていないのかは分かりません。なぜなら、keydownのオブジェクト文字列はjquery.fn.keydownではなく、実際にはjQuery.event.special.change.keydownですか? 'keydown'を探す - http://code.jquery.com/jquery-1.4.3.js – Sandwich

+0

申し訳ありませんが、私は意味しました:jQuery.event.special.change.filters.keydown – Sandwich

+0

私はソースを見ましたしかし、 'keydown'のための[APIドキュメント](http://api.jquery.com/keydown/)を見ると、関数が期待する引数を見ることができます。 jQueryがイベント構造を実装する方法に違いがあるかもしれません。たとえば、keyupの検索を試みると、( 'each'の可能性のリストに)一度しか表示されません。 –

関連する問題