【问题标题】:Load variables into async JS?将变量加载到异步 JS 中?
【发布时间】:2012-03-18 14:52:50
【问题描述】:

我正在尝试将一些变量放入我正在加载的脚本中。目前,我喜欢

window.myApp = {
    id: ''
};

我正在加载类似的 javascript

(function() {
    var s = document.createElement('script');
    s.type = 'text/javascript';
    s.async = true;
    s.src = 'http://blah.com/widget.js';
    var x = document.getElementsByTagName('script')[0];
    x.parentNode.insertBefore(s, x);
  })();

widget.js 有命名空间window.myApp,我正在尝试将.id 加入其中?我该怎么做?

【问题讨论】:

  • 如果widget.js在你调用脚本之前在页面中插入使用它你需要的任何方式myApp.id .......如果不是在你有问题之前

标签: javascript jquery namespaces


【解决方案1】:

您需要一个事件处理程序来处理要插入的脚本标签的load 事件,如下所示:

if (s.attachEvent) {
    s.attachEvent("onload", function () {
        window.myApp.id = '';
    });
} else {
    s.addEventListener("load", function () {
        window.myApp.id = '';
    });
}

这会为脚本的load 事件添加回调,即使对于 IE 也是如此。在s.async = true;这一行之后插入这段代码

【讨论】:

  • 谢谢 :) 有没有办法在 widget.js 中代替?
【解决方案2】:

在 widget.js 中你可以这样做:

var alreadyDefinedProps = window.myApp;

window.myApp = {
   // whatever properties widget.js has currently
}

if (alreadyDefinedProps) {
   for (var prop in alreadyDefinedProps)
       window.myApp[prop] = alreadyDefinedProps[prop];
}

也就是说,存储一个对现有window.myApp 对象的引用,然后将window.myApp 设置为另一个对象,然后复制属性。您可以添加一个if 测试来处理在两个 JS 文件中定义相同属性的情况。

【讨论】:

  • 如果你给它另一个名字,你真的不需要alreadyDefinedProps 变量:这是一种让你使用相同的命名空间名称但添加属性的方法,我使用了@987654327 @loop 以允许将来扩展超出单个 id 属性。您可能想改编本文中的一些技术:adequatelygood.com/2010/3/JavaScript-Module-Pattern-In-Depth
  • 感谢您的链接。仍然有点困惑,但是如何将 window.myApp 放入 widget.js 中 - 使用上述技术 - 它仍然没有加载?
  • 您在问题中显示的初始代码是否在与您创建脚本元素的页面相同的页面中定义了windowmyApp = { id:'' }
  • 多哈!!哦刚刚想通了... :) 咖啡时间一个人认为。太棒了,感谢您的帮助和闲逛!你摇滚!
【解决方案3】:

加载脚本后,您可以从 myApp 对象读取或写入属性。要检测异步脚本何时加载,您可以在加载时捕获事件。有关如何执行此操作的详细信息,请参阅this reference

【讨论】:

    猜你喜欢
    • 2012-06-11
    • 1970-01-01
    • 2014-08-08
    • 2016-07-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-10-16
    • 1970-01-01
    相关资源
    最近更新 更多