2010-02-12 51 views
0

我正在使用內部自定義庫來複制jsonp調用。在你們問我使用JQuery或其他庫之前,讓我告訴我由於某些限制而無法使用它。JavaScript腳本動態腳本加載IE6問題

下面是用來做請求的代碼:

 
BurrpJsonAjaxRequest.prototype.send = function() { 
    this.script = document.createElement("script"); 
    this.script.type = "text/javascript"; 
    this.script.charset = "UTF-8"; 
    this.script.src = this.URL; 

    if (typeof(this.callBack) == "function") { 
    this.script.callback = this.callBack; 
    } 

    var currRequest = this; 

    //sleep(100); 

    if (this.script.src.readyState) { //IE 
    this.script.src.onreadystatechange = function() { 
     if (this.script.src.readyState == "loaded" || 
     this.script.src.readyState == "complete") { 
     this.script.src.onreadystatechange = null; 
     currRequest.hideLoading(); 
     currRequest.callback(); 
     } 
    }; 
    } else { //Others 
    this.script.src.onload = function() { 
     currRequest.hideLoading(); 
     currRequest.callback(); 
    }; 
    } 


    this.docHead.appendChild(this.script); 
}; 

這工作是第一次執行。在後續執行中,請求已完成,但回調未執行。

如果我使用如下的睡眠方法(在代碼中註釋),則回調也會在隨後的調用中執行。

 
function sleep(milliseconds) { 
    var start = new Date().getTime(); 
    for (var i = 0; i milliseconds){ 
     break; 
    } 
    } 
} 

睡眠如何影響回撥的執行?在Firefox中運行良好。

回答

0

第一次通過,this.script.src.readyState是false(腳本仍在加載)併爲onLoad事件創建了一個處理程序。當onLoad被觸發時,匿名的onLoad函數被調用 - 這看起來與onReadyStateChange處理程序非常相似。然而,onLoad只觸發一次,所以你的函數只被調用一次。

睡眠會減慢執行enuf,因此當您執行if語句時,您的this.script.src.readyState爲true

您認爲如何?

+0

我使用這個作爲一個對象,我每次使用它時都會實例化對象。此外,它在Firefox中工作得非常好。唯一的問題是IE6。 – Abhi 2010-02-12 18:23:53

+0

睡眠有一個影響的事實表明一個時間問題(顯然)。你是否嗅探過從IE6到服務器的流量並將其與FF流量進行比較? – Upperstage 2010-02-12 18:43:34

+0

我正在使用Fiddler並嘗試查看請求響應。無論哪種情況(有睡眠和無睡眠),都會發送請求並收到響應,但萬一沒有睡眠提琴手會告訴我會話被中止。這是什麼意思? IE正在中止會話? – Abhi 2010-02-15 08:42:40