with w3schools uncaught origin from cross contentdocument content accessing javascript internet-explorer dom iframe document

javascript - w3schools - Error de acceso "Acceso denegado" al intentar acceder al objeto de documento de un<iframe> creado por programa(solo IE)



js iframe contentdocument (11)

Tengo un proyecto en el que necesito crear un elemento <iframe> usando JavaScript y anexarlo al DOM. Después de eso, necesito insertar algo de contenido en el <iframe>. Es un widget que se integrará en sitios web de terceros.

No configuro el atributo "src" del <iframe> porque no quiero cargar una página; más bien, se usa para aislar / sandbox el contenido que inserto en él para que no se encuentre con conflictos de CSS o JavaScript con la página principal. Estoy usando JSONP para cargar contenido HTML de un servidor e insertarlo en este <iframe>.

Esto funciona bien, con una seria excepción: si la propiedad document.domain está configurada en la página principal (que puede ser en ciertos entornos en los que se implementa este widget), Internet Explorer (probablemente todas las versiones, pero tengo confirmado en 6, 7 y 8) me da un error de "Acceso denegado" cuando intento acceder al documento objeto de este <iframe> que he creado. No ocurre en ningún otro navegador en el que haya probado (todos los más modernos).

Esto tiene sentido, ya que soy consciente de que Internet Explorer requiere que establezca el document.domain de todas las ventanas / marcos que se comunicarán entre sí con el mismo valor. Sin embargo, no conozco ninguna forma de establecer este valor en un documento al que no puedo acceder.

¿Alguien sabe de una manera de hacer esto - de alguna manera establecer la propiedad document.domain de este <iframe> creado dinámicamente? ¿O no lo estoy mirando desde el ángulo correcto? ¿Hay alguna otra forma de lograr lo que estoy buscando sin tener que enfrentar este problema? Necesito usar un <iframe> en cualquier caso, ya que la ventana aislada / espacio aislado es crucial para la funcionalidad de este widget.

Aquí está mi código de prueba:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en"> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/> <title>Document.domain Test</title> <script type="text/javascript"> document.domain = ''onespot.com''; // set the page''s document.domain </script> </head> <body> <p>This is a paragraph above the &lt;iframe&gt;.</p> <div id="placeholder"></div> <p>This is a paragraph below the &lt;iframe&gt;.</p> <script type="text/javascript"> var iframe = document.createElement(''iframe''), doc; // create <iframe> element document.getElementById(''placeholder'').appendChild(iframe); // append <iframe> element to the placeholder element setTimeout(function() { // set a timeout to give browsers a chance to recognize the <iframe> doc = iframe.contentWindow || iframe.contentDocument; // get a handle on the <iframe> document alert(doc); if (doc.document) { // HEREIN LIES THE PROBLEM doc = doc.document; } doc.body.innerHTML = ''<h1>Hello!</h1>''; // add an element }, 10); </script> </body> </html>

Lo he alojado en:

http://troy.onespot.com/static/access_denied.html

Como verá si carga esta página en IE, en el momento en que llamo alert (), tengo un identificador en el objeto ventana del <iframe>; Simplemente no puedo profundizar en su objeto de documento.

Muchas gracias por cualquier ayuda o sugerencia! Estaré en deuda con quien pueda ayudarme a encontrar una solución a esto.


si la propiedad document.domain se establece en la página principal, Internet Explorer me da un "Acceso denegado"

Suspiro. Sí, es un problema de IE (es difícil de decir, ya que no existe un estándar documentado para este tipo de desagrado). Cuando crea un iframe srcless, recibe un document.domain de la location.host del document.domain padre.host en lugar de su document.domain . En ese punto, has perdido mucho ya que no puedes cambiarlo.

Una solución horrenda es establecer src en javascript: URL (urgh!):

iframe.src= "javascript:''<html><body><p>Hello<//p><script>do things;<//script>''";

Pero, por algún motivo, dicho documento no puede establecer su propio document.domain partir del script en IE (buen "error no especificado"), por lo que no puede usar eso para recuperar un puente entre el padre (*). Puede usarlo para escribir todo el documento HTML, suponiendo que el widget no necesita hablar con su documento principal una vez que se crea una instancia.

Sin embargo, las URL JavaScript de iframe no funcionan en Safari, por lo que aún necesitaría algún tipo de búsqueda de navegador para elegir qué método usar.

*: Por alguna otra razón, puede , en IE, establecer document.domain partir de un segundo documento, document.written por el primer documento. Entonces esto funciona:

if (isIE) iframe.src= "javascript:''<script>window.onload=function(){document.write(//'<script>document.domain=///""+document.domain+"///";</////script>//');document.close();};<//script>''";

En este punto, el nivel de horror es demasiado alto para mí, estoy fuera. Haría el HTML externo como dijo David.



Bueno, sí, la excepción de acceso se debe al hecho de que document.domain debe coincidir en su padre y su iframe, y antes de hacerlo, no podrá establecer programáticamente la propiedad document.domain de su iframe.

Creo que su mejor opción aquí es señalar la página a una plantilla propia:

