jquery插件方法返回值不是对象

时间:2013-03-18 09:58:41

标签: jquery plugins methods return-value

我写了一个jq-plugin,我首先想要初始化所选元素(所有元素 - 每个)。 稍后在代码中我想获得一个方法生成的字符串。但它返回的只是对象,而不是我的字符串。

我在互联网上做了很多研究,但我不知道如何一方面使插件“可链接”,另一方面“返回任何值”。

你觉得怎么样?

(function($){
    var methods = {
        init: function(val){
            // Actions to initialize ALL selected Elements
        }
        ,
        returner: function(val){
            alert('working with every selected element: '+$(this).width());
            // return anything
            return 'STRING PRODUCED BY THIS FUNCTION!';
        }
    }

    $.fn.myplug = function(method){
        var args = arguments;
        var init = 'init-myplug';
        return this.each(function(){
            var is_init = $(this).data(init);
            if (is_init && methods[method]){
                return methods[method].apply($(this), Array.prototype.slice.call(args, 1));
            } else if (!is_init && (typeof method === 'object' || !method)){
                $(this).data(init, true);
                return methods.init.apply($(this), Array.prototype.slice.call(args, 0));
            }
        });
    };
})(jQuery);

$('.selects_5_elements').myplug(); // init

$('.selects_5_elements').myplug('returner'); // get the string

2 个答案:

答案 0 :(得分:2)

第一步是从您的方法中收集结果。目前,您尝试通过每个回调返回方法的结果,这不会起作用(每个回调中的返回值用于突破循环)。

我建议将所有结果收集到这样的数组中:

var results = [];
this.each(function(){
    var is_init = $(this).data(init);
    if (is_init && methods[method]){
        results.push(methods[method].apply($(this), Array.prototype.slice.call(args, 1)));
    } else if (!is_init && (typeof method === 'object' || !method)){
        $(this).data(init, true);
        results.push(methods.init.apply($(this), Array.prototype.slice.call(args, 0)));
    }
});

此时您只需返回结果数组即可。但是,如果您想允许某些方法可链接,而其他方法返回方法调用的结果,那么您需要检查方法名称以确定要返回的值。

if (method == 'returner')
    return results;
else
    return this;

另外,请注意我们在这里返回一个数组,而不是字符串。原因是将为匹配选择器的每个元素调用您的方法。因此,如果你有五个匹配元素,你将得到一个包含5个字符串的数组。

如果你真的只想要一个字符串,那么你需要决定如何处理所有的重复项。你想加入所有的字符串吗?或者只返回第一个字符串?或者只是最后一个字符串?所有选项都很容易做到 - 您选择的将取决于您的要求。

答案 1 :(得分:0)

您唯一需要做的就是将其置于EACH回调中:

if ( args.length === 0 ) {
   // Init your plugin
   return this;
}

if ( args[0] === "returner" ) {
   // Generate your string
   return "STRING PRODUCED BY THIS FUNCTION!";
}