2012-01-05 106 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