javascript - 在 iframe 中使用 document.write 作为脚本时 Chrome 中的奇怪行为

标签 javascript google-chrome iframe document.write

我有以下 JavaScript:

var iframe = document.createElement('iframe');
iframe.src='javascript:""';
document.body.appendChild(iframe);
var doc = iframe.contentDocument;
doc.open();
doc.write('<!DOCTYPE html><html><head><meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />');
doc.write('<link type="text/css" rel="stylesheet" href="http://cdn.sstatic.net/stackoverflow/all.css?v=db16ef7a3fac" />');
doc.write('<script type="text/javascript">;</' + 'script>');
doc.write('<title>test</title></head><body><br>test</body></html>');
doc.close();
console.log(doc.body);
setTimeout(function() {
    console.log(doc.body);
}, 1000);

jsfiddle ,先打开你的控制台

如果我在 Firefox 中执行它,它会转储 <body>正确两次。

如果我在 Chrome 中执行它,它首先显示 null ,然后<body> 。但是,如果我再次执行它,Chrome 还会显示 <body>两次。

如果你看doc.childNodesbodynull ,您会看到 chrome 以某种方式停止处理 </script> 之后的 HTML 字符串。 ,因此主体未设置。

仅当 <link> 时才会出现此问题标签存在。如果我注释掉这一行,它就可以正常工作。

你能用chrome重现这个问题吗?有没有办法强制 Chrome 同步处理 HTML 字符串?

编辑:我刚刚修复了 fiddle ,它已注释掉 css 行。

最佳答案

反斜杠的 Unicode 转义应该有效:

doc.write('<script type="text/javascript"><\u002Fscript>')

使用try/catch转义分号:

try{;}catch(e){}

使用 appendChild 或其他 DOM 方法作为更好的替代方案。

引用文献

关于javascript - 在 iframe 中使用 document.write 作为脚本时 Chrome 中的奇怪行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17306454/

相关文章:

javascript - addEventListener 函数在一开始就起作用而没有被触发

google-chrome - 如何在 Chrome 扩展程序中访问私有(private) API

html - 图标与 Chrome 中的文本没有很好地对齐

javascript - 为什么我的 iframe 的文档宽度与 iframe 宽度相同?

javascript - 使用iframe嵌入有哪些陷阱

javascript - 删除处理程序不在范围内的事件监听器

javascript - css 中蓝色条内的动画搜索表单

javascript - 如何根据用户的点击在下一页上激活特定选项卡?

php - “blob” 链接被阻止 Livewire azure

html - 使广告易于访问且不向屏幕阅读器显示