2015-09-29 86 views
0

所以我仍然試圖圍繞自己的jQuery插件,但我很難搞清楚的一件事情是搞清楚如何從插件內部的函數內進行回調。當我在它的功能之外做回調時。功能內的jQuery插件回調

下面的例子已被削減,所以我不知道他們是否會工作,如果你自己嘗試。只是舉例

工作例如:

$.fn.mvSelect = function(options){ 
    var settings = $.extend({ 
     selectColor: "#cccccc", 
     search: true, 
     checkbox: true, 
     onItemSelected: function() { }, 
     onItemChecked: function() { } 
    }, options); 

    this.addClass("ulStyle"); 
    this.find("li").each(function(){ 
     $(this).addClass("itemStyle"); 

     $(this).click(function (e) { 
      $("*").removeClass("itemSelected"); 
      $(this).addClass("itemSelected"); 
      settings.onItemSelected.call($(this)); // <-- this one works 
     }); 
    }); 
}; 

非工作示例:

$.fn.mvSelect = function (options) { 
    var settings = $.extend({ 
     selectColor: "#cccccc", 
     search: true, 
     checkbox: true, 
     onItemSelected: function (e) { }, 
     onItemChecked: function (e) { } 
    }, options); 

    function refreshData() { 
     that.find("li").each(function() { 
      $(this).addClass("itemStyle"); 

      $(this).click(function (e) { 
       $("*").removeClass("itemSelected"); 
       $(this).addClass("itemSelected"); 
       settings.onItemSelected.call($(this)); // <-- Does not work 
      }); 

     }); 
     return that; 
    }; 

    if (someThing === "refreshData") 
     refreshData(); 
}; 

我認爲這有什麼用範圍做,因爲當我看着的該設置項目的作用域,它在非工作版本中顯示關閉幾次,而在工作版本中,它不顯示關閉。無論哪種方式,我似乎無法找到任何有關如何使其正常工作的信息。事件本身確實有效,它的回調不會讓我回到其他代碼。

回答

0

你在哪裏宣佈「那個」?因爲你正在使用函數(這意味着不同的範圍),所以你需要確保「this」每次都是相同的「this」。 innterfunction無法訪問外部。你可以使用:var that = this;在函數refreshdata處。然後在下面的代碼中使用「that」而不是「this」。我希望你明白我的意思。