2012-01-05 105 views
2

如何在移动到HTML代码中的下一行之前确保Javascript函数已完成。在HTML中等待Javascript函数完成

例如:我在main()中有一个Javascript代码并调用如下所示。在完成之前,下一行HTML代码就像加载JPEG一样显示在浏览器中。 有什么办法可以确保main()调用完全执行。

<script language="JavaScript" type="text/javascript"> main();</script> 

你们有些人猜中,可能是在主()的调用asynchroous它使用一个XMLHttpRequest()来得到一些我需要形成网页中的值。功能主要是如下

function main() 
{ 
    var requestor = new net.Requestor("admin/getparam.cgi?mainvideostream&codectype", CurrentHandler); 
} 
此thers内

和net.Requestor =函数(URL,有载,的onerror,方法,则params,则contentType) 被和XMLHttpRequest的(...)

而Currenthandler是另一个处理来自requset的响应的函数。

function CurrentHandler() 
{ 
    settings = this.req.responseText.split("\n");  
    for(var j=0; j<settings.length-1; j++) 
    { 
     var currentST= settings[j].split("=");  
     name = currentST[0]; 
     value = currentST[1]; 
     switch(name)  
     { 
     case "mainvideostream": cur_camid = value; break; 
      case "codectype": stream = value; break; 
     }  
    } 
    mainSection(); 
    } 

所以我必须在加载页面之前找出流变量。

+1

我假设'main'功能有一定的异步代码。你可以显示代码的功能? – 2012-01-05 17:39:48

+0

我想你想延迟整个页面加载,直到这一点的JavaScript已完成? – Jimmery 2012-01-05 17:43:37

+3

JavaScript异步运行,页面异步加载。尽管有一些方法可以阻止JS(一个非常糟糕的主意),但您永远无法阻止浏览器同时加载其他内容(用户也不希望网站尝试控制该内容)。问题是:为什么你想要/需要这个功能? – Rudu 2012-01-05 17:44:06

回答

2

简短的回答是否定的,没有(安全的,符合标准)的方式来停止加载页面,而你脚本运行。

通常,这是工作,围绕一个的方法有两种:

  1. 隐藏你不想页面上的元素似乎通过他们的CSS display属性设置为加载none。在脚本末尾添加一个命令,以重置这些元素的显示属性。

  2. 将您不想初始加载的元素移动到单独的HTML文件中。在脚本执行结束时,将AJAX调用回服务器以获取第二个文件并将其加载到主文件中的适当位置。

0

如果您的main代码不是异步执行的,您应该在DOM加载事件后绑定您的代码。使用jQuery:

$(document).load(function(){ 
main(); 

}); 

或不jQuery的,在你的身体标记:

<body onload="main()"> 
0

好的,因为这里的其他人已经注意到事情的一般顺序是加载页面,然后运行JavaScript。不过,你可以使用Ajax来解决这个问题。基本思路是这样的:

用空白页面创建一个空白页面,当空白页面加载完成后运行,然后在这个javascript代码块结束时,通过ajax调用页面内容。

继承人一些jQuery代码会做同样的事情:

<script> 
$(document).load(function(){ 

//YOUR CODE HERE// 

$.ajax({ 
    type:"GET", 
    url:"", // <-- url of the contents of your page here 
    dataType:"text", 
    success:function(data){ 
    $(".container").html(data); 
    }, 
    error:function(jqXHR,textStatus,errorThrown){ 
    $(".container").html("<pre>"+textStatus+"</pre><pre>"+errorThrown+"</pre>"); 
    } 
}); 
</script> 
<body> 
<div class="container"></div> 
</body> 
+0

有反正我能做到这一点没有Ajax – Karthika 2012-01-06 14:48:06

+0

肯定,而不是使网页内容中通阿贾克斯,你总是可以得到javascript写出来的页面,就像这样: ' $(“。container”)。html(“_ YOUR PAGE CONTENT HERE _”);' 但是id想象一下ajax会更加整洁,并且从长远来看更容易维护。 你为什么要避开ajax?你想让你的代码块实现加载的页面内容吗?因为这仍然可以在成功功能中完成。 – Jimmery 2012-01-06 15:10:36