Jquery не может получить доступ к $ (this) в функции обратного вызова - PullRequest
3 голосов
/ 25 июля 2010

Я создаю плагин, и он не может получить доступ к $ (это). Простой обзор моего плагина:

(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 нажимают, я получаю первое предупреждение, но я не получаю второе предупреждение.

Функция обратного вызова вызывается, но не может получить доступ к this. Есть ли проблемы с определением или с кодом? Любое альтернативное предложение также будет полезно

Ответы [ 3 ]

4 голосов
/ 25 июля 2010

Вместо callback();, используйте .apply(), чтобы дать ему правильный контекст (в противном случае это window), например:

callback.apply(this);

Вы можетесм. обновленную / рабочую версию здесь .


Для более полного обзора здесь вы можете передать больше аргументов, если хотите, к этому callback, например, если вы хотите сделать options доступно, вы можете сделать это:

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

Затем назовите это так:

$('p').myPlugin({
    thing: "thing1"
}, function(opts){
    alert(opts.thing); //thing1
});​

Вы можете попробовать это здесь , просто добавьтекакие бы аргументы вы не указали для этого массива, callback() будет вызываться с этими аргументами:)

1 голос
/ 25 июля 2010

Ник Крейвер прав. Но для понимания происходящего перейдите по этой ссылке: http://howtonode.org/what-is-this

0 голосов
/ 22 декабря 2011

Не могли бы вы опубликовать полный пример, который использует виджет автозаполнения?

Вот что я хотел сделать ...

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

... но this возвращает неопределенное значение. Сейчас я использую document.activeElement , но я бы предпочел метод Ника Крейвера.

...