Cra*_*lot 8 html javascript iframe firefox jquery
目标是动态创建iframe,并将SVG元素动态同步地附加到其文档正文中。
我们正在尝试使其在Firefox中起作用。
我们的研究表明,在将iframe附加到HTML之后,Firefox会使用新文档重置iframe。这将触发加载事件,并且只有在此事件之后,您才能成功附加内容。加载事件之前附加的所有内容都将被丢弃。
不理想的解决方法是等待加载事件,然后将SVG元素附加到iframe。
是否可以避免异步行为?我们要在创建iframe后同步添加SVG元素。
Codepen:https://codepen.io/anon/pen/yWXjgM
var newElem = $(document.createElement("div"));
newElem.html("hi there");
var iframe = $(document.createElement("iframe"));
iframe.contents().find("body").append(newElem);
$("#box").append(iframe);
$("#box").append(newElem);Run Code Online (Sandbox Code Playgroud)
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<div id="box"></div>Run Code Online (Sandbox Code Playgroud)
tl:dr不管做什么,加载 iframe 的异步特性似乎是不可避免的,但是有一种同步方法可以将内容动态添加到 iframe,通过该方法“覆盖”使用的srcdoc默认 iframe属性。src
似乎也可能有使用createHTMLDocument的解决方案,但我尚未成功。
srcdoc假设您的动态 iframe 不通过src属性加载内容
当 iframe 元素插入到具有浏览上下文的文档中时,用户代理必须创建嵌套的浏览上下文,然后“第一次”处理 iframe 属性。
需要注意的是“第一次处理iframe属性”。没有提及这个过程是同步还是异步,这取决于每个浏览器的实现。
正如前面提到的,Chrome 和 Firefox 已将此过程理解为异步,这确实有意义,因为 iframe 的目标是从其src属性加载内容并调用onload回调。
如果没有src可用的属性,它将设置为"about:blank"
值得一提的是,在浏览器检查是否存在某个src属性之前,它会首先检查是否srcdoc可用,根据MDN iframe 文档:
源文档
要嵌入的内联 HTML,覆盖 src 属性。如果浏览器不支持 srcdoc 属性,它将回退到 src 属性中的 URL。
const container = document.getElementById("container");
const iframe = document.createElement("iframe");
iframe.addEventListener("load", function(){
console.log("loaded...");
});
iframe.srcdoc = `
<svg height="100" width="100">
<circle cx="50" cy="50" r="40" stroke="black" stroke-width="3" fill="red" />
Sorry, your browser does not support inline SVG.
</svg>
`;
iframe.srcdoc += `
<svg height="100" width="100">
<circle cx="50" cy="50" r="40" stroke="black" stroke-width="3" fill="blue" />
Sorry, your browser does not support inline SVG.
</svg>
`
container.append(iframe);Run Code Online (Sandbox Code Playgroud)
<div id="container"></div>Run Code Online (Sandbox Code Playgroud)
如果您正在开发 Web 扩展,您将可以访问mozbrowser api,因此stop
HTMLIFrameElement 接口的 stop() 方法用于停止加载
<iframe>.