【发布时间】:2014-05-21 16:06:56
【问题描述】:
我正在尝试通过 DOMParser 将字符串解析为完整的 HTML 文档,然后用处理过的节点覆盖当前页面。该字符串包含完整的标记,包括<!doctype>、<html>、<head> 和<body> 节点。
// parse the string into a DOMDocument element:
var parser = new DOMParser();
var doc = parser.parseFromString(data, 'text/html');
// set the parsed head/body innerHTML contents into the current page's innerHTML
document.getElementsByTagName('head')[0].innerHTML = doc.getElementsByTagName('head')[0].innerHTML;
document.getElementsByTagName('body')[0].innerHTML = doc.getElementsByTagName('body')[0].innerHTML;
这样做的原因是它成功地获取了已解析的 HTML 节点并将它们呈现在页面上;但是,解析字符串内的<head> 或<body> 节点中存在的任何<script> 标记都无法执行=[。直接使用 html 标签(与 head / body 相反)进行测试会产生相同的结果。
我也尝试过使用.appendChild() 而不是.innerHTML(),但没有改变:
var elementHtml = document.getElementsByTagName('html')[0];
// remove the existing head/body nodes from the page
while (elementHtml.firstChild) elementHtml.removeChild(elementHtml.firstChild);
// append the parsed head/body tags to the existing html tag
elementHtml.appendChild(doc.getElementsByTagName('head')[0]);
elementHtml.appendChild(doc.getElementsByTagName('body')[0]);
有谁知道将字符串转换为完整 HTML 页面的方法并执行其中包含的 javascript?
如果有一个 DOMParser 的替代品可以提供相同的结果(例如覆盖整个文档),请随时推荐它/他们 =]
注意:
我使用它而不是document.write(data) 的更简单替代方案的原因是因为我需要在SSL 下IE 的postMessage() 回调中使用它; document.write()在IE中访问SSL页面时被post消息等回调事件阻塞=[
【问题讨论】:
-
你已经尝试过 jQuery 了吗?这里有函数$.parseHTML 用于解析HTML 文件。通过
.append()添加脚本标签后也应该执行它... -
@tampis 是的,试过 jQuery;每当我将完整的 HTML 文档传递给
parseHTML()时,它似乎出于某种原因只解析了<head>;如果你有一个可行的例子,请务必让我看看(我很容易在测试中搞砸=P)
标签: javascript domparser