iframe.src = ''/myiframe.htm#'' + document.domain;

Y en myiframe.htm:

document.domain = location.hash.substring(1);


IE funciona con iframe como todos los demás navegadores (al menos para las funciones principales). Solo tienes que mantener un conjunto de reglas:

  • antes de cargar cualquier javascript en el iframe (la parte de js que necesita saber sobre el padre del iframe), asegúrese de que el padre haya modificado document.domain.
  • cuando se cargan todos los recursos de iframe, cambie document.domain para que sea el mismo que el definido en el elemento primario. (Debe hacer esto más adelante porque establecer el dominio hará que la solicitud del recurso iframe falle)

  • ahora puede hacer una referencia para la ventana principal: var winn = window.parent

  • ahora puede hacer una referencia al HTML principal, para manipularlo: var parentContent = $ (''html'', winn.document)
  • en este punto, debe tener acceso a la ventana / documento principal de IE y puede cambiarlo como no lo hará

Para mí, encontré que la mejor respuesta era comprobar el permiso del archivo al que se niega el acceso.

Acabo de actualizar a jQuery-1.8.0.js y recibí el error Acceso denegado en IE9.

Desde Windows Explorer

  • Hice clic derecho en el archivo seleccionado las Propiedades
  • Seleccionado la pestaña de seguridad
  • Haga clic en el botón Avanzado
  • Pestaña Propietario seleccionado
  • Haga clic en el botón Editar
  • Administradores seleccionados (MachineName / Administrators)
  • Haga clic en Aplicar
  • Cerré todas las ventanas.

Probó el sitio. No más problema

Tuve que hacer lo mismo para el script jQuery-UI que acababa de actualizar también


Parece que el problema con IE se produce cuando intenta acceder al iframe a través del objeto document.frames; si almacena una referencia al iframe creado en una variable, puede acceder al iframe inyectado a través de la variable (my_iframe en el código siguiente )

He conseguido que esto funcione en IE6 / 7/8

var my_iframe; var iframeId = "my_iframe_name" if (navigator.userAgent.indexOf(''MSIE'') !== -1) { // IE wants the name attribute of the iframe set my_iframe = document.createElement(''<iframe name="'' + iframeId + ''">''); } else { my_iframe = document.createElement(''iframe''); } iframe.setAttribute("src", "javascript:void(0);"); iframe.setAttribute("scrolling", "no"); iframe.setAttribute("frameBorder", "0"); iframe.setAttribute("name", iframeId); var is = iframe.style; is.border = is.width = is.height = "0px"; if (document.body) { document.body.appendChild(my_iframe); } else { document.appendChild(my_iframe); }


Siguiendo el método extremadamente simple de Andralor aquí resolvió el problema para mí: https://github.com/fancyapps/fancyBox/issues/766

Esencialmente, llame al iframe otra vez onUpdate:

$(''a.js-fancybox-iframe'').fancybox({ type: ''iframe'', scrolling : ''visible'', autoHeight: true, onUpdate: function(){ $("iframe.fancybox-iframe"); } });


Solo uso <iframe src="about:blank" ...></iframe> y funciona bien.


Tuve un problema similar y mi solución fue este fragmento de código (probado en IE8 / 9, Chrome y Firefox)

var iframe = document.createElement(''iframe''); document.body.appendChild(iframe); iframe.src = ''javascript:void((function(){var script = document.createElement(/'script/');'' + ''script.innerHTML = "(function() {'' + ''document.open();document.domain=/''' + document.domain + ''/';document.close();})();";'' + ''document.write("<head>" + script.outerHTML + "</head><body></body>");})())''; iframe.contentWindow.document.write(''<div>foo</div>'');

Probé varios métodos, pero este parecía ser el mejor. Puedes encontrar algunas explicaciones en mi blog here .


bueno, en realidad tengo un problema muy similar, pero con un giro ... digamos que el sitio de nivel superior es a.foo.com - ahora configuro el dominio del documento en a.foo.com

luego en el iframe que creo / poseo, también lo configuro también a.foo.com

tenga en cuenta que no puedo configurarlos también foo.com b / c hay otro iframe en la página apuntada a bafoo.com (que nuevamente usa a.foo.com pero no puedo cambiar el código del script allí)

notará que estoy esencialmente configurando document.domain a lo que ya sería de todos modos ... pero tengo que hacer eso para acceder al otro iframe que mencioné de bafoo.com

Dentro de mi marco, después de configurar el dominio, aunque todos los iframes tienen la misma configuración, aún recibo un error cuando alcanzo al padre en IE 6/7

hay otras cosas que realmente bizaree

en el nivel superior / exterior, si espero su evento de carga y configuro un temporizador, con el tiempo puedo acceder al fotograma al que necesito acceder ... pero nunca puedo acceder de abajo hacia arriba ... y realmente necesita ser capaz de

también si configuro todo para ser foo.com (que como dije no puedo hacer) ¡FUNCIONA! pero por alguna razón, cuando se usa el mismo valor que location.host ... no funciona y es increíble que me mate ...


para IE, el puerto importa. Entre los dominios, debe ser el mismo puerto.