2016-10-27 8 views
0

각 12 행의 집합이 12 input[class='variant-amount'] 개 있습니다. 입력 필드 중 일부는 이벤트가 그들과 관련된 한 같은 "onkeypress"이나 "onkeyup"Javascript 이벤트를 "레이어"할 수있는 방법이 있습니까?

나는 "onkeypress" 이벤트를 사용 .variant-amounts에 글로벌 이벤트 리스너를 적용 할 것이지만, 그 입력 필드의 작용을 무시하고 싶지 것이라고 이미 "onkeypress" 이벤트가 첨부되었습니다.

그래서 기본적으로 자체 코드를 실행하고 자체 "onkeypress" 이벤트를 실행 한 후 이벤트를 설정하는 방법이 있습니까? 어느 시점에서 만약 당신이 액세스 할 수있는 경우

+1

를 사용하는 : 당신이 DOM에 이벤트 전파의 원리를 버블 링/캡처하는 것을보고 싶었어 그냥 경우

var body = document.body; // add handler of keypress in capturing phase body.addEventListener("keypress", function(){ console.log("keypress body") }, true); var input = document.querySelector("input"); input.addEventListener("keypress", function(){ console.log("keypress input") });
<div> <input value="foo" > </div>

jQuery? 귀하의 선택자가 당신을 제안하고, 모든 것을 바꿀 것입니다 –

+0

그것은 단지 시범입니다, 나는 JavaScript를 사용하고 있지만 jquery를 사용하지 않을 것입니다. 최상의 성능이 옵션입니다. – mkmnstr

+2

@mkmnstr이 DOM 선택기에 관한 jQuery에만 해당되는 것은 없습니다 – Bergi

답변

1
function all(){ // code } 
function press(){ 
    //code 
    all(); 
} 
function up(){ 
    // code 
    all(); 
} 
elemenUp.addEventListener("keyup", up()); 
elementPress.addEventListener("keypress", press()); 

, 그냥 모든 (argThis)에 인수하고이 내부 이벤트 리스너 함수를 통과 (모든 입력 상자 자체를 수정하지 않고, 그들은 그것의 클래스 불구 액세스해야합니다).

0

이벤트 처리기의 기능을 유지하고 확장하려면 이벤트 처리기를 재정의해야하지만 원래 처리기에 대한 참조를 저장하고 호출해야합니다.

나는, 각 input이 특정 하나를 할당 한 후 전역 이벤트 핸들러를 할당하는 것이 좋습니다 모든 입력이 자신의 핸들러가 후 같은 것을 할 :

// Query all the inputs and transform the result into a proper array 
Array.prototype.slice.call(document.querySelectorAll('input[class="variant-amount"]')) 
    .forEach(function (variantAmount) { 
     var original = variantAmount.onkeypress; 

     variantAmount.onkeypress = function() { 
      // do your stuff 

      // Call the original event handler forwarding both this and the arguments, which needs to be converted to a real array 
      original.apply(this, Array.prototype.slice.call(arguments)); 
     }; 
    }); 
+0

** **'Array.prototype' ** 대신 **'[]'**를 사용할 수 있습니다. –