2012-12-10 71 views
1

所以在我的網站上有一個Javascript函數,它將通過XMLHttpRequest從服務器加載一個新的站點。之後,它用新的替換當前頁面:Javascript document.open異步?

var post = new XMLHttpRequest(); 
post.open('POST', data); 
post.onload = function() { 
    var do = document.open("text/html", "replace"); 
    do.write(post.responseText); 
    do.close(); 
    goOn(); 
} 

function goOn() { 
    console.log($('img:visible')); 
} 

一些可以假設do.close()後,該文件已經改變,並準備。但它不是,例如如果我加載非常多/大數據/ responseText函數goOn()只記錄一個空的結果。很明顯,goOn()會在DOM準備好被讀取之前調用! 不幸的是,write()完成後沒有「準備就緒」事件被觸發.... 我如何確定它已完成?

/編輯: 打手()記錄這個Chrome瀏覽器控制檯:

[prevObject: p.fn.p.init[1], context: #document, selector: "img:visible"] 
context: #document 
length: 0 
prevObject: p.fn.p.init[1] 
selector: "img:visible" 
__proto__: Object[0] 

但是,如果我這種類型的$( 'IMG:可見')後直接進入控制檯手動它顯示我的所有圖片... 。

+2

N.B .:'do'是JavaScript中的保留字。 –

+0

是的,我實際上縮短了代碼的變量名稱以保持清晰度 –

回答

2

沒有試圖附加ready事件到您的文檔,你可以嘗試像下面,

var post = new XMLHttpRequest(); 
post.open('POST', data); 
post.onload = function() { 
    var do = document.open("text/html", "replace"); 
    $(do).ready(function() { goOn(); }); 
    do.write(post.responseText); 
    do.close(); 

} 

function goOn() { 
    console.log($('img:visible')); 
} 

編輯:

是的,我嘗試過的提琴手但JS事件,像下面和here

var docx = document.open(); 
docx.onreadystatechange = function() { alert(this.readyState) }; 
alert(docx); 
docx.write("<div>test test test test ttetst <br /></div><div>test test test test ttetst <br /></div><div>test test test test ttetst <br /></div><div>test test test test ttetst <br /></div><div>test test test test ttetst <br /></div><div>test test test test ttetst <br /></div><div>test test test test ttetst <br /></div><div>test test test test ttetst <br /></div>"); 

docx.close();​ 

之後,它complete只是檢查就緒狀態,做你的東西。

我認爲這一個將會訣竅。

+0

可悲的是,這也不起作用:( –

+0

@AlexSchneider嗨,我已經添加了另一個這個時間工作的解決方案,只留下另一個解決方案,以供將來參考 –

+0

哦,我不知道事件瀏覽器的兼容性,所以它取決於你。 –