2012-10-06 57 views
1

我不知道我怎麼可以同步下面的代碼:JavaScript的同步

javascript: (function() { 
    var s2 = document.createElement('script'); 
    s2.src = 'http://192.168.0.100/jquery.js'; 
    document.body.appendChild(s2); 
    s = document.createElement('link'); 
    s.rel = "stylesheet"; 
    s.href = "http://192.168.0.100/1.css"; 
    s.type = "text/css"; 
    document.body.appendChild(s); 
})(); 
//var startTime = new Date().getTime(); 
//while (new Date().getTime() < startTime + 1000); 
$(document).ready(function(){ 
    b="c:\\1.txt"; 
    var fso, f1; 
    fso = new ActiveXObject("Scripting.FileSystemObject"); 
    f1 = fso.CreateTextFile(b, true); 
    f1.WriteLine("Testing") ; 
    document.writeln("File " + b + " is created."); 
}); 

當我在第一次運行該腳本,我得到一個錯誤​​。我認爲這是因爲jQuery庫尚未加載。當我嘗試在錯誤追加後運行相同的腳本時 - 它的行爲是正確的。對於同步化,我嘗試使用在上面列表中註釋的代碼。是作品(並非總是)。但我知道這並非嚴格的同步(它取決於具體的情況)。我怎樣才能使用更聰明的同步?

回答

1

這是由於通過appendChild dhtml方法將script標記放入標記使其評估異步。要在文檔上對其進行「準備」,請按照此模式進行操作

(function() { 
    var s2 = document.createElement('script'); 
    s2.src = 'http://192.168.0.100/jquery.js'; 
    document.body.appendChild(s2); 
    s2.onload = s2.onreadystatechange = function(){ 
     if(s2.readyState == "complete") $(document).ready(function(){ 
     b="c:\\1.txt"; 
     var fso, f1; 
     fso = new ActiveXObject("Scripting.FileSystemObject"); 
     f1 = fso.CreateTextFile(b, true); 
     f1.WriteLine("Testing") ; 
     document.writeln("File " + b + " is created."); 
     }); 
    } 
    s = document.createElement('link'); 
    s.rel = "stylesheet"; 
    s.href = "http://192.168.0.100/1.css"; 
    s.type = "text/css"; 
    document.body.appendChild(s); 
})(); 
+0

您確定'onreadystatechange'只在加載完成後觸發腳本嗎?在'XMLHttpRequest'對象中,它會觸發'readyState'幾次,直到它完成時它最終到達'4'。 – icktoofay

+0

true,thx - script.readyState ==「complete」是需要的 – mschr

+0

你好,這很漂亮,但我得到SCRIPT5009:'script'是undefined – abilash

2
(function($){ 
    //use $ now 

    $(function(){ 
    //dom ready 
    }); 

})(jQuery); 

請務必在jquery庫下面的頁腳中加載這個庫。

0

問題是當添加了腳本標記但文件已下載之前,正在命中帶有$的行。正常情況下,瀏覽器在加載JavaScript時會阻止此問題,但由於您正在以編程方式執行此操作,因此無法獲得標準同步。

最好的辦法是等待腳本加載。這裏有信息:

Dynamic, cross-browser script loading

在捕獲load事件的腳本下載完成。然後,您可以將現有的$ ready函數作爲該事件的回調函數。我建議使用一個用於這個東西的裝載器,或者只是在DOM中使用一個標準的腳本標籤,除非你有一個令人信服的理由不要。