1

我有以下 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.childNodeswhen bodyis null,您会看到 chrome 在 之后以某种方式停止处理 HTML 字符串</script>,因此未设置正文。

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

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

编辑:我刚刚修复了小提琴,它的 css 行被注释掉了。

4

1 回答 1

0

反斜杠的 Unicode 转义应该起作用:

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

用于try/catch转义分号:

try{;}catch(e){}

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

参考

于 2014-05-29T17:23:50.543 回答