2009-06-10 36 views
20

En primer lugar, esta no es exactamente la forma ideal de configurar una página, sin embargo, hay una necesidad de distribuir un script como 1 archivo.Error de Firefox 'no se encontró ningún elemento'

Tengo un script php en la parte superior de un documento xhtml con javascript y bajo ciertas condiciones uso XHR para enviar una cadena de consulta a la página. El php en la parte superior se activa y almacena el contenido pasado como una sesión, y luego se mata a sí mismo (exit()). El XHR es asíncrono y nunca se verifica para ver si devuelve contenido.

Sin embargo, en Firefox 3, la consola de error arroja un error no element found cada vez que se envía la solicitud XHR. Además, si utilizo una salida como exit('Done'), Firefox arroja un error de sintaxis de (Hecho) como si lo insertara en el DOM visible. Esto no parece suceder en Opera.

¿Existe alguna forma mejor de almacenar una sesión desde una página xhtml ya generada? Obviamente, podría XHR a otra página, pero preferiría mantener todo en un solo script. ¿Firefox trata las solicitudes de XHR a sí mismo como actualizaciones del DOM? No sé por qué está enviando este error.


actualización Como ya he dicho, sólo para Firefox thows el error cuando se hace la petición XHR. La página es XHTML válida y funciona perfectamente, sin error a menos que la solicitud XHR se realice en la página misma.

Me preguntaba por qué se enviaba el error porque realmente no devuelve nada.

Aquí hay un fragmento de javascript que realiza una solicitud de ajax desde un objeto. Crea un objeto XHR, sin una función de devolución de llamada, y publica la información. Funciona correctamente cuando no se hace referencia a la misma página.

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); } }, } 

Y el php hace esto

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'); 
} 

También soy consciente de que no debería usar innerHTML pero eso es otra historia


El error es este

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

Tenga en cuenta que el error, mientras que en el p La página hp que estoy usando hace referencia a una cadena de consulta que nunca se llama.

+0

hay algo de inconsistencia en lo que está describiendo. si xhr nunca usa el valor devuelto (que es 'Hecho'), entonces no puede insertarlo en un DOM, ¿o sí? – SilentGhost

+0

aún mejor publique un pequeño ejemplo de su código. – SilentGhost

+0

¿Por qué no poner las partes relevantes de la fuente de la página? –

Respuesta

25

Firefox espera obtener algo que pueda analizarse como XML de nuevo y arrojar un error de análisis XML cuando recibe una respuesta vacía.

Antes de que sus llamadas PHP "salida()", utilizan

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

y Firefox no tratará de analizar la respuesta como XML, y no debe haber ningún error.

+0

No importa, usé el encabezado" HTTP/1.0 200 "y asumí que esto haría lo mismo, definitivamente equivocado;) Esto funcionó, muchas gracias. –

+0

En mi caso, estaba enviando una respuesta vacía desde el servidor y jQuery adivina que espera xml e intenta analizarlo. Simplemente devolví 'éxito' y solucionó el problema. Entonces tu respuesta también me ayudó. Gracias – sidonaldson

-2

Debería hacer que su respuesta php sea una respuesta HTTP válida, porque Firefox intentará leerla aunque no haga nada con ella. Devuelva al menos un encabezado válido

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

Esta solución no funcionó, sin embargo, el encabezado 'Content-Type' sí. –

Cuestiones relacionadas