2009-06-11 4 views
73

:
jQuery에서 이벤트 처리기에 인수를 전달할 수 있습니까? 같은 jQuery 코드와

$("#myid").click(myfunction); 

function myfunction(arg1, arg2) {/* something */} 

어떻게 jQuery를 사용하는 동안 나는 myfunction에 인수를 전달합니까?

+0

가능한 중복을 [ 매개 변수가있는 함수를 매개 변수로 전달?] (http : //stackoverflow.com/questions/1300242/passing-a-function-with-parameters-as-a-parameter) –

답변

91

가장 간단한 방법은 ... 그래서 (당신이 함수에 전달 된 이벤트 정보를 사용하지 않는 가정)처럼 할

$("#myid").click(function() { 
    myfunction(arg1, arg2); 
}); 

jsFiddle입니다.

이렇게하면 click 이벤트가 트리거 될 때 호출되는 익명의 함수가 만들어집니다. 그러면 귀하가 제공하는 인수로 myfunction()으로 전화 할 것입니다.

ThisBinding (함수가 호출 될 때 this의 값을 유지하려면 해당 이벤트를 트리거 한 요소로 설정) call()으로 함수를 호출하십시오.

$("#myid").click(function() { 
    myfunction.call(this, arg1, arg2); 
}); 

jsFiddle.

예를 들어 설명한대로 직접 참조를 전달하거나 단일 인수가 jQuery event object이 될 수 없습니다. 당신이가 기준을 통과하고 싶은 경우

, 당신은 (Function.prototype.bind()에 대한 크로스 브라우저 래퍼) jQuery의 proxy() 기능을 활용해야합니다. 이렇게하면 앞에event 인수가 바인딩 된 인수를 전달할 수 있습니다.

$("#myid").click($.proxy(myfunction, null, arg1, arg2)); 

jsFiddle. 이 예에서

, myfunction()을 사용하여 실행 될 그 ThisBinding (위해) 인자 arg1 함께 arg2 (null 개체이므로 이벤트를 사용하는 트리거 소자의 정상 this 값이 아닌)을 그대로 마지막으로 jQuery event 오브젝트가 필요하지 않은 경우 무시할 수 있습니다 (함수의 인수에서 이름을 지정하지 마십시오).

(함수 인수 귀하의 질문에 언급처럼이 아닌)

또한 데이터를 전달하기 위해 jQuery를 event 객체의 data를 사용하여 사용할 수 있지만이 event.data.arg1를 통해 액세스 할 수 myfunction() 수정 필요, 또는 적어도 수동 도입 앞의 예제와 같은 프록시 함수 또는 후자의 예제를 사용한 생성 된 함수입니다.

+1

myfunction()에서 jquery 컨텍스트 $ (this)를 잃게됩니다. 유지하려면 anonymous 핸들러에서'myfunction (this, arg1, arg2)'를 호출하십시오. 그런 다음 함수는 'myfunction (el, arg1, arg2) {alert ($ (el) .val()); }' – lambinator

+9

@geosteve : 보관하고 싶다면'myfunction.call (this, arg1, arg2)'를 사용하십시오. – alex

+1

질문에서 묻는 것처럼 함수에 인수를 전달하지 않습니다. 다른 함수를 호출하는 함수를 호출하고 있습니다. 익명 함수 내에서 중첩 함수는 익명 함수를 쉽게 바인딩 해제 할 수 없으므로 좋은 생각이 아닙니다. –

10

확실히 Alex의 대답을 사용해야하는 반면 프로토 타입 라이브러리의 "bind"방법은 Ecmascript 5에서 표준화되었으며 곧 브라우저에서 기본적으로 구현됩니다. 그것은 다음과 같이 작동

jQuery("#myid").click(myfunction.bind(this, arg1, arg2)); 
+2

이 메소드를 사용하면 'this'가 다른 컨텍스트로 설정됩니다. 예를 들어, 'bind()'를 컨텍스트 (전역)에서 'this'로 지정하면 클릭 핸들러가 'this'는'# myid' 요소에 대한 참조와 반대입니까? – alex

+2

@alex 당신이 옳습니다. jQuery는 이벤트 처리기에서 #myid 요소를 'this'에 바인딩하고 bind 메소드를 사용하면이를 대체합니다. 나는 몇 년 전에이 게시물을 썼다. 그래서 내가 당시에 생각하고있는 것을 말하기가 어려웠다. 나는 내 대답을 읽는 사람들이이 세부 사항들을 스스로 파악할만큼 똑똑하다고 생각한다. – Breton

+11

이것은 매우 위험한 가정입니다. – Travis

52
$("#myid").on('click', {arg1: 'hello', arg2: 'bye'}, myfunction); 

function myfunction(e) { 

    var arg1 = e.data.arg1; 
    var arg2 = e.data.arg2; 

    alert(arg1); 
    alert(arg2); 

} 

//call method directly: 
myfunction({ 
    arg1: 'hello agian', 
    arg2: 'bye again' 
}); 

는 또한 바인딩과에 및 방법 떨어져 사용하여 특정 이벤트 핸들러 바인딩을 해제 할 수 있습니다.

예 :

$("#myid").off('click', myfunction); 

이 #myid

+0

질문에 묻는 것처럼 함수에 인수를 전달하지 않습니다. – alex

+3

이것이 인수를 전달하는 방법입니다 (객체 내부에 인수를 감싸는 방법). –

+0

이것은 데이터를 전달하는 방법이지만 함수 인수를 호출하는 스트레치입니다. – alex

4

올드 스레드에서 myFunction이 핸들러 바인딩을 해제하지만, 검색 목적을위한 것입니다;

$(selector).on('mouseover',...); 

... 그리고 "데이터"매개 변수 체크 아웃 : 시도 http://api.jquery.com/on/

예 :

function greet(event) { 
    alert("Hello " + event.data.name); 
} 
$("button").on("click", {name: "Karl"}, greet); 
$("button").on("click", {name: "Addy"}, greet); 
1

간단한 :의

$(element).on("click", ["Jesikka"], myHandler); 

function myHandler(event){ 
    alert(event.data);  //passed in "event.data" 
} 
관련 문제