函数

时间:2015-09-29 16:01:26

标签: jquery jquery-callback

所以我仍然试图绕过DIY 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();
};

我认为这与范围有关,因为当我查看该设置项的范围时,它在非工作版本中显示闭包几次,而在工作版本中,它不显示闭包。无论哪种方式,我似乎无法找到有关如何使其正常工作的任何信息。事件本身确实有效,它的回调并没有让它回到我的其他代码。

1 个答案:

答案 0 :(得分:0)

你在哪里宣布&#34;那&#34;?因为你正在使用函数(这意味着不同的范围),你需要确保&#34;这个&#34;是相同的&#34;这&#34;每次。一个innterfunction无法访问外部。你可以使用:var that = this;在函数refreshdata。然后使用&#34;那&#34;而不是&#34;这个&#34;在以下代码中。我希望你明白我的意思。