Cross sub domain 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 une iframe sur la première qui regarde une forme dans la dernière.
j'ai besoin d'exécuter des scripts pour manipuler le second depuis le premier et je me demandais si c'était possible?
3 réponses
pour que cela ne soit pas restreint par la même politique d'origine, vous aurez probablement besoin de le faire dans les deux pages:
document.domain = "acmssite.com";
Oui, il est.
var iframe = document.getElementById("your-iframes-id").contentWindow.document;
Vous pouvez toujours contourner ce problème avec 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 éditer le script de fenêtre du destinataire. Mais en utilisant cette méthode, vous pouvez charger n'importe quel iframe sans toucher à leurs scripts. Check this out! jsfiddle-lien
<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>