2009-10-21 30 views
46

Tengo un problema al llamar a una función de JavaScript en un iframe desde la página principal. Aquí es mis dos páginas:Llamar a la función javascript en iframe

mainPage.html

<html> 
<head> 
    <title>MainPage</title> 
    <script type="text/javascript"> 
     function Reset() 
     { 
      if (document.all.resultFrame) 
       alert("resultFrame found"); 
      else 
       alert("resultFrame NOT found"); 

      if (typeof (document.all.resultFrame.Reset) == "function") 
       document.all.resultFrame.Reset(); 
      else 
       alert("resultFrame.Reset NOT found"); 
     } 
    </script> 
</head> 
<body> 
    MainPage<br> 
    <input type="button" onclick="Reset()" value="Reset"><br><br> 
    <iframe height="100" id="resultFrame" src="resultFrame.html"></iframe> 
</body> 
</html> 

resultFrame.html

<html> 
<head> 
    <title>ResultPage</title> 
    <script type="text/javascript"> 
     function Reset() 
     { 
      alert("reset (in resultframe)"); 
     } 
    </script> 
</head> 
<body> 
    ResultPage 
</body> 
</html> 

(Sé que document.all no es recomendable, pero esta página sólo debe ser visto con IE internamente y no creo que ese sea el problema)

Cuando Presiono el botón Restablecer, obtengo "resultFrame found" y "resultFrame.Reset NOT found". Parece tener una referencia al marco pero no puede llamar a la función en el marco, ¿por qué?

+1

duplicado de http://stackoverflow.com/questions/251420/invoking-javascript-in-iframe-from-parent-page –

+0

Posible duplicado de [Invocar código JavaScript en un iframe de la página principal] (http://stackoverflow.com/questions/251420/invoking-javascript-code-in-an-iframe-from-the-parent-page) – luk3yx

Respuesta

86

Uso:

document.getElementById("resultFrame").contentWindow.Reset(); 

para acceder a la función de reinicio en el iframe

document.getElementById("resultFrame") obtendrá el iframe en su código, y contentWindow conseguirá el objeto de la ventana en el marco flotante. Una vez que tenga la ventana secundaria, puede consultar javascript en ese contexto.

También vea HERE en particular la respuesta de bobince.

+3

Hola Jonathan, ¿la ventana .contentWindow aún funciona? Hago 'console.log (document.getElementById ('iframeID'). ContentWindow)' y en Firebug muestra correctamente mi función 'test()' en mi iframe, pero cuando voy a llamar a la función dice que no es una función , ¡pero es! Probándolo en FF4. –

2

objectframe.contentWindow.Reset() primero necesita hacer referencia al elemento de nivel superior en el marco.

3

llamada

window.frames['resultFrame'].Reset(); 
1

Cuando se accede a través de resultFrame document.all que sólo lo hace como un elemento HTML, no un marco de ventana. Obtienes el mismo problema si tienes un frame frame en un evento que usa una "autoreferencia" de este.

Reemplazar:

document.all.resultFrame.Reset(); 

Con:

window.frames.resultFrame.Reset(); 

O:

document.all.resultFrame.contentWindow.Reset(); 
5

En lugar de obtener la estructura del documento, trate de conseguir el marco del objeto de la ventana.

en el ejemplo anterior cambiar esta:

if (typeof (document.all.resultFrame.Reset) == "function") 
    document.all.resultFrame.Reset(); 
else 
    alert("resultFrame.Reset NOT found"); 

a

if (typeof (window.frames[0].Reset) == "function") 
    window.frames[0].Reset(); 
else 
    alert("resultFrame.Reset NOT found"); 

el problema es que el alcance de la javascript dentro del marco flotante no está expuesto a través del elemento DOM para el marco flotante. solo los objetos de ventana contienen la información de alcance de JavaScript para los marcos.

4

Para una mayor robustez:

function getIframeWindow(iframe_object) { 
    var doc; 

    if (iframe_object.contentWindow) { 
    return iframe_object.contentWindow; 
    } 

    if (iframe_object.window) { 
    return iframe_object.window; 
    } 

    if (!doc && iframe_object.contentDocument) { 
    doc = iframe_object.contentDocument; 
    } 

    if (!doc && iframe_object.document) { 
    doc = iframe_object.document; 
    } 

    if (doc && doc.defaultView) { 
    return doc.defaultView; 
    } 

    if (doc && doc.parentWindow) { 
    return doc.parentWindow; 
    } 

    return undefined; 
} 

y

... 
var el = document.getElementById('targetFrame'); 

getIframeWindow(el).reset(); 
... 
2

La primera y principal condición que debe cumplirse es que tanto el padre como iframe deben pertenecer a un mismo origen. Una vez hecho esto, el niño puede invocar al padre utilizando el método window.opener y el padre puede hacer lo mismo para el niño como se menciona arriba

0

Si no puede usarlo directamente y encuentra este error: Blocked a frame con el origen "http://www ..com" de acceder a un marco de origen cruzado. Puede usar postMessage() en lugar de usar la función directamente.

Cuestiones relacionadas