奇怪的jQuery AJAX Firefox问题 - 页面随机无法完成下载

时间:2008-11-13 23:31:56

标签: jquery ajax firefox

我的网络应用程序存在这个奇怪的问题。你看,我正在使用带有Forms API的jQuery并执行$('#MyForm')。ajaxSubmit(api parms和callback函数在这里)。

然而,当我这样做时,只有在Firefox上,页面加载图标开始旋转,页面加载进度条在状态栏中运行,停止按钮变为红色 - 但它已经发布了表单和带回了一个结果。如果我刷新页面并继续尝试这样做,它会随机显示问题,但不能始终如一。

在Windows 2008 Server上的FF2和Ubuntu 8.04上的FF3上发生此问题。 IE6,IE7,Opera(最新稳定版,2008年11月)或Safari(最新稳定版,2008年11月)未见问题。

这只是FF中使用AJAX的已知错误,还是我可以用jQuery来阻止页面加载问题?

编辑:可能与TinyMCE有关。我无法确认这100%,但是当我使用jQuery带回一个带有TinyMCE控件的表单时,问题似乎更频繁地展现出来。我尝试使用一个没有TinyMCE控件的表单,多次,并且无法解决问题。同样,这没什么结论,但可能是一个因素。

编辑:好的,我刚刚评论了TinyMCE的东西,我可以确认问题就消失了。如果我带回TinyMCE控件,问题会随机发生。

4 个答案:

答案 0 :(得分:0)

尝试查看服务器响应,使用firebug确切查看当时是否存在问题,或者是否有任何javascript异常提升。

答案 1 :(得分:0)

当我在一个大量使用iframe的网站上工作时,我曾经遇到过这个问题。 如果我没记错的话,一个简单的方法就是在顶页中创建另一个iframe,其高度/宽度最小,并将其命名为frameFix或类似名称。

然后从Iframe内容页面使用body load事件写入空字符串,然后关闭frameFix iframe。这会强制状态栏完全加载。

e.g

iframe内容页面

<body onload="javascript:progressBarHack()">

function progressBarHack(){
   top.frameFix.document.write("");
   top.frameFix.close();
   return;
}

答案 2 :(得分:0)

你可能不想upmod这个答案 - 我只是在redsquare的回答中进行推断,这解决了我。

我正在使用AJAX(jQuery Form Plugin API和.ajaxSubmit())来拉回表单。当我在该表单上点击“保存”或“取消”时,它在Firefox中显示红色停止按钮并且不会停止。

所以,为了解决这个问题,我需要接受调用页面并在其中添加一个隐藏的IFRAME:

<iframe frameborder="0" src="http://mysite.com/fixdoc.html" id="frameFix" height="1" width="1" style="position: relative; left: -500px"></iframe>

然后,我需要创建一个fixdoc.html,它只是一个普通的空HTML页面,其中包含标准标记内容。

然后,在我的逻辑中完全保存或取消完成后,我需要执行此操作:

var ifr = document.getElementById('frameFix');
var doc = ifr.contentDocument;
if (doc == undefined || doc == null)
doc = testFrame.contentWindow.document;
doc.open();
doc.write(' ');
doc.close();    

不知何故,这告诉Firefox退出无限加载循环。

答案 3 :(得分:0)

我遇到了这个代码的问题,该代码运行以在空的可见iframe上设置值:

function loadIframeContent() {
    $.post(
        '/my/content/url',
        $('#my-form').serialize(),
        function (data) {
            $('#my-preview-div-with-iframe').dialog('open');
            $('#id-on-my-iframe-tag')[0]
                .contentWindow
                .document
                .write(data);

            resizeIframeToContent();
        },
        'html'
    );
}

解决方案原来是:

            var $document = $('#id-on-my-iframe-tag')[0]
                .contentWindow
                .document;    
            $document.open();
            $document.write(data);
            $document.close();

所以最后,document.write(data)调用是无链接的,因此首先可以打开文档,然后编写,然后最终关闭。不要将文档变量命名为document(至少不是Firefox 3),因为它会发生碰撞 - 使用$document或类似名称。

我也在使用TinyMCE,但这似乎是无关的。