在iframe中使用document.write for Scripts时Chrome中的奇怪行为

时间:2013-06-25 20:02:01

标签: 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.childNodes body时查看null,您会看到Chrome已经以某种方式停止在</script>之后处理HTML字符串,因此正文不是集。

只有存在<link>标记时才会出现此问题。如果我注释掉这一行,它就能正常工作。

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

编辑:我刚修完小提琴,它已将css行注释掉了。

1 个答案:

答案 0 :(得分:0)

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

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

使用try/catch来转义分号:

try{;}catch(e){}

使用appendChild或其他DOM方法作为更好的选择。

<强>参考