如何控制Javascript执行顺序?
我正在创建的网页存在一些并发问题。基本上,我有三个脚本文件用来保存一些数据: script1.js:如何控制Javascript执行顺序?,javascript,html,cross-browser,Javascript,Html,Cross Browser,我正在创建的网页存在一些并发问题。基本上,我有三个脚本文件用来保存一些数据: script1.js: var myValue = 1; var myValue = 2; var myValue = 3; script2.js: var myValue = 1; var myValue = 2; var myValue = 3; script3.js: var myValue = 1; var myValue = 2; var myValue = 3; 我有一个页面,mypage
var myValue = 1;
var myValue = 2;
var myValue = 3;
script2.js:
var myValue = 1;
var myValue = 2;
var myValue = 3;
script3.js:
var myValue = 1;
var myValue = 2;
var myValue = 3;
我有一个页面,mypage.html基本上是这样的:
<html>
<script>
function get_number()
{
var script_file = GetQueryStringValue( "run" );
e = document.createElement('script');
e.type='text/javascript';
e.src = script_file + ".js"
head.appendChild( e );
document.write( myValue );
}
</script>
<body onload="get_number()">
<div onclick="get_number()">Click me!</div>
</body>
</html>
function get_number()
{
var script_file = GetQueryStringValue( "run" );
e = document.createElement('script');
e.type='text/javascript';
e.src = script_file + ".js"
head.appendChild( e );
setTimeout( function() { document.write( myValue ), 10 } );
}
在大多数情况下,setTimeout延迟足以更新DOM和加载javascript。但是,这完全是一种黑客行为。Firefox倾向于一直正确加载这种“改进”的代码,而Chrome和Safari则在50%的时间内成功加载
所以,我想我在想,有没有更好的方法来完成我在这里要做的事情?外部驱动值(由查询字符串)非常重要,但除此之外,我非常灵活。这种使用诸如head.appendChild之类的DOM方法动态加载脚本文件的方法是异步的,这意味着页面在运行任何进一步的代码之前不会等待加载。如果不希望出现这种异步行为,可以使用HTML中的常规元素加载它们,也可以使用“同步”XMLHttpRequest获取它,然后使用eval()运行它 不过,您可能不想这样做,因为异步使整个页面的加载速度更快。您可能只需要添加一些逻辑,等待动态加载的脚本加载完毕,然后再继续下一段代码。但是,这可能涉及使用setInterval()进行轮询,直到您注意到包含的脚本中定义了一个变量。或者,您可以在所包含的脚本中添加代码,该脚本将方法调用到等待它的任何对象 或者,您可以看看jQuery是如何做类似事情的,看看ajax方法是在哪里定义的,特别是这些部分
var script = document.createElement("script");
// then later ...
script.onload = script.onreadystatechange = function(){
if ( !done && (!this.readyState ||
this.readyState == "loaded" || this.readyState == "complete") ) {
// do processing
head.removeChild( script );
}
};
// ...
head.appendChild(script);
您是否可以向脚本文件添加函数调用,以便在脚本文件运行时调用执行您的任务的函数
document.write( myValue );
因此,script1.js将
var myValue = 1;
scriptLoaded();
您的主文件将具有:
function scriptLoaded(){
document.write( myValue );
}
这就是我采用的解决方案,因为它被证明是如此简单。我觉得自己没有想到这一点有点傻!不过,谢谢你的其他回复。它们实际上都是可行的,可以解决我的问题。你认为异步这个词实际上被大多数人错误地使用了吗?我的意思是,你会认为异步意味着事情不会同时发生,或者是同步的。但是人们用它来表达相反的意思。我想我从来没有见过人们用它来表达相反的意思——你指的是什么?顺便说一句,由于XMLHttpRequest工作得更好,而且现在更受支持,所以这个答案中描述的轮询可能不再必要。