2012-12-10 42 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

哦,我不知道事件浏览器的兼容性,所以它取决于你。 –