Je n'arrive pas à appeler une fonction JavaScript dans une variable iframe
à partir de la page parente. Voici mes deux pages:
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>
(Je sais que document.all
n'est pas recommandé, mais cette page ne doit être affichée qu'avec IE en interne et je ne pense pas que ce soit le problème)
Lorsque j'appuie sur le bouton de réinitialisation, j'obtiens "resultFrame found" et "resultFrame.Reset NOT found". Il semble y avoir une référence au cadre mais ne peut pas appeler la fonction sur le cadre, pourquoi est-ce?
Utilisation:
document.getElementById("resultFrame").contentWindow.Reset();
pour accéder à la fonction de réinitialisation dans l'iframe
document.getElementById("resultFrame")
aura l'iframe dans votre code et contentWindow
aura l'objet window dans l'iframe Une fois que vous avez la fenêtre enfant, vous pouvez faire référence à javascript dans ce contexte.
Voir aussi ICI en particulier la réponse de bobince.
Au lieu d'obtenir le cadre du document, essayez de le récupérer à partir de l'objet window.
dans l'exemple ci-dessus, changez ceci:
if (typeof (document.all.resultFrame.Reset) == "function")
document.all.resultFrame.Reset();
else
alert("resultFrame.Reset NOT found");
à
if (typeof (window.frames[0].Reset) == "function")
window.frames[0].Reset();
else
alert("resultFrame.Reset NOT found");
le problème est que la portée du javascript dans l'iframe n'est pas exposée via l'élément DOM pour l'iframe. seuls les objets window contiennent les informations de javascript pour les cadres.
Pour encore plus de robustesse:
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;
}
et
...
var el = document.getElementById('targetFrame');
var frame_win = getIframeWindow(el);
if (frame_win) {
frame_win.reset();
...
}
...
Appel
window.frames['resultFrame'].Reset();
objectframe.contentWindow.Reset()
vous devez d'abord faire référence à l'élément de niveau supérieur dans le cadre.
La première et principale condition à remplir est que le parent et l'iframe appartiennent à la même origine. Une fois que cela est fait, l'enfant peut invoquer le parent à l'aide de la méthode window.opener et le parent peut faire de même pour l'enfant, comme indiqué ci-dessus.
Lorsque vous accédez à resultFrame via document.all, il le extrait uniquement en tant qu'élément HTML, pas de cadre de fenêtre. Vous obtenez le même problème si vous avez un cadre déclenche un événement en utilisant une référence "this".
Remplacer:
document.all.resultFrame.Reset();
Avec:
window.frames.resultFrame.Reset();
Ou:
document.all.resultFrame.contentWindow.Reset();
Si vous ne pouvez pas l'utiliser directement et si vous rencontrez l'erreur suivante: Blocage d'un cadre avec Origin " http: // www .. com" pour accéder à un cadre d'origine croisée ..__ postMessage () au lieu d'utiliser directement la fonction.