Chamando a function javascript no iframe

Eu tenho problema chamando uma function JavaScript em um iframe da página pai. Aqui estão minhas duas páginas:

mainPage.html

   MainPage  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"); }    MainPage


resultFrame.html

   ResultPage  function Reset() { alert("reset (in resultframe)"); }    ResultPage   

(Eu sei que document.all não é recomendado, mas esta página só deve ser vista com IE internamente e eu não acho que é o problema)

Quando pressiono o botão Reset, recebo “resultFrame found” e “resultFrame.Reset NOT found”. Parece ter uma referência ao quadro, mas não pode chamar a function no quadro, por que isso?

Usar:

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

para acessar a function Reset no iframe

document.getElementById("resultFrame") obterá o iframe em seu código e o contentWindow obterá o object window no iframe. Depois de ter a janela filho, você pode se referir ao javascript nesse contexto.

Veja também AQUI em particular a resposta de bobince.

Em vez de obter o quadro do documento, tente obter o quadro do object da janela.

no exemplo acima, altere isso:

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

para

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

O problema é que o escopo do javascript dentro do iframe não é exposto através do elemento DOM para o iframe. somente objects de janela contêm as informações de escopo do javascript para os frameworks.

Para ainda mais 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; } 

e

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

Ligar

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

objectframe.contentWindow.Reset() você precisa primeiro fazer referência ao elemento de nível superior no frame.

A primeira e mais importante condição que precisa ser atendida é que tanto o pai quanto o iframe devem pertencer à mesma origem. Feito isso, o filho pode invocar o pai usando o método window.opener e o pai pode fazer o mesmo para o filho, como mencionado acima.

Quando você acessa o resultFrame através do document.all, ele somente o puxa como um elemento HTML, não como um quadro de janela. Você terá o mesmo problema se tiver um frame triggersndo um evento usando uma auto-referência “this”.

Substituir:

 document.all.resultFrame.Reset(); 

Com:

 window.frames.resultFrame.Reset(); 

Ou:

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

Se você não pode usá-lo diretamente e se você encontrar esse erro: Bloqueado um quadro com origem ” http: // www ..com” de acessar um quadro de origem cruzada. Você pode usar postMessage () em vez de usar a function diretamente.