web-dev-qa-db-fra.com

Cross sous domaine iframes et JavaScript

Je travaille sur un site CMS dont le domaine est:

http://www.acmssite.com

Ils ont un sous-domaine où ils stockent un système de formulaire:

http://www.forms.acmssite.com

J'ai un iframe sur le premier qui regarde une forme dans le dernier.

Je dois exécuter des scripts pour manipuler le dernier à partir du premier et je me demandais si cela était possible.

24
RyanP13

Pour que cela ne soit pas limité par la même politique d'origine, vous devrez probablement le faire dans les deux pages:

document.domain = "acmssite.com";
62
Dark Falcon

Oui, ça l'est.

var iframe = document.getElementById("your-iframes-id").contentWindow.document;
2
Cobra_Fast

Vous pouvez toujours contourner ce problème à l'aide de YQL même si vous n'avez pas accès à la partie en-tête de la fenêtre de réception. Avec la méthode Postmessage, vous devez également modifier le script de la fenêtre du destinataire. Mais en utilisant cette méthode, vous pouvez charger n’importe quel iframe sans toucher à leurs scripts. Regarde ça! jsfiddle-link

<html>
<iframe src="https://google.com/" width="500" height="300"></iframe>

<script>
var iframe = document.getElementsByTagName('iframe')[0];
var url = iframe.src;
var getData = function (data) {
    if (data && data.query && data.query.results && data.query.results.resources && data.query.results.resources.content && data.query.results.resources.status == 200) loadHTML(data.query.results.resources.content);
    else if (data && data.error && data.error.description) loadHTML(data.error.description);
    else loadHTML('Error: Cannot load ' + url);
};
var loadURL = function (src) {
    url = src;
    var script = document.createElement('script');
    script.src = 'https://query.yahooapis.com/v1/public/yql?q=select%20*%20from%20data.headers%20where%20url%3D%22' + encodeURIComponent(url) + '%22&format=json&diagnostics=true&env=store%3A%2F%2Fdatatables.org%2Falltableswithkeys&callback=getData';
    document.body.appendChild(script);
};
var loadHTML = function (html) {
    iframe.src = 'about:blank';
    iframe.contentWindow.document.open();
    iframe.contentWindow.document.write(html.replace(/<head>/i, '<head><base href="' + url + '"><scr' + 'ipt>document.addEventListener("click", function(e) { if(e.target && e.target.nodeName == "A") { e.preventDefault(); parent.loadURL(e.target.href); } });</scr' + 'ipt>'));
    iframe.contentWindow.document.close();
}

loadURL(iframe.src);
</script>
</html>
0
Gihan Gamage