2009-05-14 5 views
0

J'ai une simple application ajaxProblèmes lors de l'utilisation de window.opener

De ceci, un popup est lancé, avec un formulaire.

La page de résultats du formulaire et l'application ajax ont en commun un fichier javascript. Dans la fenêtre contextuelle, dans la page resultpage, j'essaie d'appeler une méthode du fichier javascript commun, pour l'appliquer à la fenêtre parente.

Mon fichier javascript contient une méthode updateLayer qui, lorsqu'elle est extraite de la fenêtre parente, fonctionne correctement. Je n'ai rien quand j'essaie de l'appeler depuis la fenêtre contextuelle.

Le resultpage dans la fenêtre pop-up a

<script type="text/javascript" src="x.js">window.opener.updateLayer("Layer3", "380118179930"); </script> 

avant tout html.

Rien ne se passe dans la fenêtre parent. J'ai aussi essayé window.parent.

Quelle est la raison et la solution de ce problème?

+0

David Dorwards réponse est certainement au moins une partie de la solution - vous ne pouvez pas mélanger src et innertext avec des scripts. – annakata

+0

C'est vrai. Ne mélange pas ça. Il est préférable d'inclure x.js dans l'en-tête ici. – Thanks

Répondre

3

Je suppose que cela est lié à this question, demandé par un autre utilisateur qui se trouve également nommé Josh. Dans ma réponse à cette question, j'ai essayé d'expliquer que les fonctions d'un fichier Javascript inclus dans votre fenêtre parent seraient attachées à l'objet window, donc vous utilisez window.opener pour avoir accès à cet objet window à appeler leur.

On dirait que vous avez presque résolu cela, mais le problème ici est qu'en incluant src="x.js" dans la balise de script de votre réponse de formulaire, vous écrasez tout code placé dans le script. De plus, puisque x.js est inclus dans la fenêtre parente, il n'est pas nécessaire de l'avoir dans la fenêtre contextuelle, de toute façon.

Le code pour votre réponse sous forme devrait ressembler à ceci:

<script type="text/javascript"> 
window.opener.updateLayer("Layer3", "380118179930"); 
</script> 

J'ai supprimé l'attribut src="x.js", qui autrement empêcher le code entre les balises de <script></script> en cours d'exécution.

+0

Merci beaucoup pour votre aide. –

-3

Créez une nouvelle fonction updateLayer dans votre fichier html parent. Renommez-le différent et appelez le updateLayer d'origine. par exemple.

function updateLayerPage(arg1, arg2) 
{ 
    updateLayer(arg1, arg2); 
} 

puis appeler cette nouvelle fonction de la page enfant

window.opener.updateLayerPage("Layer3", "380118179930"); 
+0

Y a-t-il un moyen d'éviter cela? Cette fonction repose sur plusieurs autres fonctions .... –

+2

Je ne vois pas pourquoi cela pourrait aboutir à quelque chose. Si vous pouvez accéder à updateLayerPage vous pouvez accéder à updateLayer, l'indirection n'ajoute rien. – annakata

-1

Puisque vous avez donné l'élément de script d'un attribut src, les résultats de x.js seront analysés comme JS et le contenu du texte de l'élément sera ignoré.

<script type="text/javascript" src="x.js"></script> 
<script type="text/javascript"> 
    window.opener.updateLayer("Layer3", "380118179930"); 
</script> 
+0

Quelle serait la bonne façon de faire cela? –

+0

Je mettais à jour la réponse comme vous l'avez commenté. – Quentin

+0

Ahh, merci. Je teste ceci, le parent n'est toujours pas mis à jour cependant .. –

0

Votre problème peut être que vous avez deux fichiers JavaScript avec le même contenu, alors qu'aucun espace de noms n'est appliqué. D'abord, votre parent inclut le fichier file.js où votre updateLayer() est définie. Ensuite, le parent ouvre la fenêtre enfant, qui inclut également ce fichier. Si vous faites cela, vous avez deux threads en cours d'exécution, où chacun d'eux peut avoir ses propres fonctions et objets sans déranger l'autre. Je suppose que votre fonction est globale. Cela peut entraîner des problèmes si aucun espace de noms n'est utilisé. En outre, il peut arriver que votre grande bibliothèque ajax crée des iframes et des choses comme ça, et vous ne verrez rien de cela parce que cela arrive sous le capot.

Essayez donc: top.window.opener.updateLayer ("Layer3", "380118179930");

Si cela ne vous aide pas, essayez d'ouvrir une fenêtre vide sans file.js et appelez cette fonction à partir de l'ouvre-porte. Si cela fonctionne, enveloppez le contenu de ce file.js dans un espace de noms comme myNamespace = {.... gros contenu de fichier entre ...}, faites deux versions de cela (ou mieux inclure dynamiquement le contenu) et assurez-vous avoir deux espaces de noms différents. JavaScript ne fonctionne le plus souvent pas comme vous le pensez.

De même, assurez-vous que l'adresse URL de votre fenêtre ouverte est exactement le même domaine. Cela peut entraîner des problèmes de sécurité, de sorte que le navigateur refuse l'accès d'une fenêtre enfant à son parent.

0

Josh,

Pouvez-vous déterminer si la fonction est déclenchée à tout, comme annakata suggère? Par exemple. en mettant une boîte d'alerte sur la première ligne de la fonction?

Sinon: comment la fonction updateLayer est-elle définie dans x.js?

Si elle est définie comme ceci:

function updateLayer(layer, result) { 
    // ... 
} 

... alors il devrait fonctionner correctement.

Si elle est définie comme suit:

var updateLayer = function(layer, result) { 
    // ... 
} 

alors il ne disponible en tant que propriété de l'objet window (et donc pas disponible en tant que propriété de window.opener non plus). Dans Firefox, au moins; Je n'ai pas testé cela dans IE ou d'autres navigateurs.

Editer: pourquoi cette question porte la mention «ajax»? AFAICS, tout le problème réside sur le côté client de l'application; pas d'ajax est impliqué.

+0

Salut, oui, j'ai essayé comme le suggère Tobias, et ça marche bien. en utilisant à la fois x.js et window.parent, ce qui l'a fait échouer. –

0

Essayez suivante:

parent.window.updateLayer(); 

dans une balise <script> séparée.

Je ne sais pas si cela fonctionne avec src = some.js et le script en ligne en même temps.

Questions connexes