document.createElement("script") 同步

2024-01-25

是否可以调用.js同步文件然后立即使用?

<script type="text/javascript">
    var head = document.getElementsByTagName('head').item(0);
    var script = document.createElement('script');
    script.setAttribute('type', 'text/javascript');
    script.setAttribute('src', 'http://mysite/my.js');
    head.appendChild(script);

    myFunction(); // Fails because it hasn't loaded from my.js yet.

    window.onload = function() {
        // Works most of the time but not all of the time.
        // Especially if my.js injects another script that contains myFunction().
        myFunction();
    };
</script>

这是简化的。在我的实现中,createElement 的东西在一个函数中。我考虑向该函数添加一些内容,以便在返回控制之前检查某个变量是否已实例化。但是仍然存在一个问题,当包含来自我无法控制的另一个站点的js时该怎么办。

想法?

Edit:

我现在已经接受了最佳答案,因为它很好地解释了正在发生的事情。但如果有人对如何改进这一点有任何建议,我愿意接受他们。这是我想做的一个例子。

// Include() is a custom function to import js.
Include('my1.js');
Include('my2.js');

myFunc1('blarg');
myFunc2('bleet');

我只是想避免过多了解内部结构,并且能够说:“我希望使用这个模块,现在我将使用其中的一些代码。”


您可以创建您的<script>带有“onload”处理程序的元素,当浏览器加载并评估脚本时将调用该处理程序。

var script = document.createElement('script');
script.onload = function() {
  alert("Script loaded and ready");
};
script.src = "http://whatever.com/the/script.js";
document.getElementsByTagName('head')[0].appendChild(script);

您无法同步执行此操作。

edit— 有人指出,按照形式,IE 不会触发“加载”事件<script>正在加载/评估标签。因此我想接下来要做的就是使用 XMLHttpRequest 获取脚本,然后eval()你自己吧。 (或者,我想,将文本填充到<script>您添加的标签;的执行环境eval()受本地范围的影响,因此它不一定会执行您希望它执行的操作。)

edit截至2013年初,我强烈建议寻找一个更强大的脚本加载工具,例如要求 http://requirejs.org。有很多特殊情况需要担心。对于非常简单的情况,有yepnope http://yepnopejs.com/,现在内置于现代化 http://modernizr.com/.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

document.createElement("script") 同步 的相关文章

随机推荐