Проблема Firefox с Javascript: не обновляется статус при отправке формы

Я уже много раз пытался отправить данные формы через Ajax на мой серверный скрипт, не обновляя страницу (используя событие формы onSubmit). Все это отлично работает со всеми браузерами (Chrome, IE и т. Д.), Но когда дело доходит до Firefox, обработка просто продолжается. Я имею в виду, что даже если данные были отправлены на сторону сервера (да, во многих случаях у меня есть данные на стороне сервера, но клиент все еще обрабатывается), клиент не отвечает на последовательные вызовы .

Например, рассмотрим один из моих примеров кодов:

Вот Javascript

function submitComment(id)
{
 //id is the id of the postbox
 var content=$("#"+id).val();
 var xmlhttp;
 if(window.XMLHttpRequest)
  xmlhttp=new XMLHttpRequest();
 else
  xmlhttp=new ActiveXObject("Microsoft.XMLHTTP");

 xmlhttp.onreadystatechange=function()
 {
  if(xmlhttp.readyState==4 && xmlhttp.status==200)
  {
   //action taken in response to the script from server in response to this form submission, eg, enabling back the submit button
   $('input[type="submit"]').removeAttr('disabled');
  }
 }

 $('input[type="submit"]').attr('disabled','disabled');
 xmlhttp.open("POST",host+"comment.php?mode=newpost",true);
 xmlhttp.setRequestHeader("Content-type","application/x-www-form-urlencoded");
 xmlhttp.send("post="+content);
 $('#status').html('Posting your comment. Please wait...');//shows this status as long as gets no response from server
 return false;
}

А вот его HTML:

<form id='newpostform' method=post action='' onSubmit="return submitComment('post')" >
 <textarea id='post' name='post'></textarea>
 <input type=submit value=Post>
 <span id='status' style='padding:10px; font-size:12px; color:black; font-family:cambria, segoe ui;'>
 </span>
</form>

Итак, во всех браузерах, кроме Firefox, кнопка отправки отключена на некоторое время, пока сценарий не передаст сообщение серверу, и когда сервер ответит, кнопка отправки снова активируется и статус обновляется.

Проблема возникает именно здесь, в Firefox. Строка состояния никогда не меняет свой статус, даже если данные были переданы на сервер!


