3 votes

window.opener n'est pas correct

J'ouvre une popup et je veux qu'une action de clic dans cette popup provoque l'exécution de jQuery dans la page qui l'a ouverte. Tout ce que je trouve en ligne dit que je devrais pouvoir le faire avec window.opener, (par ex. JQuery - Écrire dans la fenêtre de l'ouvreur )

Mais quand je console.log window.opener Il s'agit simplement d'une "vérité", et non d'un objet réel. window.opener.jQuery est indéfinie, tout comme l'est window.opener.$ et "window.opener.document".

Voici le code d'ouverture de la fenêtre :

window.open('http://google.com' , "moderatorWindow", 'width=300, height=300');

C'est dans Safari. D'autres pages sont capables de lancer une fenêtre contextuelle et lorsque j'inspecte window.opener sur ces pages, j'obtiens un véritable objet. Qu'est-ce qui ne va pas ?

2voto

Mauvis Ledford Points 12424

Votre variable est true et n'est pas un objet en raison des règles de politique du même domaine. Tout comme une iframe, si la fenêtre contextuelle que vous ouvrez ne se trouve pas sur le même domaine ou sous-domaine, elle est perdue pour vous après que vous l'avez créée. Le web serait un endroit très peu sûr si je pouvais, par exemple, ouvrir une iframe (cachée) sur mon site vers gmail.com et être en mesure de lire votre courrier électronique.

Même si la fenêtre contextuelle se trouve sur un sous-domaine, vous devez faire un travail supplémentaire et définir la valeur document.domain des deux fenêtres sur le domaine racine (par exemple, mydomain.com). Cela permet de s'assurer que le site qui apparaît dans la fenêtre contextuelle est connu de son parent (là encore, pensez à la sécurité, si ma communauté coke.ning.com pouvait ouvrir une iframe cachée vers votre pepsi.ning.com et faire des tentatives de force brute pour se connecter, etc.)

Pour prouver ce que j'avance, essayez d'aller sur google.com et d'ouvrir Firebug (ou Inspector si vous utilisez Safari ou Chrome) et de faire :

var bob = window.open('http://google.com' , "moderatorWindow", 'width=300, height=300');
bob.window.location.href; // returns "http://www.google.com/"

Enfin, vous pouvez appeler jQuery sur la page enfant pour modifier des éléments sur la même page et vice-versa, mais vous ne pouvez pas utiliser jQuery d'une page pour modifier le dom de l'autre page. J'ai essayé cela il y a quelques années pour gagner du temps de chargement et, à moins que quelque chose n'ait changé, cela ne fonctionne pas. jQuery semble être lié à l'objet fenêtre de l'endroit où il a été créé. Des choses bizarres se produisent.

0voto

RobG Points 41170

Vous êtes probablement en train d'appeler :

console.log(window.opener);

qui doit appeler le toString() de n'importe quel window.opener des références. Il doit faire référence à un objet fenêtre, qui est un objet hôte. Selon la norme ECMA-262, la référence d'un objet hôte est toString() (si elle en a une) peut renvoyer tout ce qu'elle veut, voire lancer une erreur (essayez-la sur certains objets hôtes IE mis en œuvre à l'aide d'ActiveX).

Cet article peut vous aider : http://developer.apple.com/library/safari/#documentation/AppleApplications/Conceptual/SafariJSProgTopics/Articles/Cross-documentmessaging.html

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X