【问题标题】:Passing in defaults within window.onload?在 window.onload 中传递默认值?
【发布时间】:2011-02-12 14:12:20
【问题描述】:

我现在明白以下代码将不起作用,因为我将 window.onload 分配给函数的结果,而不是函数本身。但是如果我删除括号,我怀疑我必须在 onload 之前显式调用一个单独的函数来处理配置。所以,我现在有:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<HEAD>
<script type="text/javascript" src="lb-core.js"></script>
<script type="application/javascript">
var lbp = {
    defaults: {
        color: "blue"
    },
    init: function(config) {
        if(config) {
            for(prop in config){
                setBgcolor.defaults[prop] = config[prop];
            }
        }
        var bod = document.body;
        bod.style.backgroundColor = setBgcolor.defaults.color;
    }
}
var config = {
    color: "green"
}
window.onload = lbp.init(config);
</script>
</HEAD>
<body>
<div id="container">test</div>
</body>
</HTML>

我想我必须将其更改为:

var lbp = {
    defaults: {
        color: "blue"
    },
    configs: function(config){
            for(prop in config){
                setBgcolor.defaults[prop] = config[prop];
            }
    },
    init: function() {
        var bod = document.body;
        bod.style.backgroundColor = setBgcolor.defaults.color;
    }
}
var config = {
    color: "green"
}

lbp.configs(config);
window.onload = lbp.init;

然后,为了让人们使用这个脚本并传入配置,他们需要分别调用这两条底线(configs 和 init)。有更好的方法吗?

注意:如果您的答案是捆绑window.onload的功能,请同时确认在脚本中分配window.onload是没有危险的。我的理解是,在我自己之后的另一个脚本实际上可能会覆盖我分配给 onload 的内容。考虑到这一点,最好期望您的脚本用户自己在初始化时调用该函数。

【问题讨论】:

    标签: javascript configuration config onload


    【解决方案1】:

    使用匿名函数传递选项,如下所示:

    window.onload = function() { lbp.init(config); };
    

    如果您担心被覆盖,请选择不引人注目的路线,like this

    或者,您可以使用一个库来满足您的 javascript 需求,例如我为此使用 jQuery,它看起来像这样:

    $(function() { lbp.init(config); });
    

    获取一个库这有点过头了,但如果你有很多javascript,我建议你使用look at what's available

    【讨论】:

    • 将其硬编码到 init 中并在没有括号的情况下调用它会不会很糟糕?例如,我可以测试 lbpConfig,如果它存在,那么我可以应用它的设置吗?此脚本不会在同一页面上多次初始化...
    • re: 库 - 我喜欢 jQuery,但我正在尝试学习老式的 javascript。我也在尝试在没有依赖的情况下构建它,因此人们可以在使用时选择自己的库。
    • @Matryn - 我猜这取决于你在做什么,你可以做.init(config || {}),如果它存在,它将通过配置,如果它不存在,则为空/无选项。
    • 我想我让这变得比它需要的更复杂。是否有任何理由不让用户通过调用 lbp.defaults {color:"red"} 来设置默认值
    • @Matrym - 他们当然可以这样称呼它,或者.init({ color: 'red'}),想想事情的顺序,你的代码会在外部脚本中吗?如果是这种情况,请确保他们设置默认值的方式和时间在onload 事件触发之前执行。
    【解决方案2】:

    调用 init 可能会返回一个匿名函数。像这样的:

    var lbp = {
        defaults: {
            color: "blue"
        },
        init: function(config) {
            for(prop in config){
                setBgcolor.defaults[prop] = config[prop];
            }
            return function() {
                var bod = document.body;
                bod.style.backgroundColor = setBgcolor.defaults.color;
            };
        }
    }
    window.onload = lbp.init({color: "green"});
    

    【讨论】:

      猜你喜欢
      • 2014-04-09
      • 1970-01-01
      • 2015-11-12
      • 1970-01-01
      • 1970-01-01
      • 2016-05-11
      • 2016-12-14
      • 2014-09-05
      • 1970-01-01
      相关资源
      最近更新 更多