2011-06-26 17 views
8

Estoy usando la solicitud jQuery ajax para capturar y analizar HTML en una página secundaria .. Al mirar el panel de Red de Chrome y FF, noté que se cargará las imágenes de allí también, pero solo cuando cargo el resultado usando $ (datos) en la devolución de llamada 'exitosa'.Impedir que las imágenes se carguen en jQuery no DOM parse

El contenido NO está cargado en el DOM de la página actual, así que estoy realmente confundido por qué esto está sucediendo.

Pero en cualquier caso, simplemente preguntado, ¿hay alguna manera de evitar que esto suceda? Necesito tomar información del resultado, pero nunca llega al DOM principal. ¿Serán las secuencias de comandos que impiden la carga de imágenes hasta que funcionen aquí, o nunca dispararán contra el elemento cargado? Tenga en cuenta que esto es para una aplicación de usuario, por lo que no tengo control sobre el HTML objetivo.

¡Gracias!

Respuesta

7

La razón por qué esto está sucediendo es que tan pronto como se crea una imagen con una propiedad src, se carga esa imagen. Por ejemplo:

var image = document.createElement('img'); 
image.src = 'example.png'; 

La imagen es inmediatamente cargado por el navegador, antes de que se anexa al DOM. Esto es en general una optimización. Por ejemplo, se puede usar para precargar imágenes que se usarán más adelante.

Dado que jQuery construye la cadena HTML en una estructura DOM, crea elementos img de forma muy similar a como lo hace el fragmento anterior. Cuando el elemento de imagen aparece, incluso antes de que se anexe al DOM, el archivo se carga desde el servidor.

La solución más sencilla sería la de eliminar todas las etiquetas img del HTML antes de añadirlo:

html = html.replace(/<img\b[^>]*>/ig, ''); 

Si eso no es una opción y que necesita los elementos img, se podía cambiar el nombre de los atributos a src algo más, o elimine los atributos si no los necesita.

+0

Me gusta esta solución; Pude reemplazar el texto del atributo 'src' con otro identificador bastante rápido. – Morgon

1

Puede buscar y eliminar todas las etiquetas de imagen de la cadena devuelta antes de cargarla en su DOM.

Esta es la expresión regular de imágenes HTML:

<[iI][mM][gG][a-zA-Z0-9\s=".]*((src)=\s*(?:"([^"]*)"|'[^']*'))[a-zA-Z0-9\s=".]*/*>(?:</[iI][mM][gG]>)* 
+0

Gracias por su respuesta ... El problema con esto es que realmente se necesita esas etiquetas de imagen (entre otras etiquetas, no es solo eso)! Sin mencionar la extracción de cuerdas parece ser bastante intenso y derrochador. ¿Realmente no hay forma de usar jQuery en el objetivo sin cargarlo completamente? – Morgon

0

Su problema es cargar el texto de respuesta en un elemento jQuery ($(data)). Esto realmente crea un DOM para el contenido cargado aunque no lo agregue al DOM "principal".

Lo que debe hacer es mantener este texto fuera de jQuery y tratarlo en el nivel de texto usando regex, o cargarlo en un documento XML y consultarlo con los diversos métodos XML disponibles.

Si desea utilizar jQuery y detener la carga se puede tratar de leer aquí: Javascript: Cancel/Stop Image Requests

+0

Estoy intrigado por la solución XML. ¿Tiene algún código que lo explique mejor? ¿Hay algún beneficio sobre simplemente pasar la respuesta desinfectada a través de jQuery? – Morgon

Cuestiones relacionadas