2009-06-07 8 views
0

J'ai un script Greasemonkey qui ajoute un iframe à la page (appelez-le Page 1). L'iframe contient une autre page (appelez la page 2). Le script fonctionne également. Les pages 1 et 2 sont sur des domaines différents.Comment puis-je appeler une fonction dans un parent iframe en utilisant Greasemonkey

Je voudrais autoriser le code s'exécutant dans la page 2 pour appeler une fonction sur la page 1. Compte tenu des restrictions plus faibles sur le code Greasemonkey, est-ce possible?

Répondre

1

Le navigateur empêchera cela, car les domaines sont différents.

Il y a quelques trucs que vous pouvez utiliser pour communiquer entre les images:

  1. Ajouter un enregistrement DNS pour l'autre site au domaine du site extérieur (www.somewebsite.com et someapp.somewebsite.com) . Ensuite, utilisez document.domain = "somewebsite.com" dans les deux pages "JavaScript".
  2. Utilisez HTML 5 postMessage() pour communiquer entre les trames. Je sais que cela fonctionne dans Firefox 3 et Internet Explorer 8, mais pas dans IE7.
  3. Vous pouvez transmettre des messages simples à une autre page en définissant l'URL de la fenêtre parente. Remarque: Il semble que les navigateurs empêchent le paramétrage de l'URL parente. Cette méthode ne fonctionnera que pour la communication unidirectionnelle de parent à enfant.

Ad 3: Vous ne pourrez pas lire l'URL de l'autre image, mais vous pouvez le définir. Si vous modifiez l'URL exactement la même page, mais avec un composant #ancre à l'URL, la page ne sera pas réellement recharger:

window.frames["childFrame"].location.href = "http://www.somewebsite.com/#message" 

Vous aurait alors besoin d'ajouter un script à la page extérieure qui régulièrement interroge c'est location.href et traite les messages. Oui, c'est moche, mais si c'est bien fait, ça marchera dans tous les navigateurs courants.

+1

Ooh, postMessage() fera bien. Mon idée était d'exploiter les privilèges accordés aux scripts Greasemonkey pour contourner la restriction du même domaine. C'est mieux; postMessage() est en fait destiné à cela. :) – Peeja

+0

Je dois maintenant supporter IE7, donc j'ai abandonné sur postMessage(). Je ne peux pas faire # 1 non plus. # 3 Je pourrais le faire, mais je n'arrive pas à le faire fonctionner. Dans FF3 au moins, je n'ai pas l'autorisation de définir window.parent.location.href, même pour l'URL actuelle du parent. Est-ce que je manque quelque chose? – Peeja

+0

Hmm, j'ai seulement utilisé cette méthode pour communiquer du cadre parent au cadre incorporé, pas l'inverse. Il y a probablement des limites à cela pour empêcher les cadres de se briser et se forcer à être la première page. – Thorarin

Questions connexes