2

我正在使用以下模式编写一个 jquery 插件,并且我希望该bar函数返回内在价值,但它似乎总是返回$(this)
代码有什么问题吗?

(function($){

    var Foo = function(elements, options){
    ... ...
    }


    Foo.prototype = {

        constructor: Foo,

        bar: function(){
            var value = ...        
            // do something here
            return value;
        },

    }

    $.fn.foo = function (option, kwargs){  
        return this.each(function(){ 
            var $this = $(this),
                data = $this.data('foo'),
                options = typeof option == 'object' && option

            if (!data) $this.data('foo', (data = new Foo(this, options)))
            if (typeof option == 'string') return data[option](kwargs)
        })            
    }


})(jQuery)
4

2 回答 2

5

不,代码是正确的。问题是它当前设置为始终返回一个 jQuery 选择器(的返回值this.each)。要改为返回函数的结果,您可以$.fn.foo像这样修改函数:

$.fn.foo = function (option, kwargs){  
    var retval = null;

    this.each(function(){ 
        var $this = $(this),
            data = $this.data('foo'),
            options = typeof option == 'object' && option

        if (!data) $this.data('foo', (data = new Foo(this, options)))
        if (typeof option == 'string') {
          retval = data[option](kwargs);
        }
    })

    if (!retval) {
      retval = this;
    }

    return retval;
}
于 2012-05-06T03:08:48.610 回答
1

在外部函数中,您编写了returnthis.each(...);`。

this.each总是返回你调用它的 jQuery 对象(用于链接);它会忽略您传递给它的回调的返回值。

如果要从回调中返回一个值,请将该值放入一个变量中,然后在调用后返回该变量each。(这将起作用,因为each它不是异步的)。
如果您的方法在具有两个元素的 jQuery 对象上调用,您将需要弄清楚该怎么做;您可能想完全摆脱each通话。

于 2012-05-06T03:08:14.787 回答