2011-01-04 2 views
0

코어 jQuery 이벤트를 덮어 쓰려고 시도합니다.이 경우 keydown 이벤트입니다. 제 의도는 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

솔루션의 문제점은 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); 

원 (그대로) 버전은 여전히 ​​그 방법 : 작성되는 이벤트가 아마 복잡 어떻게, 왜 그냥 주어진 콜백 전에 keydown을 사용하고 당신의 논리를 슬로 팅, 그 위에 구축 플러그인을 쓰기 사용 가능한, 그래서 똑같이 두 방법 모두 사용할 수 있습니다 다음를 keyDown 기능에 찾고에, 나는를 keyDown 실제로 이벤트 매개 변수가 않는 것을 볼

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

귀하의 솔루션은, 그러나, 충분한입니다. 그래서 이것이 기능이 발사되지 않는 이유를 설명하지는 않습니다. 그것은 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 docs] (http://api.jquery.com/keydown/)에서 함수가 기대하는 인수를 볼 수 있습니다. jQuery가 이벤트 구조를 구현하는 방법에 차이가있을 수 있습니다. 예를 들어 keyup 검색을 시도하면 ('each' 가능성 목록에서) 한 번만 나타납니다. –