2009-06-10 4 views
20

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

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

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

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


Update Как я уже сказал, светлячок только thows ошибку, когда запрос 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 

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

+0

есть некоторая несогласованность в том, что вы описываете. если xhr никогда не использует возвращенное значение (которое является «Done»), то оно не может вставить его в DOM, теперь может? – SilentGhost

+0

еще лучше опубликуйте небольшой пример вашего кода. – SilentGhost

+0

Почему бы не поместить соответствующие части источника страницы? –

ответ

25

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

Перед вашими PHP вызовы «выхода()», используйте

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

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

+0

Ничего, я использовал заголовок« HTTP/1.0 200 »и предположил, что это сделает то же самое, я определенно ошибочно;) Это сработало, спасибо. –

+0

В моем случае я отправлял пустой ответ с сервера, и jQuery угадывает, чтобы ожидать xml и пытается его разобрать. Я просто вернул «успех», и он решил проблему. Так вы ответили и помогли мне. Спасибо – sidonaldson

-2

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

header("HTTP/1.0 200"); 
exit(); 
+1

Это решение не сработало, однако заголовок Content-Type сделал. –