2010-07-25 2 views
3

플러그인을 만들고 있는데 $ (this)에 액세스 할 수 없습니다. 내 플러그인의 간단한 개요

(function($){ 
    $.fn.myPlugin= function(options, callback) { 
     return this.each(function(){ 
       $(this).click(function(){ 
         // some plugin works .. 

         callback(); 
       }); 
     }); 
    }; 

})(jQuery); 

그런 다음 내가
$('p').myPlugin({ 
     // Some options 
}, function(){ 
     alert('first test'); 
     alert($(this).text()); 
}); 
다음

요소 p를 클릭하면, 내가 첫 번째 경고를 얻을

같은 요소에 내 플러그인을 부착입니다,하지만 난하지 않았다 제 2의 경고.

콜백 함수가 호출되었지만 this에 액세스 할 수 없습니다. 정의 또는 코드에 문제가 있습니까? 어떤 다른 제안도, callback();

답변

4

대신에 도움이 될 그것을 올바른 컨텍스트를 제공하기 위해 .apply()를 사용합니다 같이, (그렇지 않으면 window있어) :

callback.apply(this); 

You can see the updated/working version here. 그런 다음

(function($){ 
    $.fn.myPlugin= function(options, callback) { 
    return this.each(function(){ 
     $(this).click(function(){ 
     callback.apply(this, [options]); 
    }); 
    }); 
}; 
})(jQuery); 

: 당신이 원하는 경우에 당신은 options 사용할 수 있도록하기를 원한다면 여기에 더 완전한 개요를


, 당신은 당신이 할 수있는, 예를 들어, 그 callback에 더 많은 인수를 전달할 수 있습니다 다음과 같이 호출 :

You can give that one a try here

$('p').myPlugin({ 
    thing: "thing1" 
}, function(opts){ 
    alert(opts.thing); //thing1 
});​ 
를 그냥 배열에 당신이 원하는대로 인수를 추가, callback() 것 그 인자들로 불릴 수있다.

0

자동 완성 위젯을 사용하는 완전한 예를 게시 할 수 있습니까? 여기

는 ... 내가하고 싶었던 것을 정의되지 않은

$('.suggest').autocomplete({ 
    source: function(request, response) { 
     typ = $(this).getAttr("class").split(" ")[2] 
     .... 

...하지만 반환합니다. 지금은 document.activeElement을 사용하고 있지만 Nick Craver의 방법을 선호합니다.