是否可以调用.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(使用前将#替换为@)