2008-09-30 7 views
23

Pour envoyer des formulaires AJAX sous une forme comportant de nombreux paramètres, j'utilise une solution de création d'un iframe, de l'affichage du formulaire par POST, puis de l'accès au iframe. contenu. spécifiquement, j'accéder au contenu comme ceci:Erreur "Accès refusé" lors de l'accès à l'objet document iframe

$("some_iframe_id").get(0).contentWindow.document 

Je l'ai testé et cela a fonctionné.

Sur certaines pages, j'ai commencé à recevoir une erreur «Accès refusé». Pour autant que je sache, cela ne devrait pas arriver si l'iframe est servi depuis le même domaine. Je suis assez sûr que ça fonctionnait avant. Quelqu'un a une idée?

Si je ne suis pas assez clair: Je poste sur le même domaine. Donc, ce n'est pas une demande inter-domaine. Je suis en train de tester sur IE seulement.

P.S. Je ne peux pas utiliser de simples requêtes ajax POST (ne pas demander ...)

Répondre

48

Résolu par moi-même! Le problème était que, même si la bonne réponse était envoyée (vérifiée avec Fiddler), elle était envoyée avec un code d'erreur HTTP 500 (au lieu de 200). Il s'avère donc que si une réponse est envoyée avec un code d'erreur, IE remplace le contenu du iframe par un message d'erreur chargé depuis le disque (res://ieframe.dll/http_500.htm), ce qui provoque l'erreur d'accès interdomaine refusée.

+0

Je télécharge un fichier en utilisant fileupload.js (il utilise iframe). On dirait que j'ai le même problème, mais je ne suis pas sûr de ce que cela peut causer. On dirait juste un problème de timeout. Comment avez-vous empêché cela? –

+0

Je ne suis pas sûr de comprendre la question. Dans tous les cas, si vous pensez que c'est lié à ma solution, vous devriez jeter un oeil sur le code HTTP retourné avec la réponse au téléchargement. – Ovesh

+3

Merci. Dans mon cas, je renvoie 400 'Bad Request 'si les fichiers téléchargés contiennent des erreurs (une certaine validation). Il provoque l'erreur «Accès refusé». – manikanta

-1

Fondamentalement, cette erreur se produit lorsque le document dans le cadre et en dehors de ii ont des domaines différents. Donc, pour empêcher les navigateurs de script côté-côté désactiver une telle exécution.

+2

Je poste sur le même domaine. – Ovesh

-1

si elle est un problème de domaine (ou sous-domaine), comme www.foo.com envoyant une demande à www.api.foo.com

sur chaque page que vous pouvez définir le

document.domain = www.foo.com 

pour autoriser les autorisations "inter-domaines"

1

Je sais que cette question est super-vieille, mais je voulais mentionner que la réponse ci-dessus a fonctionné pour moi: la définition du document.domain pour être le même sur chacune des pages-- la page parente et la page iframe. Cependant, dans ma recherche, je ne trouve cet article intéressant:

http://softwareas.com/cross-domain-communication-with-iframes

5

erreurs de domaine croix causedby 3 choses en ce qui concerne iFrames:

  1. iFrame ouvert avec l'URL différente (par exemple l'ouverture www.foo.com) de la page parent (www.ooof.com)

  2. ports différents (ouverture iframe avec url:) différent du port d'origine

  3. différents protocoles: iFrame d'ouverture avec URL HTTPS à partir d'une page parent qui est un serveur HTTP

chèque ceux si vous rencontrez ce problème.

2

Mon problème était l'en-tête HTTP X-Frame-Options. Ma configuration d'Apache l'a mis à:

Header always append X-Frame-Options DENY 

Enlever cela lui a permis de travailler. Plus précisément dans mon cas j'utilisais transport iframe pour jQuery avec le plugin de téléchargement de fichiers jQuery pour télécharger des fichiers dans Internet Explorer 9 et IE 10.

+0

J'ai fait face au même problème dans mon environnement. Définir X-Frame-Options à SAMEORIGIN a résolu le problème pour moi – IsAs

1

Notez que si vous avez un iframe avec src='javascript:void(0)' alors javascript comme frame.document.location =... échouera avec l'erreur Accès refusé en C'EST À DIRE. Était en utilisant une bibliothèque javascript qui interagit avec un cadre cible. Même si l'emplacement où il essayait de changer le cadre était sur le même domaine que le parent, le iframe était initialement défini sur javascript: void, ce qui a déclenché l'erreur d'accès inter-domaine refusé.

Pour résoudre ce problème, j'ai créé une page vierge.html sur mon site et si je dois déclarer une iframe à l'avance qui sera initialement vide jusqu'à ce que javascript change, alors je la pointe vers la page blanche de sorte que src='/content/blank.html' est en le même domaine. Vous pouvez également créer complètement l'iframe via javascript pour pouvoir définir le src lors de sa création, mais dans mon cas, j'utilisais une bibliothèque qui exigeait un iframe déjà déclaré sur la page.

Questions connexes