0

我的插件允许您在其选项中指定回调。该插件可能在 DOM 准备好之前运行,但我需要确保回调仅在 DOM 准备好后运行,因此我将其包装callback.call()$( document ).ready()处理程序中。

问题是我想在回调中维护插件的上下文。换句话说,在回调中,我想this成为插件,而不是document.

这是我想出的,但我不确定这是否真的是最好的方法。

function MyPlugin( element, options ){
    this.element = element;
    this.options = $.extend( {}, defaults, options );

    MyPlugin.prototype = {
        functionWithCallback: function(){
            if ( typeof this.options.callback == 'function' )
                $( document ).ready( function( plugin ){ plugin.options.callback.call( plugin ) }( this )
        }
    }
}

最后一行很难看,但它允许我将插件的this上下文传递给回调。

我宁愿这样做$( document ).ready( this.options.callback )并完成它,但是在回调中,thisdocument并没有真正帮助,并且不一定让我轻松访问调用插件的元素......

有没有更好的办法?

4

1 回答 1

1

Function.prototype.call是这种情况的完美解决方案。

调用具有不同上下文的函数this是它的用途的一部分。

如果您想要一个更优雅但 ES5 的解决方案(仅限较新的浏览器),您可以使用.bind

 $(document).ready(plugin.options.callback.bind(plugin));

Bind 设置函数this在调用时的值(以及可选的其他参数)。这是一个如何工作的示例。.bind

$.proxy如果您想使用,jQuery会对其进行填充。

你也可以做

$(plugin.options.callback.bind(plugin));
于 2013-05-21T19:55:50.217 回答