见下面的示例代码
任何想法如何解决这个问题?
const iframeElement = document.createElement("iframe");
iframeElement.src = "https://www.bing.com"
//iframeElement.setAttribute("sandbox", "allow-forms allow-modals allow-popups allow-scripts");
iframeElement.onload = (e) => {
iframeElement.contentWindow.postMessage("foo", "https://www.bing.com");
};
const containerElement = document.getElementById("place-holder-for-iframe");
containerElement.appendChild(iframeElement);
您可以使用此jsbin链接进行试用 http://jsbin.com/gafobulife/edit?js,output
答案 0 :(得分:3)
如果您未在沙盒属性中设置allow-same-origin
,则会将内容视为来自唯一来源:请参阅https://developer.mozilla.org/en-US/docs/Web/HTML/Element/iframe#Attributes和https://www.html5rocks.com/en/tutorials/security/sandboxed-iframes/。
令人困惑的是,allow-same-origin
并不意味着iframe将能够访问其父级,就好像它们是相同的来源(除非它们是相同的来源),但它意味着它将被视为来自其正常来源(在这种情况下,https://www.bing.com
)。
所以你可以改变:
iframeElement.setAttribute("sandbox", "allow-forms allow-modals allow-popups allow-scripts")'
到
iframeElement.setAttribute("sandbox", "allow-forms allow-modals allow-popups allow-scripts allow-same-origin");
或者如果您不希望自己的iframe保持其原点,请更改:
iframeElement.contentWindow.postMessage("foo", "https://www.bing.com");
到
iframeElement.contentWindow.postMessage("foo", "*");
对我而言,如果我不使用allow-same-origin
,则会出现其他错误,很可能是bing.com
的配置方式。