我有一个项目,我需要使用JavaScript创建一个<iframe>元素并将其附加到DOM.之后,我需要在<iframe>中插入一些内容.它是一个嵌入第三方网站的小部件.
我没有设置<iframe>的"src"属性,因为我不想加载页面; 相反,它用于隔离/沙箱插入我插入的内容,以便我不会遇到CSS或JavaScript与父页面冲突.我正在使用JSONP从服务器加载一些HTML内容并将其插入此<iframe>.
我有这个工作正常,有一个严重的例外 - 如果在父页面中设置document.domain属性(它可能在部署此小部件的某些环境中),Internet Explorer(可能是所有版本,但我已经当我尝试访问我创建的<iframe>的文档对象时,在6,7和8中确认给了我"访问被拒绝"错误.它不会在我测试的任何其他浏览器中发生(所有主要的现代浏览器).
这是有道理的,因为我知道Internet Explorer要求您将所有窗口/框架的document.domain设置为相互通信到相同的值.但是,我不知道有任何方法可以在我无法访问的文档上设置此值.
是否有人知道这样做的方法 - 以某种方式设置此动态创建的<iframe>的document.domain属性?或者我不是从正确的角度看待它 - 有没有另一种方法可以实现我的目标而不会遇到这个问题?我确实需要在任何情况下使用<iframe>,因为隔离/沙盒窗口对于此小部件的功能至关重要.
这是我的测试代码:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
<title>Document.domain Test</title>
<script type="text/javascript">
document.domain = 'onespot.com'; // set the page's document.domain
</script>
</head>
<body>
<p>This is a paragraph above the <iframe>.</p>
<div id="placeholder"></div>
<p>This is a paragraph below the <iframe>.</p>
<script type="text/javascript">
var iframe = document.createElement('iframe'), doc; // create <iframe> element
document.getElementById('placeholder').appendChild(iframe); // append <iframe> element to …Run Code Online (Sandbox Code Playgroud) 有没有办法在<iframe>使用javascript更改源(src)时为自己完成的请求添加自定义http标头?
我们正在<iframe>动态创建s(例如,用于富文本编辑器或调试窗口),并将html注入src。多年来,我们一直使用类似于该答案的javascript:网址,直到遇到带有多个独立iframe的同源策略问题。src
我们当前的解决方案是为包含html的blob创建一个对象url:
var iframe = document.createElement('iframe')
, html = '<h1>it works!</h1>'
, blob = new Blob([html], {type: 'text/html'})
, url = URL.createObjectURL(blob);
iframe.src = url;
document.querySelector('body').appendChild(iframe);Run Code Online (Sandbox Code Playgroud)
这在Chrome和Firefox中可以正常运行,但在IE11中则不能(对于未定义URL或Blob未定义的浏览器,我们会使用该javascript:解决方案)。IE11加注。SCRIPT5: Access is denied
我们是否滥用API?IE是否有特殊的API?已知的解决方法?