2010-02-04 12 views

Respuesta

39

Cuando llame al método jQuery.ajax(), puede especificar la propiedad dataType, que describe qué tipo de datos espera del servidor y cómo manejarlos una vez que se reciben.

De forma predeterminada, jQuery intentará adivinar el dataType en función del tipo MIME de la respuesta. Sin embargo se puede especificar explícitamente un tipo de datos de los siguientes:

  • html: Devuelve HTML como texto sin formato; las etiquetas de script incluidas se evalúan cuando se insertan en el DOM.

  • texto: Una cadena de texto sin formato.

  • xml: Devuelve un documento XML que se puede procesar a través de jQuery.

  • secuencia de comandos: Evalúa la respuesta como JavaScript y la devuelve como texto sin formato. Inhabilita el almacenamiento en caché a menos que se use la opción "caché".

  • json: Evalúa la respuesta como JSON y devuelve un objeto JavaScript.

  • jsonp: Carga en un bloque JSON utilizando JSONP. Se agregará un extra "? Callback =?" hasta el final de su URL para especificar la devolución de llamada.

A modo de ejemplo, la siguiente llamada AJAX devolverá los datos como una cadena de texto sin formato, sin ejecutar los scripts o manipular el DOM:

$.ajax({ 
    url: 'ajax/test.html', 
    dataType: 'text', 
    success: function(data) { 
    alert(data); 
    } 
}); 
+1

gracias! ¡muy claro! – pixeline

+0

Gracias. Realmente ayudado. –

2

No, no serán interpretados.

El HTML se puede cargar usando innerHTML o mediante manipulación DOM. En ambos casos, si el HTML contiene etiquetas <script>, no serán interpretadas.

Sin embargo, puede ir a través de las etiquetas <script> dentro del contenido HTML Ajaxed, y eval(), si realmente lo necesita.

Si utiliza este tipo de etiqueta de script <script src="http://site/script.js"></script>, sin embargo, será interpretado.

+0

En realidad, mis pruebas en FF 3.5 indican que los bloques de script en línea se interpretan (que usa innerHTML o appendChild). Ver mi respuesta –

+0

En algunos de mis proyectos, Firefox 3+ e IE7 + se ejecutaron con éxito

31

cuando se carga un documento HTML usando AJAX, ¿qué hacer con los nodos dentro de la etiqueta HEAD: (guión, enlace, estilo, meta, título)

Eso depende de cómo se hace la cargando. ajax() (como con XMLHttpRequest en el que está basado) solo le da una cadena. ¿Cómo está metiendo eso en el documento?

Si escribe esa cadena en el innerHTML de un elemento, las secuencias de comandos dentro de ella no se ejecutarán. Esto no está estandarizado en ninguna parte, pero todos los navegadores actualmente populares se comportan de esta manera.

Sin embargo, si luego inserta ese elemento en el documento (si ya estaba dentro del documento antes o no), será se ejecutará en muchos navegadores, la primera vez que lo haga. En IE, el script se ejecutará cuando inserte directamente un elemento de script en cualquier elemento, ya sea en el documento o no.

Esto es muy inconsistente e inconveniente, por lo que debe evitar los elementos AJAX-cargando <script> en el documento. Por lo general, no hay una buena razón para hacerlo; es mejor mantener el código de script estático y usar JSON (o eval solo si es absolutamente necesario) para pasarles los datos de scripting.

La función de jQuery load intenta compensar las diferencias del navegador cuando AJAX carga contenido en el documento. No puede detectar todas las circunstancias relacionadas con <script> (hay algunas realmente extrañas). No deberías confiar en ello, en general. Puede salirse con la suya tomando una respuesta de página HTML pero solo cargando elemento (s) específico (s) sin <script>, porque eso solo hace el paso de escritura a HTML interno. Pero, de nuevo, realmente no quieres confiar en esto. Es mucho mejor que el servidor devuelva un fragmento de HTML o JSON que tus scripts pueden usar directamente.

En cuanto a las hojas de estilo y los enlaces de hoja de estilo, insertarlos en el cuerpo generalmente funciona, aunque en términos de HTML probablemente no debería funcionar. meta y title no harán nada, es demasiado tarde para que tengan un efecto. Solo analizarlos usando innerHTML no hará nada, pero aún así, evítelo si puede.

+0

Interesante respuesta también. Muchas gracias. Estaba usando la funcionalidad de ajax en jqmodal, así que busqué dentro del código fuente del complemento y usa load(). Eso creó un problema en mi página principal aparentemente. – pixeline

Cuestiones relacionadas