para navegador imprimir gratis google errores depurar debug consola comandos chrome activar abrir javascript google-chrome safari frames

javascript - navegador - No se puede acceder al contenido de otro fotograma en Chrome



imprimir en la consola del navegador (4)

Tengo dos marcos. Las páginas en ambos marcos provienen del mismo dominio (ya sea localhost o un dominio en vivo, ambos usan el mismo protocolo).

El primer fotograma necesita acceder a los elementos del segundo fotograma (xsample) cuando está completamente cargado y todas las funciones de onload JS se han completado. Pero el segundo fotograma tarda un tiempo en cargarse.

<frameset cols="*,*" rows="*" border="0" framespacing="0"> <frame src="picker.asp" name="xpicker" frameborder="no" marginwidth="15" marginheight="15"> <frame src="doc.asp" name="xsample" frameborder="no" marginwidth="15" marginheight="15"> </frameset>

El siguiente código funciona en IE y Firefox, pero no en Chrome o Safari, en esos parent.xsample siempre es falso

function startWork(){ if(isSurveyLoaded()==false){ SL=setTimeout("startWork()",1000); return; } else{ setTimeout("doMoreWork()",2000); } } function isSurveyLoaded(){ if(!parent.xsample){ return false; } if(!parent.xsample.self.name){ return false; } if(parent.xsample.document.readyState!=''complete''){ return false; } else{ return true; } }


Use parent.frames["xsample"] para acceder al marco.

Las referencias implícitas a elementos con nombre en el objeto global no están estandarizadas.

En una nota diferente, nunca haga setTimeout("doMoreWork(), 1000)" ya que esto obliga a la VM a usar eval para ejecutar el código.
Use setTimeout(doMoreWork, 1000) que es la forma correcta de hacerlo.


Lo solucioné por:
1. Dar al marco objetivo tanto un nombre como una identificación
2. pruebas para ambos
3. prueba de que una variable (finishedLoading) dentro del marco de destino se estableció en verdadero
(código modificado para usar === en lugar de == cuando se prueba finishedLoading)

function isSurveyLoaded(){ if(!(parent.frames["xsample"] || parent.document.getElementById(''xsample''))){ return false; } else{ if(parent.frames["xsample"]){ target=parent.frames["xsample"]; } else{ target=parent.document.getElementById(''xsample''); } } if ((target.finishedLoading===''undefined'') || (target.finishedLoading===false) ){ return false; } else{ return true; } }

Ahora simplificado mediante el uso

<frame src="doc.asp" onload="frameisloaded(this)" name="xsample" id="xsample" frameborder="no" marginwidth="15" marginheight="15">


En Chrome, al acceder a window.frames [index] obtiene un objeto Window, desde el cual puede acceder a cosas buenas como el documento dentro del contenido de ese marco.

Al acceder a él por document.getElementById, solo se devuelve el elemento iframe, con casi ningún atributo útil para profundizar en el DOM.

¡Este error al no poder acceder al objeto Window por su nombre usando window.frames [name] como lo hacen otros navegadores debería ser reparado!


Para abordar los comentarios anti-marcos: Ser crítico con aquellos que usan marcos no responde la pregunta. En segundo lugar, hay cosas que los marcos funcionan mejor que cualquier otra alternativa.

Entonces, la pregunta no debería ser: "¿Qué desarrollador web que se respete usa conjuntos de marcos?" Debería ser: "¿Qué navegador de características completas que se respete no los admite adecuadamente?" y una de las respuestas es obviamente Chrome.

Han rociado "indicadores de seguridad" sobre varias funciones en su intérprete, incluidas aquellas que facilitan la transferencia de cierta información entre páginas en marcos diferentes. En consecuencia, cosas como esta no funcionan cuando se ejecutan localmente:

top.frames [2] .document.getElementById (ID)

Sin embargo, cuando se ejecuta en el servidor, generalmente funciona bien.

Si necesita que funcione localmente en Chrome, debe usar algún tipo de solución. Tendrás que ser creativo. En algunos casos, como cuando conoce las variables de situación, puede crear una matriz para manejar las diversas posibilidades (que es un arrastre cuando no es necesario que sea complejo de lo contrario).