11548 sujets

JavaScript, DOM et API Web HTML5

Hello,

Je sais qu'on peut faire ça depuis l'iframe avec : window.parent.ma_fonction_definie_dans_la_page();
Mais ce que je veux, c'est appeler une fonction définie dans la page et qu'elle s'exécute dans le contexte de l'iframe.

J'ai essayé de me débrouiller avec des apply et call, mais je suis toujours le contexte de la page.

Help ?

Merci
Hello,

Qu'est-ce que tu appelles exactement "le contexte de la page" ? As-tu un exemple simple pour démontrer ton problème ?
Problème intéressant, mais je me demande comment en pratique tu peux te retrouver dans ce besoin...

Sous Firefox c'est très facile : depuis l'iframe, on récup. le code du parent et on se l'ajoute :
var js = parent.document.getElementById("idScriptParent").innerHTML;
var jsNode = document.createElement("script");
jsNode.setAttribute("type", "text/javascript");
jsNode.innerHTML = js; // pas supporté par IE  [decu]
document.getElementsByTagName("head")[0].appendChild(jsNode);

Mais sous IE (qui ne gère visiblement pas la propriété innerHTML sur un node de script), je ne sais pas... Smiley sweatdrop
Une solution/bidouille qui a l'aire de fonctionner aussi avec IE :

html parent :
<script type="text/javascript" id="idScriptParent">
function laFonction(){
  alert(document.body.innerHTML);
}
</script>
*parent*
<button onclick="laFonction()">laFonction</button><br>
<iframe src="iframe.html"></iframe>


iframe.html :
<script type="text/javascript">
function inject() {
  var jsNode = parent.document.getElementById("idScriptParent");
  var js2inject = jsNode.innerHTML;
  // formate pour n'injecter que le corps de la fonction :
  // (attention, ici l'hypothèse est qu'il n'y a qu'une fonction
  // dans ton bloque de script)
  js2inject = js2inject.replace(/function [^{]*{/, "");
  js2inject = js2inject.replace(/}[^}]*$/, "");
  window.laFonction = new Function(js2inject);
}
</script>
*iframe*
<button onclick="inject()">injecter</button>
<button onclick="laFonction()">laFonction (injectée)</button>

Pas bien propre/beau mais ça fonctionne...
Si chadom a bien compris le besoin, j'ai bien peur qu'il n'y ait en effet pas de solution propre au problème. Encore une fois, je voudrais bien que celui-ci soit explicité pour que l'on ait un peu plus d'éléments...

Les références des variables utilisées dans une fonction sont résolues au moment de la définition de la fonction et non de son utilisation, contrairement à this.
Modifié par Julien Royer (07 Jun 2008 - 16:35)
Chadom a bien compris le problème. Sa proposition m'a permis d'avancer, j'ai encore des soucis mais c'est lié au javascript que me renvoit le serveur de pub (il y a des document.write).

Car, oui en pratique, je dois afficher de la pub dans une iframe et reloader celle-ci sans reloader la page. La fonction qui renvoie la "créa pub" est définit dans la page. Ainsi, la page peut appeler les fonctions de pub qui la concerne et peut donner la bonne fonction à l'iframe.

C'est assez tordu...

Ce que je retiens, c'est ce que tu viens de dire. Les références aux variables de la fonction sont définies lors de la définition, pas à l'exécution et contrairement à this.

Merci à vous deux !!