2011-05-29 16 views
48

Tengo un iframe para un sitio de dominios cruzados. Quiero leer el DOM del iframe, que creí que era posible porque al usar el inspector, incluso puedo modificar el DOM de un iframe. Sin embargo, cada vez que intento leerlo, me encuentro con la misma política de origen. Todo lo que quiero es que el contenido esté cargado en mi DOM local, desde el iframe. Pensé que sería tan simple como $(document.body).find('iframe').html(), pero eso es devolver la cadena vacía.Obtiene el contenido de DOM del iframe de dominios cruzados

Realmente espero que haya una manera de hacerlo, ya que el trabajo que he estado haciendo durante los últimos días se ha basado en que esto es factible.

Gracias

+2

Ye s, puedes hacer esto - ver http://stackoverflow.com/a/17262334/888177 – Stefan

Respuesta

56

No se puede. XSS protection. Los contenidos cruzados del sitio no pueden leerse mediante javascript. Ningún navegador importante te permitirá eso. Lo siento, pero este es un error de diseño, debes abandonar la idea.

EDITAR

Tenga en cuenta que si ha de editar el acceso a la página web se carga en el iframe, tiene dos opciones:

  1. Uso postMessage (véase también la browser compatibility)

  2. CORS headers: simplemente agregue el siguiente encabezado al sitio web iframed:

Access-Control-Allow-Origin: http://foo.example

donde http://foo.example es el dominio que aloja la página con el iframe en ella

+8

si quería decir defecto de diseño (flujo), entonces no, no es un defecto, esto fue implementado por seguridad. – Ibu

+12

Sé que se implementó por razones de seguridad, quise decir que es un error de diseño (gracias a eso) basarnos en este concepto. – SinistraD

+2

En ese caso entendí mal – Ibu

6

Si tiene acceso a la página de iframes usted podría utilizar algo como easyXDM para hacer llamadas a funciones en el iframe y devolver los datos.

Si no tiene acceso a la página iframed tendrá que usar una solución del lado del servidor. Con PHP se podría hacer algo rápido y sucio como:

<?php echo file_get_contents('http://url_of_the_iframe/content.php'); ?> 
+0

No tengo acceso a la página iframed y una solución del lado del servidor está fuera de lugar, porque estoy usando cocoahttpserver (el servidor se ejecuta en un iphone) –

+0

En ese caso no es posible. Consulte http://en.wikipedia.org/wiki/Same_origin_policy para obtener información más detallada. – devmatt

+1

Usted señor es un erudito y un caballero – user1775598

-3

Hay una solución alternativa para lograrlo.

  1. Primero, vincula tu iframe a una página de destino con la URL relativa. Los navegadores tratarán el sitio en iframe del mismo dominio con su sitio web.

  2. En su servidor web, utilizando un módulo de reescritura para redirigir la solicitud de la url relativa a la url absoluta. Si usa IIS, le recomiendo que consulte IIRF module.

+0

¿Quiere decir que el servidor envía una redirección http a una ubicación extranjera? Si es así, no funciona al menos en Firefox 9. Supongo que otros navegadores no se dejarán engañar por eso –

4

Si usted tiene un acceso a ese dominio/iframe que se carga, entonces se puede utilizar para la comunicación entre window.postMessage marco flotante y la ventana principal.

Lea el DOM con JavaScript en el iframe y envíelo a través de postMessage a la ventana superior.

Más información aquí: https://developer.mozilla.org/en-US/docs/Web/API/Window/postMessage

+0

¿Cómo podemos leer el DOM en el iframe con js? Es posible, ¿no? –

+0

Has leído el DOM como lo harías normalmente. Por ejemplo document.getElementsByTagName ("BODY") [0]; Después de eso use window.postMessage para enviar el objeto DOM que acaba de leer en la ventana iframed a la ventana que aloja la ventana iframe. –

6

Hay una manera sencilla.

  1. Se crea un iframe que tienen para la fuente de algo así como "http://your-domain.com/index.php?url=http://the-site-you-want-to-get.com/unicorn

  2. Entonces, que acaba de obtener esta URL con $ _GET y mostrar el contenido con file_get_contents ($ _ GET [ 'url']);

usted obtendrá un iframe que tiene un dominio misma que la tuya, entonces usted será capaz de utilizar el $ ("iframe"). contenidos(). encuentran ("cuerpo") para manipular el contenido.

+1

¿Podría explicar los detalles? Muchas gracias @@ – bfhaha

+1

Lamento llegar tarde, no me di cuenta. 1. Cree una página php que muestre el contenido de la página que desea desde un parámetro GET. content.php ' ' 2. Luego, en su página principal, agregue un iframe que cargue esta página. '