我知道这个问题很老,但是当我尝试使用文档片段时遇到了同样的问题,因为我没有意识到我必须将一个 div 追加到它上面,并使用 div 的
innerHTML
将 HTML 字符串加载进来并获取 DOM 元素。我有其他关于如何做这种事情的答案,更适用于整个文档。
在 Firefox(23.0.1)中,设置文档片段的 innerHTML 属性似乎不会自动生成元素。只有将片段附加到文档后,元素才会被创建。
要创建一个完整的文档,请使用
document.implementation
方法(如果支持)。我在Firefox上成功实现了这一点,但在其他浏览器上并没有进行过真正的测试。您可以查看AtropaToolbox中的
HTMLParser.js以了解使用
document.implementation
方法的示例。我使用这段脚本来
XMLHttpRequest
页面并从中提取数据或操作它们。但是,页面中的脚本不会被执行,这正是我想要的,尽管可能不是您想要的。我之所以选择这种冗长的方法而不是直接使用
XMLHttpRequest
对象可用的解析,是因为当时遇到了很多解析错误,并且我想指定将文档解析为HTML 4 Transitional,因为它似乎可以处理各种松散的代码并生成DOM。
同时还有一个DOMParser
可用,这可能更容易使用。Eli Grey在MDN页面上实现了一个适用于不支持DOMParser
但支持document.implementation.createHTMLDocument
的浏览器。 DOMParser
的规范指定页面中的脚本不会执行,noscript标签的内容将被呈现。
如果您确实需要在页面中启用脚本,可以创建一个高度为0、宽度为0、没有边框等的iFrame。它仍然在页面中,但您可以很好地隐藏它。
还有使用window.open()
与document.write
、DOM方法或任何您喜欢的选项。一些浏览器甚至现在允许您使用数据URI。
var x = window.open( 'data:text/html;base64,' + btoa('<h1>hi</h1>') );
// wait for the document to load. It only takes a few milliseconds
// but we'll wait for 5 seconds so you can watch the child window
// change.
setTimeout(function () {
console.log(x.document.documentElement.outerHTML);
x.console.log('this is the console in the child window');
x.document.body.innerHTML = 'oh wow';
}, 5000);
所以,您有几个选项可以在屏幕外/隐藏处创建整个文档并对其进行操作,所有这些选项都支持从字符串加载文档。
还有
phantomjs,这是一个基于webkit的可编程无头浏览器的令人惊叹的项目。您将可以访问本地文件系统并且能够做几乎任何您想要做的事情。我不知道您正在尝试使用完整页面脚本和操作来实现什么目标。