Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/html/89.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何控制Javascript执行顺序?_Javascript_Html_Cross Browser - Fatal编程技术网

如何控制Javascript执行顺序?

如何控制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

我正在创建的网页存在一些并发问题。基本上,我有三个脚本文件用来保存一些数据:

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.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工作得更好,而且现在更受支持,所以这个答案中描述的轮询可能不再必要。