Ошибка Firefox «элемент не найден»

Во-первых, это не совсем идеальный способ настройки страницы, однако необходимо распространять скрипт в виде 1 файла.

У меня есть php-скрипт в верхней части документа xhtml с javascript, и при определенных условиях я использую XHR для отправки строки запроса на саму страницу. Затем php вверху активируется и сохраняет переданный контент как сеанс, а затем убивает себя (exit()). XHR является асинхронным и никогда не проверяется, возвращает ли он контент.

Однако в Firefox 3 консоль ошибок выдает ошибку no element found каждый раз, когда отправляется запрос XHR. Кроме того, если я использую выход, такой как exit('Done'), Firefox выдает синтаксическую ошибку (Готово), как будто он вставляет его в видимую DOM. В Опере такого не наблюдается.

Есть ли лучший способ сохранить сеанс с уже сгенерированной страницы xhtml? Очевидно, я мог бы XHR на другую страницу, но я бы предпочел сохранить все это на одном скрипте. Обрабатывает ли Firefox запросы XHR к себе как обновления DOM? Я не знаю, почему он отправляет эту ошибку.


Обновление Как я уже сказал, firefox выдает ошибку только при выполнении запроса XHR. Страница является допустимым XHTML и работает отлично, без ошибок, если только запрос XHR не направлен на саму страницу.

Мне было интересно, почему он отправляет ошибку, потому что он действительно ничего не возвращает.

Вот фрагмент javascript, который делает запрос ajax от объекта. Он создает объект XHR без функции обратного вызова и публикует информацию. Он работает правильно, когда не ссылается на одну и ту же страницу.

 var saveState = { saveContent: function(updateActiveMenu) {
    var sendState = new ajaxObject(gV.url);
    if (!updateActiveMenu) {
        var storageContainer = document.getElementById("StorageContainer").innerHTML;
        var menu = document.getElementById("Nav").innerHTML;
        sendState.update("Containerstring="+urlencode(storageContainer)+"&Nav="+urlencode(menu)+"&Active="+gV.activeMenuItem, 'POST', true);    } }, }

И php делает это

if (isset($_REQUEST['Containerstring']) && isset($_REQUEST['Nav']) && isset($_REQUEST['Active'])) {
  $_SESSION['Containerarray'] = (saveContainer(regulateEscapes(urldecode($_REQUEST['Containerstring']))));
  $_SESSION['Navarray'] = (saveNav(regulateEscapes(urldecode($_REQUEST['Nav']))));
  $_SESSION['Active'] = $_REQUEST['Active'];
  exit('Done'); 
}

Я также знаю, что мне не следует использовать innerHTML, но это уже другая история.


Ошибка в этом

Error: no element found
Source File: http://localhost/ajax.php?1244648094055 
Line: 1

Обратите внимание, что ошибка на странице php, которую я использую, ссылается на строку запроса, которая никогда не вызывается.


person Ian Elliott    schedule 10.06.2009    source источник
comment
какое-то несоответствие в том, что вы описываете. если xhr никогда не использует возвращаемое значение (то есть «Готово»), то он не может вставить его в DOM, не так ли?   -  person SilentGhost    schedule 10.06.2009
comment
еще лучше опубликуйте небольшой пример вашего кода.   -  person SilentGhost    schedule 10.06.2009
comment
Почему бы не разместить соответствующие части исходного кода страницы?   -  person Ryan Florence    schedule 10.06.2009
comment
По-видимому, Firefox выводит это сообщение, когда тело ответа пусто (например, изображение с Content-Length: 0)   -  person mems    schedule 09.11.2014


Ответы (2)


Firefox ожидает получить что-то, что он может разобрать как XML, и выдает ошибку разбора XML, когда получает пустой ответ.

Прежде чем ваш PHP вызовет "exit()", используйте

header('Content-Type: text/plain');

и Firefox не будет пытаться анализировать ответ как XML, и ошибки быть не должно.

person NickFitz    schedule 10.06.2009
comment
Ничего, я использовал заголовок HTTP/1.0 200 и предполагал, что это будет делать то же самое, я определенно ошибся;) Это сработало, большое спасибо. - person Ian Elliott; 10.06.2009
comment
В моем случае я отправлял пустой ответ с сервера, и jQuery предполагает ожидать xml и пытается его проанализировать. Я просто вернул «успех», и это решило проблему. Так что ваш ответ тоже помог мне. Спасибо - person sidonaldson; 29.06.2015

Ваш php должен возвращать действительный HTTP-ответ, потому что Firefox попытается прочитать его, даже если вы ничего с ним не сделаете. Так что верните хотя бы действительный заголовок

header("HTTP/1.0 200");
exit();
person Alsciende    schedule 10.06.2009
comment
Это решение не сработало, однако сработал заголовок «Content-Type». - person Ian Elliott; 10.06.2009