Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/html/84.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript Chrome同步处理iframe加载,而Firefox异步处理_Javascript_Html_Google Chrome_Firefox_Iframe - Fatal编程技术网

Javascript Chrome同步处理iframe加载,而Firefox异步处理

Javascript Chrome同步处理iframe加载,而Firefox异步处理,javascript,html,google-chrome,firefox,iframe,Javascript,Html,Google Chrome,Firefox,Iframe,以下有问题的代码导致Chrome和Firefox之间出现差异: 添加元素 const c=document.querySelector(“容器”); document.querySelector(“#add”).onclick=function(){ 常量iframe=document.createElement(“iframe”); c、 附加子对象(iframe); 常量h1=document.createElement(“h1”); h1.innerText=“你好”; iframe.co

以下有问题的代码导致Chrome和Firefox之间出现差异:

添加元素
const c=document.querySelector(“容器”);
document.querySelector(“#add”).onclick=function(){
常量iframe=document.createElement(“iframe”);
c、 附加子对象(iframe);
常量h1=document.createElement(“h1”);
h1.innerText=“你好”;
iframe.contentDocument.body.appendChild(h1);
};
JSFiddle:

尝试在Chrome中运行上述代码(应该可以正常工作),也可以在Firefox中运行(中断)

这似乎是因为Firefox没有假设iframe会立即加载,而Chrome会。以下更改使代码在两种浏览器中都能工作:

iframe.onload=函数(){
iframe.contentDocument.body.appendChild(h1);
}
c、 appendChild(iframe);//设置事件侦听器后追加
这种差异的原因是什么?这是一个bug还是一个特性?Chrome在这里是否做出了错误的假设,或者Firefox是否处理得不正确?

Chrome是错误的

[…]如果元素没有指定src属性,并且用户代理“第一次”处理iframe的属性

将要运行的任务排队。
此任务的任务源是DOM操纵任务源

因此,在调用这些负责生成iframe文档的iframe加载事件步骤之前,它们实际上应该等待当前事件循环完成

调用
iframe.contentDocument
getter时,它应该返回
null


但实际上,作为一名作者,您应该等待
onload
事件,该事件应该始终异步触发。

这对我来说很有意义。Chrome总是(在我的许多用例中)按时渲染和加载,这似乎有点奇怪。关于iframe加载过程的并行性,您是否有相关信息来源?谢谢@Lucas BetterCodingAcademy,第二个项目符号“将任务排队以运行iframe加载事件步骤…”感谢您通知我这一点!也许你可以对你的答案加以修饰,使之对可能面临类似问题的其他人更有帮助是的,但实际上读了之后,我发现我弄错了。。。我对其他资源加载感到困惑,比如应该并行加载,但这里规范明确要求,在这种情况下,应该执行的是一个队列任务操作,即不应该至少在下一个“进入事件循环”操作之前(即脚本执行结束之后)生成文档。