Chr*_*ker 8 javascript ajax iframe firefox mootools
我有一个类,它允许通过AJAX提交带有文件类型输入的表单.它创建一个隐藏IFRAME元素,更改表单target属性,以便它提交IFRAME,提交表单,然后将目标更改回原来的状态.它还添加了一个onLoad事件,IFRAME所以我可以得到一个回调.该onLoad函数还会IFRAME在触发回调函数之前从页面中删除该函数.
该类工作正常,我得到了预期的回调.在Firebug的Net面板中,我看到了请求,我看到了响应,一切都很顺利.但是,一旦提交开始,页面的浏览器选项卡将更改为"正在连接"加载微调器,并且永远不会更改回来.它使标签显示正在加载,如果我打开浏览器,这将持续数天.

那么问题是:有没有办法让我手动停止,或者是否有其他方法可以阻止它启动?
以下是从Net面板中获取的响应标题:
Date Fri, 02 Sep 2011 15:23:15 GMT
Server Apache/2.2.10 (Win32) PHP/5.3.1
X-Powered-By PHP/5.3.1
Expires Thu, 19 Nov 1981 08:52:00 GMT
Cache-Control no-store, no-cache, must-revalidate, post-check=0, pre-check=0
Pragma no-cache
Set-Cookie PHPSESSID=agncdnha86mtci7dmuvriobak2; path=/
Content-Length 165
Keep-Alive timeout=5, max=100
Connection Keep-Alive
Content-Type text/html
Run Code Online (Sandbox Code Playgroud)
并在下面捕获Net面板.POST来自提交表单,GET是由回调函数引起的,它正在改变页面上图像的来源.

这不是特定于此页面,它发生在我使用此技术通过提交文件/图像的任何地方IFRAME.这会影响我当前版本的Firefox(6.0),但也影响以前的版本(5.x,4.x,3.x).IFRAME在加载后从页面中删除它的事实使得这尤其令人困惑 - 即使请求永远不会完成,元素的删除应该有效地杀死/停止和"连接"浏览器认为正在发生的事情.
更新
根据@Sidnicious的回答,我在回调函数中添加了一个超时,以引入删除IFRAME元素的延迟.我试验了延迟的长度,即使1ms的延迟也足够了.这当然有资格作为解决方案,但我仍然想知道是否有人可以了解它的原因,最好是避免一起使用超时.我已经在下面包含了修改后的代码(带有超时),以防它有用.这是onLoad为事件IFRAME(io我们的参考框架元件):
var obj={};
var success = true;
try{
obj.responseText = io.contentWindow.document.body?io.contentWindow.document.body.innerHTML:null;
obj.responseXML = io.contentWindow.document.XMLDocument?io.contentWindow.document.XMLDocument:io.contentWindow.document;
}
catch(e){ success = false; }
if( success ){
this.fireEvent('onSuccess', obj.responseText );
}else{
this.fireEvent('onFailure', obj );
}
this.fireEvent('onComplete', obj );
io.removeEvent('load', uploadCallback );
setTimeout(function () { // <--- this timeout prevents the issue
io.dispose();
}, 1);
Run Code Online (Sandbox Code Playgroud)
更新:Firefox错误现在标记为"已修复",并将进入近期更新.
我碰到的这个太,并会喜欢看到固定的根本原因.
我和几个Firefox开发人员(mbrubeck和gavin)谈过,他们认为这是一个错误!2005年针对Firefox 1.9 报告并修复了同样的问题.然后,错误489259在2009年开放.mbrubeck慷慨地将它从"未经证实的"堆中移出.
Safari的行为比Firefox好,但如果在load事件期间删除iframe,则会在状态栏中显示错误消息("打开页面时出现一个错误...").我发现了两个类似的bug的WebKit自2007年以来一直开:15485和13281.
iframe在load事件期间从文档中删除a时,似乎会发生这种情况.JavaScript事件同步触发- 也就是说,与浏览器自己处理的网页串联.这就是为什么可以阻止提交表单或阻止在事件处理程序中注册按键或鼠标单击的原因.
最后一次在Firefox中修复了这个bug,原因是iframe从页面中删除一个让它忘记了拥有它iframe的页面,但是在事件发生后通知页面它已经完成加载load.
您安排的任何事情都setTimeout发生在事件循环的当前循环之后 - 浏览器完成它现在正在执行的操作之后.因此,使用setTimeout删除iframe,即使超时为零,也可以完成:
iframe.onload = function(){
// Do work with the content of the iframe…
setTimeout(function(){
iframe.parentNode.removeChild(iframe);
}, 0);
}
Run Code Online (Sandbox Code Playgroud)
您可以在jQuery表单插件中找到此技术.
| 归档时间: |
|
| 查看次数: |
1217 次 |
| 最近记录: |