person Sayed    schedule 30.04.2013    source источник
comment
Есть ли какая-то конкретная причина, по которой вы используете XMLHttpRequest и т. Д. Напрямую вместо библиотеки JS?   -  person Paul Grime    schedule 01.05.2013
comment
В противном случае я бы не увидел никаких проблем с использованием XMLHttpRequest напрямую, jQuery уже используется для управления DOM, поэтому немного странно не использовать встроенные команды, такие как . ajax. Я не думаю, что это вызывает проблему в данном случае.   -  person Turnerj    schedule 01.05.2013
comment
@Paul: Нет, я использовал этот код, чтобы показать только пример. Я действительно использую для этой цели jQuery. Но так как я новичок в этом, я избегаю его использования. Однако даже при использовании jQuery проблема остается нерешенной.   -  person Sayed    schedule 01.05.2013
comment
@PaulGrime: три голоса за ваш комментарий за три часа напоминают мне meta.stackexchange.com/a/48195 :) Серьезно, на вопрос конкретного браузера легче всего ответить, когда он не использует абстракции.   -  person Nickolay    schedule 01.05.2013
comment
@eddy: какой статус и состояние готовности в Firefox? Вы проверяли ответ сервера в Firebug? У вас есть живой пример? У меня есть два предположения: междоменные запросы .com / questions / 6818939 / и что результат может зависеть от ответа вашего сервера.   -  person Nickolay    schedule 01.05.2013
comment
@Nickolay - Хорошая ссылка. Я по-прежнему считаю, что на вопрос, связанный с конкретным браузером, обычно лучше всего ответить, если возможно, указав библиотеку (-ы), которая была протестирована на десятках / сотнях платформ и тысячами разработчиков / клиентов на протяжении многих лет. Или вы говорите, что XMLHttpRequest ведет себя одинаково во всех браузерах / версиях / ОС?   -  person Paul Grime    schedule 01.05.2013
comment
Получил решение моей проблемы. stackoverflow.com/questions/1980880/ Это произошло только из-за того, что я использовал абсолютный путь. Использование относительного пути решило мою проблему. Однако меня все еще смущает тот факт, что я использую относительный путь вроде этого: index / index.php в атрибуте пути файла сценария, находящегося в самом каталоге index. Почему? Я имею в виду, что простое использование index.php должно было решить проблему, не так ли? В любом случае, моя проблема решена, поэтому спасибо всем :) Получил эту ссылку здесь   -  person Sayed    schedule 01.05.2013
comment
@eddy: Мне все еще любопытно, какая разница между Firefox и другими в этом случае. Можете ли вы опубликовать URL-адрес, переданный в xhr.open () и window.location.href?   -  person Nickolay    schedule 01.05.2013
comment
@PaulGrime: Я считаю, что лучшим ответом (если jQuery устранит проблему) будет: Firefox имеет известную проблему с этим (ошибка NNN). Вы можете обойти это с помощью YYY. Кстати, $ .ajax () jQuery включает этот обходной путь.   -  person Nickolay    schedule 01.05.2013
comment
@Nickolay - Я не упоминал конкретно какую-либо библиотеку, но если jQuery решает эту проблему, тогда отлично. Вроде как поддерживает мою точку зрения.   -  person Paul Grime    schedule 01.05.2013
comment
@Nickolay: я использовал абсолютный URL-адрес в объекте XMLHttpRequest, например xmlhttp.open(post,example.com/index/index.php?mode=newpost,true); в файле сценария, находящемся в каталоге index. Это работало правильно с Chrome и другими браузерами, но вызывало ошибку в Firefox. Использование относительного URL-адреса устранило мою проблему.   -  person Sayed    schedule 01.05.2013
comment
@eddy: спасибо за внимание! Каков был URL-адрес документа - console.log(document.baseURI); console.log(window.location.href)? SO удалил схему перед example.com в вашем предыдущем комментарии или вы называли это так?   -  person Nickolay    schedule 01.05.2013
comment
Неа. URL-адрес был точно таким же, как указанный в комментарии выше, за исключением того, что вместо example.com у меня был URL-адрес моего сайта. И эй, я не такой уж эксперт, поэтому не думаю, что смогу правильно ответить на твой вопрос. Надеюсь, у вас больше нет вопросов.   -  person Sayed    schedule 02.05.2013


Ответы (1)


Ответ из комментария к вопросу:

Получил решение моей проблемы. XMLHTTPRequest.status возвращает 0, а responseText равен пустой в FireFox 3.5

Это произошло только из-за того, что я использовал абсолютный путь. Использование относительного пути решило мою проблему.

Отлично!


Что касается вашего дополнительного вопроса:

Однако меня все еще смущает тот факт, что я использую относительный путь вроде этого: index / index.php в атрибуте пути файла сценария, находящегося в самом каталоге index. Почему? Я имею в виду, что простое использование index.php должно было решить проблему, не так ли?

Как я понял, у вас есть HTML-код на http://example.org/test.html с

<script src="subdir/main.js>

... который преобразуется в http://example.org/subdir/main.js, который вызывает XMLHttpRequest:

xhr.open("POST", "index.php", true);

Это запрашивает http://example.org/index.php, а не http://example.org/subdir/index.php

Это связано с тем, что относительные URL-адреса в XMLHttpRequest (как и во многих других случаях) имеют вид решено против базового URL документа, а не URL-адрес скрипта.

Если относительные URL-адреса были сопоставлены с URL-адресом сценария, это могло бы оказаться очень запутанным: представьте, что у вас есть jQuery в /lib/jquery.js, который вызывает XMLHttpRequest, и ваш собственный код в /main.js, вызывающем jQuery.ajax (... "data.txt" ...). Следует ли этот запрос /data.txt или lib/data.txt?

person Community    schedule 01.05.2013