1

我在一个外部文件中有一些 Javascript 代码,它将供人们在他们自己的网站上使用......所以我想要一些方法让他们能够传递多个选项......我该怎么做?

对不起,更多信息:

我会给他们 html + script + css 来加载:

    <div class="mywidget"></div>
    <script src="app.js"></script>
    <link rel="stylesheet" type="text/css" href="style.css" />

在脚本中(一些代码):

            var App = {

            init: function(){

                /* ----------------------------
                    On initialization....
                ---------------------------- */

                    App.doStuff(), App.doMoreStuff();

                },
                doStuff: function(){
                  alert('hi');
                }
            }

所以我基本上希望他们能够自定义我的应用程序的工作方式......所以假设我希望他们自定义警报或任何其他数量的东西。

4

4 回答 4

2

像 jQuery 一样做。有一个选项对象的参数,如果没有传递,则默认选项:

var yourFunc = function (options) {
    options = $.extend({
        prop1: 'default1',
        prop2: 'default2'
    }, options || {});

    // do stuff with options
};

如果您不使用 jQuery,您可以$.extend通过循环遍历属性并在它们未定义时替换它们来轻松存根。

于 2012-09-17T17:21:59.090 回答
2

标准解决方案(例如由 jQuery 使用)是在您的函数(或配置函数)中仅接收一个参数作为参数,作为 map 处理:

   func veryFreeFunction(opts) {
      opts = opts || {}; 
      var a = opts.a || "default_a";
      var b = opts.b || "default_b";
      ...
   }

在这种情况下,用户可以调用veryFreeFunction();veryFreeFunction({b:"test"});。他只会传递他需要的参数。

于 2012-09-17T17:22:16.113 回答
0

我相信这类事情的标准是将 JSON 对象传递给库的静态函数或对象构造函数,然后将输入参数与库的默认参数合并。

例如:

// Your library
function myLibObj(options){
    var default_options = {
         opt_1: "abc",
         opt_2: "def"
    };

    // Merge options
    $.extend(default_options, options);
}

var newObj = new myLibObj({opt_1: "ghi"});
// Now in this newObj, the options will look like {opt_1: "ghi", opt_2: "def"}
于 2012-09-17T17:23:42.073 回答
0

一种方法是让外部文件查找脚本标记本身中的配置块:

   <script type="text/javascript" src="myfile.js">
    var mySettings = {
            instanceName: 'homepage',
            cfg: {
                containerId: 'homepage-slide',
                columnsCount: 6,
                placeholder: true,
            }
    }

    </script>
于 2012-09-17T17:23:43.467 回答