Странная проблема jQuery AJAX Firefox - страница случайно не закончит загрузку - PullRequest
3 голосов
/ 14 ноября 2008

У меня странная проблема с моим веб-приложением. Видите ли, я использую jQuery с Forms API и делаю $ ('# MyForm'). AjaxSubmit (здесь указаны API-функции и функция обратного вызова).

Случайно, когда я делаю это, однако, и только в Firefox, значок загрузки страницы начинает вращаться, индикатор выполнения загрузки страницы запускается в строке состояния, а кнопка остановки становится красной - но она уже опубликовала форму и вернул результат. Если я обновляю страницу и продолжаю пытаться это сделать, проблема возникает случайным образом, но не всегда.

Эта проблема возникла на FF2 в Windows 2008 Server и FF3 в Ubuntu 8.04. Проблема не наблюдается с IE6, IE7, Opera (последняя стабильная версия, ноябрь 2008 г.) или Safari (последняя стабильная версия, ноябрь 2008 г.).

Это просто известная ошибка в FF с AJAX или я могу что-то сделать с jQuery, чтобы остановить проблему загрузки страницы?

РЕДАКТИРОВАТЬ: Это может иметь какое-то отношение к TinyMCE. Я не могу подтвердить это на 100%, но когда я использую jQuery, чтобы вернуть форму с элементом управления TinyMCE, проблема, похоже, проявляется чаще. Я пытался сделать это с формой, в которой нет элемента управления TinyMCE, несколько раз, и не смог получить проблему. Опять же, это не является чем-то убедительным, но может быть фактором.

РЕДАКТИРОВАТЬ: Хорошо, я только что прокомментировал материал TinyMCE, и я могу подтвердить, что проблема исчезнет тогда. Если я верну элемент управления TinyMCE, проблема возникнет случайно.

Ответы [ 4 ]

0 голосов
/ 03 июля 2010

У меня была эта проблема с этим кодом, который запускался для установки значения в пустой видимый 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, но, похоже, это не связано.

0 голосов
/ 14 ноября 2008

Раньше у меня была эта проблема, когда я работал на сайте, который интенсивно использовал iframes. Если я правильно помню, простой способ вылечить это - создать еще один iframe на верхней странице с минимальной высотой / шириной и назвать его frameFix или подобным.

Затем на страницах содержимого Iframe используйте событие загрузки тела, чтобы написать пустую строку, а затем закройте iframe frameFix. Это заставляет строку состояния полностью загружаться.

* 1005 например *

страница содержимого iframe

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

function progressBarHack(){
   top.frameFix.document.write("");
   top.frameFix.close();
   return;
}
0 голосов
/ 14 ноября 2008

Вы, вероятно, не хотите изменять этот ответ - я просто экстраполирую ответ на красный квадрат, который исправил меня.

Я использовал AJAX (API плагинов форм jQuery и, если быть точным, .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 выйти из бесконечного цикла загрузки.

0 голосов
/ 14 ноября 2008

Попробуйте посмотреть ответ сервера, используя firebug, чтобы увидеть точность, если возникла проблема, или если у вас возникли какие-либо исключения из JavaScript.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...