2009-06-30 22 views
5

Usando ExtJS 2.2.1, tengo un elemento contenedor que se supone que cargar un trozo de HTML desde el servidor usando:ExtJS: autoLoad no funciona en IE

autoLoad: { url: 'someurl' } 

Esto funciona bien en Firefox , pero para IE7 esto resulta en un error de sintaxis en ext-all-debug.js en la línea 7170:

this.decode = function(json){ 
    return eval("(" + json + ')'); 
}; 

me fijo esta girando esa función en este:

this.decode = function(json){ 
    return eval('(function(){ return json; })()'); 
}; 

Luego, el autoLoad funciona bien en ambos navegadores, pero luego hay algunos errores extraños y, además, realmente no desea arreglar esto en la biblioteca ExtJS, ya que no se podrá mantener (especialmente en el ext-all.js minificado que es como medio megabye de Javascript en una sola línea).

No he podido encontrar mucho sobre este error.

variaciones que he probado:

// With <script> tags around all the HTML 
autoLoad: { url: 'someurl', scripts: true } 
// With <script> tags around all the HTML 
autoLoad: { url: 'someurl', scripts: false } 

Y viceversa, sin las etiquetas <script>. Tampoco hay Javascript en el HTML, pero debería ser posible, porque eventualmente usaremos Javascript dentro del HTML devuelto.

El problema no está en el HTML porque incluso con el HTML más simple posible, el error es el mismo.

ACTUALIZACIÓN - Respuesta a Donovan:

El caso más simple en que esto se utiliza es la siguiente:

changeRolesForm = new Ext.Panel({ 
     height: 600, 
     items: [{ autoScroll: true, autoLoad: WMS.Routing.Route("GetRolesList", "User") + '?userID=' + id}] 
    }); 

No hay ningún almacén de datos involucrado aquí. El tipo de respuesta también es text\html, no json, por lo que tampoco puede confundirlo. Y como dije, está funcionando bien en Firefox, y en Firefox, también ejecuta la misma función eval, pero sin el error. Entonces, no es que Firefox siga una ruta de ejecución diferente, es lo mismo, pero sin el error en eval.

+0

Ninguna de las "respuestas" aborda el hecho de que el error solo ocurre en IE. Todavía estamos experimentando lo mismo en Ext 3.3.0. –

+0

Hola Julian, si miras FireBug, ¿qué devuelve el servidor? Ext realiza una llamada al servidor después de lo cual muere en IE, sería útil si se publican la solicitud y la respuesta (incluidos los encabezados) –

+0

Recomiendo usar Charles Proxy para obtener la información que Rob busca, ya que las herramientas de depuración de IE son horribles –

Respuesta

2

I localizado el origen del problema y de hecho no era con ExtJS. Había una sección en la aplicación que escuchaba el evento Ext.Ajax 'requestcomplete' e intentó decodificar el response.responseText a json, incluso si la respuesta era HTML (que solo está en uno o dos casos). IE no se divirtió con esto.

1

Si está cargando automáticamente en un Panel o Elemento, entonces una decodificación JSON ni siquiera debería estar involucrada en el proceso. UpdateManager simplemente difiere a Ext.Element.update (..) que toma una cadena de html.

La única razón por la que puedo pensar que su respuesta se analizará como JSON si estuviera usando una tienda JSONS para solicitarla, ¿qué está usando?

Usted debe ser capaz de hacer algo tan simple como esto:

 
var panel = new Ext.Panel({ 
    autoLoad: 'someurl' // this is the short form, you can still use the object config 
}); 

O

 
var element = Ext.get('element id').update({ 
    url: 'someurl' 
}); 

Respuesta al cambio:

Eso parece correcto, siempre y cuando no algo raro está pasando con el método WMS.Routing.Route (...). Actualmente estoy trabajando en una aplicación ExtJS, así que pude probar rápidamente algunas respuestas diferentes del servidor y no pude reproducir su problema. También revisé las fuentes de ExtJS 2.2.1 y todavía no veo nada en la actualización de Element relacionada y UpdateManager que haría la llamada a Ext.util.JSON.decode (...) que está viendo.

Imagino que es de una solicitud AJAX no relacionada en otra parte de su aplicación. Si aún no lo has hecho, utilizaré firebug/firebug lite para ayudar a depurar esto; específicamente, intentaré obtener un seguimiento de la pila para asegurarme de que el origen de tu problema sea realmente este autoLoad.

+0

Gracias, ver mi actualización. – JulianR

1

No sé cuál es el problema, pero quería señalar que su "corrección" hace que simplemente devuelva el json como una cadena en lugar de un objeto evaluado, por lo que, por supuesto, ya no hay ningún error - eliminaste la funcionalidad. Es tan simple podría ser:

this.decode = function(json){ 
    return json; 
} 

En términos generales, los errores aleatorios como esta no suele indicar un error en Ext, especialmente no en las funciones de uso tan comúnmente como Ext.decode. Supongo que hay algo en el JSON que no le gusta a IE que ignoran otros navegadores, o más probablemente, hay algo inesperado en su aplicación que no es obvio a partir de su descripción. ¿Has intentado inspeccionar tu registro de solicitud en Firebug para ver cómo se ve realmente el JSON? ¿Has intentado obtener el resultado de tu llamada de ruta en una variable primero para verificar su contenido antes de rellenar el panel? Además, intente configurar la opción "interrumpir todos los errores" en Firebug en verdadero - muchas veces cuando obtiene una función aleatoria de Ext en la parte superior de su rastro de pila, el culpable es en realidad algún código de aplicación que usted no era esperando

4

Compruebe su JSON. FF permite comillas finales en objetos JSON mientras que IE no. p.ej.

{foo:'bar',baz:'boz',} 

funcionaría en FF pero en IE arrojaría un error de sintaxis. Para que exista a no ser un error de sintaxis JSON tendría que ser:

{foo:'bar',baz:'boz'} 
1

que tenían el mismo problema, disculpe mi Inglés, soy de Mejico, espero que pueda ayudar ... mi problema se desencadenó cuando presente un formulario para iniciar la sesión, mi PHP devuelve un JSON con la respuesta en caso de fallo de esta manera:

$respuesta = "{success: false, msgError: 'El usuario o contrase&ntilde;a son incorrectos'}"; 

pero no me mando un resposne cuando el éxito, bien cuando se tiene un verdadero éxito, entonces el ExtJS que estaba tratando de descifrar mi respuesta JSON, pero no había nada para decodificar, i Supongo que fue, en mi caso, el problema ... Lo resolví simplemente enviando una respuesta para el verdadero éxito, FF, Chrome, Safari, no capto el problema, pero Opera e IE8 sí ... Espero ayudar a alguien, adiós