2012-09-30 2 views
2

특정 jQuery 플러그인을 호출하는 핸들러가 있습니다. 나는 코드를 리팩토링하고 프라퍼티를 호출 할 래퍼에 속성과 메소드를 전달할 수있는 객체를 만들고 싶다.jquery 이벤트 핸들러에서 오브젝트 메소드를 전달하는 방법은 무엇입니까?

문제 :

$("li", opts.tgt).live("click", function() { GetContact(this); }); 

는 사람이 진행하는 방법에 대한 몇 가지 제안 사항이 있습니까 : 나는 어려움 다음 문을 모방 있나요? TIA. 피드백에 대한

function InitAutoCompleteTest() { // Init custom autocomplete search 
    var opts = { 
     tgt: "#lstSug", crit: "#selCrit", prfxID: "sg_", urlSrv: gSvcUrl + "SrchForContact", 
     fnTest: function (str) { alert(str) }, 
     fnGetData: function (el) { GetContact(el) } 
    } 

    $("input", "#divSrchContact").bind({ 
     "keypress": function (e) { // Block CR (keypress fires before keyup.) 
      if (e.keyCode == 13) { e.preventDefault(); }; 
     }, 
     "keyup": function (e) { // Add suggestion list matching search pattern.    
      opts.el = this; $(this).msautocomplete(opts); e.preventDefault(); 
     }, 
     "dblclick": function (e) { // Clear search pattern. 
      $(this).val(""); 
     } 
    }); 

    opts.fnTest("Test"); // Works. Substituting the object method as shown works. 


    // Emulation attempts of below statement with object method fail: 
    // $("li", opts.tgt).live("click", function() { GetContact(this); }); 

    $("li", opts.tgt).live({ "click": opts.fnGetData(this) }); // Hangs. 
    $("li", opts.tgt).live({ "click": opts.fnGetData }); // Calls up GetContact(el) but el.id in GetContact(el) is undefined 
} 

function GetContact(el) { 
    // Fired by clicking on #lstSug li. Extract from selected li and call web srv. 
    if (!el) { return }; 

    var contID = el.id, info = $(el).text(); 
    ... 
    return false; 
} 

편집

감사합니다. 마침내 Thiefmaster가 제안한 변형을 사용했습니다. "opts.fnTest ("Test "); 이후 익명 fn 내에서 메소드를 임베드해야하는 이유가 궁금합니다." 상자에서 곧바로 작동하므로 말할 수 있습니다.

$("li", opts.tgt).live({ "click": function() { opts.fnGetData(this); } }); 

답변

5

간단하게 익명 함수에서 그들을 포장 :

function() { 
    opts.fnGetData(); 
} 

현대 JS 엔진을 필요로 또 다른 옵션을 .bind()을 사용하는 것입니다 :

opts.fnGetData.bind(opts) 

전체 예 :

$("li", opts.tgt).live({ "click": opts.fnGetData.bind(opts) }); 
$("li", opts.tgt).live({ "click": function() { opts.fnGetData(); }}); 

콜백 내부에서 this을 사용하여 객체에 액세스합니다. 인수로 요소를 전달하려는 경우


, 당신은 이런 식으로 작업을 수행 할 수 있습니다

$("li", opts.tgt).live({ "click": function() { opts.fnGetData(this); }}); 
+0

감사합니다, 내 조직 게시물의 끝에서 솔루션을 기록했다. – user1660874

+1

제발하지 말아요 - 정말 스택 오버플로의 Q & A 스타일에 맞지 않습니다. 그러나 투표 화살표 아래의 왼쪽에있는 회색 체크 표시를 클릭하면이 대답을 수락 할 수 있습니다. – ThiefMaster

1

문서에서

.live(events, data, handler(eventObject)) 

eventsA에게 자바 스크립트를 포함 문자열을 이벤트 유형 (예 : '클릭'또는 'keydown') jQuery 1.4부터 문자열에는 공백으로 구분 된 여러 이벤트 유형 또는 사용자 정의 이벤트 이름이 포함될 수 있습니다.

데이터 이벤트 처리기로 전달되는 데이터 맵.

처리기 (eventObject) 이벤트가 트리거 될 때 실행할 기능입니다.

예 :

$('#id').live('click', {"myValue":"someValue"}, function(evt){ 
    console.log(evt.data["myValue"]); // someValue 
});​ 

JQuery live

+1

'.live()'는 모든 버전의 jQuery에서 더 이상 사용되지 않습니다. 1.7 이전의 jQuery 버전에서는'.delegate()'를 사용해야하고 1.7+의 경우'.on()'을 사용해야합니다. – jfriend00

+0

고마워요)) 마음에두고)) –

+0

@Anton Baksheiev. 고마워, 잘 알고있어. 나는 Thiefmaster가 제안한 솔루션이 더 succint라는 것을 알았고, 그래서 나는 org 포스트에 추가했다. – user1660874

관련 문제