初始化插件后如何在jquery插件中调用函数

时间:2017-05-19 15:32:17

标签: javascript jquery jquery-plugins

我',创建我自己的jQuery插件,可以将其分配给文档中的多个元素。在某些事件中,我希望在该插件中为该特定元素调用一个函数,但一切都让我发疯。插件本身有效,但存在外部调用问题。

简单的插件:

(function ( $ ) {
    $.fn.myPlugin = function (options) {
        var settings = $.extend({
            someOption: ""
        }, options);
        return this.each(function () {
            _init();
            _load();
        });
        function _init() {
            //some action..
        }
        function _load() {
            //some action..
        }
    };
    $.fn.myPlugin.reload = function () {
        _load(); //or this._load();
    }
}( jQuery ));

并在html中:

<div id="div1"></div>
<button id="button1">Click to reload</div>
<script>
    $(document).ready(function() {
        var A=$("div1").myPlugin({
            someOption:"someValue"
        });
        $("#button1").click(function(){
            A.reload();
        });
    });
</script>

返回始终是_load()未定义...任何想法都会非常感激。

2 个答案:

答案 0 :(得分:2)

在定义函数之前返回,如果不在更高的范围内,则无法从重载函数访问_load:

(function ( $ ) {
//function definitions:
    function _init() {
        //some action..
    }
    function _load() {
        //some action..
    }


 $.fn.myPlugin = function (options) {
     var settings = $.extend({
        someOption: ""
    }, options);

    return this.each(function () {
        _init();
        _load();
    });

};
$.fn.myPlugin.reload = function () {
    _load(); //
}
}( jQuery ));

请注意,可以像这样访问它:

 $.myPlugin.reload();

重新加载不是myPlugin实例的一部分。

如果要为每个实例返回自定义对象,请执行以下操作:

 (function ( $ ) {
 $.fn.myPlugin = function (options) {
     var settings = $.extend({
        someOption: ""
    }, options);

     //function definitions:
    function _init() {
        //some action..
    }
    function _load() {
        //some action..
    }
    //iterate
    this.each(function () {
        _init();
        _load();
    });

   return {
     reload:_load,
   };
};
}( jQuery ));

现在你可以做到

$("test").myPlugin().reload();

答案 1 :(得分:0)

A持有对jQuery对象的引用,因此具有$.fn的所有方法。 但是你的reload不是$ .fn的方法,而是$ .fn.myPlugin的方法。 如果你解决这个问题并考虑Jonas的答案,那么它应该可以工作;)