【问题标题】:I need a shorter access to my jQuery Plugin methods我需要更短的访问我的 jQuery 插件方法
【发布时间】:2013-06-20 20:42:23
【问题描述】:

可能已经像这样回答了一个问题,但是搜索了一段时间后,我找不到与此模式匹配的明确答案。

所以在最基本的层面上,我的插件如下所示,一旦元素通过了它,我想要做的就是能够对插件的方法有一个简短的引用,例如:

在元素上初始化插件:

$('#myElement').myPlugin({ options });

然后访问一个方法:

$('#myElement').myPlugin('myFirstMethod', { params });

这是插件外壳:

;(function($) {
    "use strict";
    var plugin = {};
    var defaults = {
        myDefault:        'some_value'
    };

    $.fn.myPlugin = function(options){        

        if(this.length > 1){
            this.each(function(){$(this).myPlugin(options);});
            return this;
        }

        var myplugin = {};
        var element = this;
        plugin.element = this;

        var init = function() {
            myplugin.settings = $.extend({}, defaults, options);
            // Other init stuff here
        };

        form.myFirstMethod = function(){
            // Do something
        };

        form.mySecondMethod = function(){
            // Do something else
        };

        init();
        return this; // returns the current jQuery object

    }

})(jQuery);

再一次,我确信这个问题必须在某个地方得到回答。我只需要对方法的“最短”访问。

谢谢。

【问题讨论】:

    标签: jquery plugins jquery-plugins


    【解决方案1】:

    我个人讨厌 pluginName('method', 'params') 调用方法,因为它没有为您提供 javascript 提供的完整工具包。另外,我不喜欢为两种不同的目的调用相同的方法。在您的情况下,您希望 $().myPlugin() 初始化并 $().myPlugin("methodName") 执行方法。这是myPlugin() 的一种方法,用于两个完全不同的目的。但如果这就是你想要滚动的方式,我相信下面的 sn-p 就足够了。

    // plugin
    (function($) {
        var myplugin = function(elm) {
            this.elm = $(elm);
        };
    
        myplugin.prototype.myFirstMethod = function() { console.log("firstmethod"); }
        myplugin.prototype.mySecondMethod = function() { console.log("secondmethod"); }
    
        $.fn.myplugin = function() {
            var myArgs = arguments;
            return this.each(function() {
                if (!$(this).data("myplugin")) {
                    $(this).data("myplugin", new myplugin(this));
                }
    
                var api = $(this).data("myplugin");
    
                if (myArgs.length > 0) {
                    api[myArgs[0]](myArgs[1]);
                }
            });
        };
    })(jQuery);
    
    // init plugin
    $(".foo").myplugin();
    
    $(".foo").myplugin("myFirstMethod");
    

    请记住,如果您想对 jquery 集合的每个元素执行此方法,您需要执行 each 并执行。

    这行得通吗?

    【讨论】:

    • 我绝对不想像上面的 api 那样为我的插件的每个实例都定义一个变量。如果它可以像$('#foo').myFirstMethod(params);那样使用,那就更好了。
    • 在说之前,我想摆脱的是:$('#foo').data('myPlugin').myFirstMethod(params); 除非这是我在这里唯一的度假胜地。
    • 这个插件会应用于许多节点,每个节点都有自己的实例,还是每页基本上只有一个?
    • 一对多。这个插件用于表单,基本上会被称为:$('form').myPlugin({options});
    • 要像这样使用:$('#foo').myFirstMethod(params); 你需要创建一个 jquery 原型:$.fn.method
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-12
    • 1970-01-01
    相关资源
    最近更新 更多