Javascript, appeler la fonction fenêtre enfant de l'ouvreur ne fonctionne pas

Je développe une application Web qui ouvre une fenêtre contextuelle à l'aide de windows.open (…). J'ai besoin d'appeler une fonction sur la fenêtre ouverte en utilisant le handle renvoyé par "window.open", mais je reçois toujours le message d'erreur "addWindow.getMaskElements n'est pas une fonction", comme s'il ne pouvait pas accéder à la fonction déclarée Sur la fenêtre enfant. C'est le comportement dans IE et FF. Mon code ressemble à ceci:

function AddEmail(target,category) { if(addWindow == null) { currentCategory = category; var left = getDialogPos(400,220)[0]; var top = getDialogPos(400,220)[1]; addWindow = window.open("adicionar_email.htm",null,"height=220px, width=400px, status=no, resizable=no"); addWindow.moveTo(left,top); addWindow.getMaskElements (); } } 

J'ai googlé et lu de différentes sources fiables et apparemment cela est censé fonctionner, mais ce n'est pas le cas. Une autre chose, les fonctions dans la fenêtre enfant sont déclarées dans un fichier .js distinct qui est inclus dans le fichier adds_email.htm. Cela fait-il une différence? Il ne devrait pas … Donc, si quelqu'un a rencontré un problème similaire, ou a une idée de ce que je fais mal, veuillez répondre à ce message. Merci d'avance.

Kenia

La création de la fenêtre n'est pas une opération de blocage; Le script continue à s'exécuter pendant que cette fenêtre ouvre et charge le HTML et javascript et l'analyse.

Si vous deviez ajouter un lien sur votre page d'origine comme ceci:

 <a href="#" onclick="addWindow.getMaskElements();">Test</a> 

Vous verriez cela fonctionner. (Je l'ai essayé juste pour être sûr.)

**MODIFIER **

Quelqu'un d'autre a posé une solution de contournement en appelant une charge dans le document cible, voici une autre approche:

 function AddEmail() { if(addWindow == null) { addWindow = window.open("test2.html",null,"height=220px, width=400px, status=no, resizable=no"); } if(!addWindow.myRemoteFunction) { setTimeout(AddEmail,1000); } else { addWindow.myRemoteFunction(); } } 

Cela continue d'essayer d'appeler addWindow.myRemoteFunction chaque 1 seconde jusqu'à ce qu'il parvienne à l'appeler avec succès.

Le problème est que window.open retourne assez rapidement, le document demandé et les autres éléments auxquels ce document peut se référer par la suite ne seront pas encore chargés dans la fenêtre.

Par conséquent, essayer d'appeler cette méthode si tôt va échouer. Vous devez attacher une fonction à l'événement de chargement de la fenêtre ouverte et essayer de vous faire appel à partir de cette fonction.

Le problème avec ce qui suit est:

Lorsque le javascript est exécuté dans la fenêtre parent, la fenêtre enfant ne se charge pas. Par conséquent, la fonction d'appel de la fenêtre parent est dans la boucle infinie et elle entraîne une panne de la fenêtre.

La création de la fenêtre n'est pas une opération de blocage; Le script continue à s'exécuter pendant que cette fenêtre ouvre et charge le HTML et javascript et l'analyse.

Si vous deviez ajouter un lien sur votre page d'origine comme ceci:

 <a href="#" onclick="addWindow.getMaskElements();">Test</a> 

Vous verriez cela fonctionner. (Je l'ai essayé juste pour être sûr.)

**MODIFIER **

Quelqu'un d'autre a posé une solution de contournement en appelant une charge dans le document cible, voici une autre approche:

 function AddEmail() { if(addWindow == null) { addWindow = window.open("test2.html",null,"height=220px, width=400px, status=no, resizable=no"); } if(!addWindow.myRemoteFunction) { setTimeout(AddEmail,1000); } else { addWindow.myRemoteFunction(); } } 

Cela continue d'essayer d'appeler addWindow.myRemoteFunction chaque 1 seconde jusqu'à ce qu'il parvienne à l'appeler avec succès.

Vous appelez la fonction immédiatement après avoir ouvert la fenêtre; La page de la fenêtre contextuelle n'est peut-être pas encore chargée, donc la fonction peut ne pas être définie à ce moment-là.