javascript - 扩展 jQuery 插件并更改默认值

标签 javascript jquery jquery-plugins

我有一个名为“myPlugin”的插件,它使用默认值的常用设计模式,可以在初始化时覆盖它。

我不想在初始化时传递覆盖值,而是希望将插件扩展为“myPlugin2”并更改默认值,以便当我启动扩展插件时,它已经具有所需的新默认值。

我尝试过向扩展插件添加新方法,但我不知道如何更改默认值。

换句话说,我希望这两行代码提供相同的结果。

$("body").myPlugin({'prop1':'prop1 modified','default_func4':function () {console.log('default_func4 modified')}});
$("body").myPlugin2();

如何扩展 jQuery 插件并更改默认值?

http://jsfiddle.net/L1ng37wL/2/

<!DOCTYPE html>
<html>
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
        <title>Testing</title>  
        <script src="https://ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.js" type="text/javascript"></script>
        <style type="text/css">
        </style> 
        <script type="text/javascript"> 
            (function ($) {

                var defaults = {
                    'prop1'  : 'prop1',
                    'default_func4'  : function () {console.log('default_func4');},
                    'default_func5'  : function () {console.log('default_func5');}
                };
                var methods = {
                    init: function (options) {
                        console.log("init");
                        console.log('defaults',defaults);
                        console.log('options',options);
                        var settings = $.extend({}, defaults, options);
                        console.log('settings',settings);
                        console.log('The value of "prop1" is '+settings.prop1);
                        settings.default_func4.call()
                    },
                    func1: function () {console.log("func1");},
                    func2: function () {console.log("func2");}
                };

                $.fn.myPlugin = function (method) {
                    // Method calling logic
                    if (methods[method]) {
                        return methods[method].apply(this, Array.prototype.slice.call(arguments, 1));
                    } else if (typeof method === 'object' || !method) {
                        return methods.init.apply(this, arguments);
                    } else {
                        $.error('Method ' + method + ' does not exist');
                    }
                };

            })(jQuery);

            (function ($) {

                var methods = {
                    'func1': function () {console.log("myPlugin2: func1");},
                    'func3': function () {console.log("myPlugin2: func3");}
                }
                $.fn.myPlugin2 = function (method) {
                    //HOW DO I CHANGE defaults.prop1 and defaults.default_func5?????
                    // Method calling logic
                    if (methods[method]) {
                        return methods[method].apply(this, Array.prototype.slice.call(arguments, 1));
                    } else if ((typeof method === 'object' || !method) && methods.init) {
                        return methods.init.apply(this, arguments);
                    } else {
                        try {
                            return $.fn.myPlugin.apply(this, arguments);
                        } catch (e) {
                            $.error(e);
                        }
                    }
                }

            })(jQuery);

            $(function(){
                $("body").myPlugin({
                    'prop1':'prop1 modified',
                    'default_func4':function () {console.log('default_func4 modified')}
                });

                $("body").myPlugin2();
                //$("body").myPlugin2('func1');
                //$("body").myPlugin2('func2');
                //$("body").myPlugin2('func3');
            });

        </script>
    </head>

    <body>
    </body> 
</html> 

最佳答案

对方法参数的双重检查对我来说有点奇怪,但是如果我将 try block 中的单行替换为下面的代码,事情就会像它应该的那样工作,同时仍然允许您提供一个对象甚至不同的选择。

var args = arguments;
if (typeof method === 'object' || !method) {
   // Fill args with the new defaults.
   args = {
      'prop1': 'prop1 modified',
      'default_func4': function () {
         console.log('default_func4 modified')
      }
   };
   $.extend(args, method);
   args = [args];
}
return $.fn.myPlugin.apply(this, args);

关于javascript - 扩展 jQuery 插件并更改默认值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26363235/

相关文章:

javascript - 在html文件中<%标签

javascript - Google Map API setCenter 方法不起作用

javascript - Fyneworks jQuery 星级评分插件 - 一半评分

javascript - 请帮我把这个脚本转换成一个简单的图像 slider

javascript - 完成 Google 表单后,如何在 Google 电子表格中现有工作表的末尾创建新行?

javascript - JQuery/Javascript 清除/重置下拉列表至原始值

javascript - 如何在 jQuery 插件中编写回调处理函数

javascript - 编写一个函数来获取所有具有 data 属性的元素

jquery - Highcharts,在日期时间 x 轴类型上显示特定刻度

javascript - 动态打印两个不同字符串中的替代字符串字符