comment puis-je accéder à iframe.contentDocument pour obtenir de réponse à l'issue de la croix-origine de la demande?
Je suis avec succès l'envoi d'un fichier à partir de localhost:8888
à localhost:8080
(autre domaine de la production), mais je ne peux pas lire la réponse HTTP, après le transfert de finitions.
Uncaught SecurityError: impossible de lire le 'contentDocument la propriété
à partir de 'HTMLIFrameElement': Bloqué un cadre avec l'origine
"http://localhost:8888" d'accéder à un cadre d'origine
"http://localhost:8080". Le cadre de la demande d'accès défini
"le document.domaine" de "localhost", mais l'image en cours d'accès n'
pas. Les deux doivent définir "document.domaine" à la même valeur pour permettre
d'accès.
À envoyer le fichier, pour la prise en charge de compatibilité, je vais essayer d'obtenir que cela fonctionne pour <form>
en fonction de téléchargement de fichiers; pas XHR
base. C'est le HTML de base structure:
<form target="file-iframe" enctype="multipart/form-data" method="POST" action="invalid">
<input type="file" id="file-input" class="file-input" title="select files">
</form>
<iframe src="javascript:false;" id="file-iframe" name="file-iframe"></iframe>
Pour insérer le <iframe>
élément dans le DOM, je ne les suivants:
document.domain = document.domain;
var domainHack = 'javascript:document.write("<script type=text/javascript>document.domain=document.domain;</script>")';
var html = '<iframe id="file-iframe" name="file-iframe"></iframe>';
var parent = document.getElementById('wrapper');
var iframe = UTILS.createDomElement(html, parent);
iframe.src = domainHack;
UTILS.attachEvent(iframe, 'load', function(e) {
//this throws the above SecurityError
var doc = iframe.contentDocument || iframe.contentWindow.document;
//do other stuff...
});
Avant de m'envoyer le formulaire, j'ai mis le action
attribut sur la <form>
d'être la cible de la croix-URL de domaine:
action="http://localhost:8080/"
Après la présentation de la <form>
, le <iframe>
's load
événement est déclenché, et j'essaie d'accéder à la <iframe>
's content pour lire la réponse HTTP. Cependant, cela déclenche l'erreur ci-dessus car il s'agit d'un cross-origin demande, et je n'ai pas accès à la <iframe>
's de contenu.
Je pensais que le document.domain
hack, mais le message d'erreur me dit que le iframe
n'a pas défini le domaine de localhost
, même si j'ai mis le iframe
's src
attribut à la domainHack
variable, qui semble exécuter.
Aucune idée de ce que je fais de mal? Comment puis-je définir document.domain
être localhost
pour le <iframe>
et sa mère (qui est la page en cours).
J'ai lu plusieurs StackOverflow de questions, dont certaines MDN articles, et d'autres aléatoires, les résultats sur Google, mais je n'ai pas été en mesure d'obtenir que cela fonctionne. Quelques trucs que j'ai regardé à travers déjà:
- Des moyens pour contourner la politique de " même origine
- https://developer.mozilla.org/en-US/docs/Web/Security/Same-origin_policy#Changing_origin
- https://developer.mozilla.org/en-US/docs/Web/HTTP/Access_control_CORS
Vérifier ce lien, j'ai écrit un blog pour ce genre de problème crossdomainjavascript.wordpress.com/author/sandeeproop
oui, j'ai essayé
postMessage()
. la messagerie fonctionne, mais le problème est que j'ai besoin le contenu de l'iframe, je n'en ai pas accès depuis l' contentWindow
génère l'erreur.... donc postMessage()
est inutile, sauf si je peux obtenir le contenu de l'iframeJ'essaie de trouver une solution à exactement le même problème
Eh bien, nous pourrions suivre tous les mauvais sens. var doc = iframe.contentDocument || iframe.contentWindow.document; C'est la façon dont il est conçu pour être. PostMessage doit arrivé de l'iframe. Selon un ami pour faire ce travail, nous avons pour envoyer le html à partir du serveur (pas de json), avec une fonction qui permettra d'évaluer sur le client et faire la vraie postMessage.
OriginalL'auteur Hristo | 2015-02-23
Vous devez vous connecter pour publier un commentaire.
Après de creuser autour pour essayer de le comprendre, je suis finalement tombé sur une solution qui semble fonctionner pour moi. Cependant, il n'est pas une réponse exacte à ma question.
En résumé, je suis en train de travailler sur le soutien
<form>
en fonction de téléchargement de fichiers. Pour les navigateurs qui ne supportent pas l'upload de fichier viaXHR
, nous devons recourir à la traditionnelle<form>
la soumission, à l'aide d'un caché<iframe>
pour éviter de rafraichissement de la page. Le formulaire redirige le rechargement d'action dans le caché<iframe>
, et puis la réponse HTTP est écrit dans le corps de la<iframe>
après que le fichier a été transféré.En raison de la de même la politique de l'origine, et donc la raison pour laquelle je pose cette question, je n'ai pas accès à la
<iframe>
's de contenu. La même la politique de l'origine pour<iframe>
s restreint la façon dont un document ou d'un script chargé à partir d'une origine, d'interagir avec une ressource à partir d'une autre origine. Puisque nous ne pouvons pas obtenir l'accès à la<iframe>
's document, qui est l'endroit où le chargement du fichier de réponse HTTP est écrit, le serveur renvoie une réponse de redirection dans lequel le serveur va ajouter le téléchargement de réponse JSON. Lorsque le<iframe>
des charges, la JS sera d'analyser la réponse JSON, et de l'écrire à la<iframe>
'corps. Enfin, depuis la redirection était de la même origine, nous pouvons accéder à la<iframe>
's contenu 🙂Un grand merci à le Fichier jQuery Uploader; ils ont fait tout le travail dur 😉
https://github.com/blueimp/jQuery-File-Upload/wiki/Cross-domain-uploads
La Mise En Place...
JS
HTML - de la page redirection
La seule chose qui reste à faire est de définir la
action
attribut sur la<form>
à la croix-URL de domaine que nous allons envoyer le télécharger à:Pendant ce temps, sur le serveur...
Je sais que c'est un énorme hack pour contourner la même politique d'origine avec
<iframe>
s, mais il semble que ça fonctionne, et je pense qu'il est assez bon avec de la compatibilité inter-navigateur. Je ne l'ai pas testé dans tous les navigateurs, mais je vais me résoudre à le faire, et après une mise à jour.OriginalL'auteur Hristo
Bien, je suis venu à la solution aussi. C'est un peu codé en dur atm, mais tout a l'air soigné.
J'ai d'abord fait un fichier html sur le serveur. (Je vais le modifier pour ejs modèle plus tard, qui comprend mes données).
Partie importante ici est l'utilisation de parent.
Que de mon nœud de serveur, je suis en téléchargeant le fichier et l'envoi au client le fichier html:
Sur le client, j'ai le même code html comme vous.
Ce modèle je affichés sur la page. J'ai ajouté le Gestionnaire d'événement suivant aussi
Comme vous le savez, la méthode addEventListener ne fonctionne pas sur tous les navigateurs. Et cette solution ne fonctionne pas sur IE8 < 8, qui ne prend pas en charge postMessage. J'espère que cela est hapefull vous
OriginalL'auteur user732456