2009-12-22 2 views
4

Il s'agit d'un problème très urgent et je serais éternellement redevable à quiconque peut donner un aperçu.Document.domain et <iframe> s casse le bouton "Retour" dans Internet Explorer

Je vais déployer un widget (appelé "ISM") sur un site tiers. Ce site utilise la propriété JavaScript document.domain pour assouplir les restrictions inter-domaines (par exemple, en définissant document.domain dans "a.example.com" et "b.example.com" sur "example.com" afin qu'ils puissent accéder à chaque les DOM de l'autre).

Cela provoque des problèmes avec mon script dans Internet Explorer en raison de la façon dont je construis un <iframe> qui est utilisé pour afficher le contenu HTML de mon widget. Dans Internet Explorer, en utilisant document.domain sur une page, puis en créant un <iframe> avec JavaScript, vous serez immédiatement "verrouillé" du <iframe> - par exemple, vous pouvez le créer, mais il n'est pas créé dans le document.domain correct, de sorte que vous n'êtes pas en mesure d'accéder à son DOM en raison de restrictions de sécurité. Ce n'est pas un problème dans les autres navigateurs.

Pour voir ce dont je parle, chargez cette page dans IE:

http://troy.onespot.com/static/3263/stage1.html

Vous devriez voir une erreur JavaScript: "Accès refusé".

Pour contourner ce problème, je suis le réglage de la dynamique créée <iframe> « attribut de « src » pour charger un fichier HTML statique qui est hébergé dans le même domaine (différent sous-domaine), et définissant sa propriété document.domain la valeur appropriée:

http://troy.onespot.com/static/3263/stage2.html

qui obtient autour de la question de la sécurité, et me permet d'écrire le document, je voulais écrire sur le <iframe>:

http://troy.onespot.com/static/3263/stage3.html

Avec ce document en place, mon widget fait un certain sondage à notre serveur pour obtenir du contenu HTML que je veux insérer dans un autre <iframe>, qui sera visible aux visiteurs de la page parent. Je suis à peu près simulé ici (en utilisant le contenu statique, ne pas contacter réellement notre serveur):

http://troy.onespot.com/static/3263/stage4.html

vient ici le problème. Quand je reçois ce contenu HTML et l'insère dans le second <iframe>, je suis maintenant confronté à un problème inhabituel avec un bouton "Retour" cassé. Cela se produit dans Firefox 3.0 et toutes les versions d'IE (éventuellement d'autres navigateurs), bien que cela ne se produise pas dans certains navigateurs que j'ai testés (Firefox 3.5, Safari, Chrome). Voir cette page:

http://troy.onespot.com/static/3263/stage5.html

Si vous cliquez sur le lien "Google", tout semble bien. Mais, lors de la navigation vers la page précédente (qui a ce dernier script de test), une autre erreur JavaScript est introduite: "Permission denied." Cela ne termine pas le script, et ne semble pas avoir d'effets néfastes, à part le fait que je suppose qu'il est connecté à la fonctionnalité du bouton "Retour", ce qui est un très gros problème - celui que j'essaie désespérément de résoudre. Je n'arrive pas à déboguer cette erreur car sa pile d'appels commence et s'arrête dans le script jQuery.

Vous pouvez également rencontrer cette erreur - avec des symptômes plus graves - en allant sur le dernier lien ci-dessus (stage5.html - effacer d'abord le cache de votre navigateur). Cliquez sur le "Étape 5 (nouveau)" lien, puis, après que cette page a été chargée, cliquez sur le bouton "Retour".

Le bouton "Retour" est complètement cassé! Vous ne pouvez pas aller n'importe où sauf à une autre URL.

C'est le problème que j'ai besoin de résoudre dès que possible. Toute idée ou aide serait extrêmement apprécié!

Je ne peux pas trop m'écarter de cette méthode, donc les suggestions en dehors de la boîte sont les bienvenues, mais je ne peux pas les utiliser en raison des contraintes des spécifications du widget. Je préférerais comprendre pourquoi le bouton "Back" se casse et comment le réparer, avec l'erreur "Permission denied" liée à jQuery.

+0

http://stackoverflow.com/questions/1796619/how-to-access-the-content-of-an-iframe-with-jquery/1796672#1796672 –

Répondre

3

Il est vraiment difficile d'essayer des correctifs pour cela en raison des domaines multiples. Une chose que j'ai entendu est que IE traite un src vide ou "about: blank" comme un domaine différent, mais il traite 'javascript: ""' comme le même domaine. Avez-vous expérimenté étape changeant un pour régler le iframe src à des choses comme:

iframe.src = 'javascript:""' 

Ou:

iframe.src = 'javascript:parent.getFrameHTML()' 
+1

Au-delà d'autres problèmes probables, si vous essayez d'utiliser cette solution sur une page HTTPS, vous obtiendrez une erreur de contenu mixte. – EricLaw

+1

C'est intéressant, car les gens définissent souvent le cadre src sur "javascript: void (0)" pour éviter les avertissements de contenu mixte: http://ajaxian.com/archives/ie-frame-bug – Annie

1

Une partie du problème semble être que IE (au moins IE 7) ajoute deux entrées à l'historique nommé "Domain" lorsque je clique sur le lien "Stage 5 Again". Lorsque vous utilisez la petite flèche déroulante à côté du bouton Précédent, vous verrez l'historique des pages vous permettant de revenir en arrière plus d'une étape. Je vois les deux entrées précédentes sont répertoriées en tant que "Domaine" et en cliquant sur l'un de ceux qui me amène à la même page. Le quatrième point (après la page courante, le domaine, le domaine) est le bon lien "ISM Back Button" vers la page originale de stage5.html.

Donc, le problème n'est pas exactement que le bouton de retour ne fonctionne pas, mais juste que les entrées de l'historique sont ajoutées et que le bouton de retour vous emmène au mauvais endroit. Je n'ai pas de réponse à la question de savoir pourquoi ces entrées "Domain" sont ajoutées à l'historique, mais j'espère que cela vous aidera dans une direction utile.

Bonne chance!

Questions connexes