11

我正在开发我的第一个 Firefox 扩展,为此我需要获取当前页面的完整源代码。我怎样才能用 XUL 做到这一点?

4

6 回答 6

6

您将需要一个 xul浏览器对象来加载内容。

将页面的“view-source:”版本加载到浏览器对象中,与“查看页面源代码”菜单的方式相同。请参阅 中的函数 viewSource() chrome://global/content/viewSource.js。该函数可以从缓存中加载,也可以不加载。

加载内容后,原始来源由下式给出:

var source = browser.contentDocument.getElementById('viewsource').textContent;

序列化 DOM 文档
此方法不会获取原始源,但可能对某些读者有用。

您可以将文档对象序列化为字符串。请参阅将 DOM 树序列化为MDC 中的字符串。您可能需要在扩展中使用替代的实例化方法。

那篇文章讨论了 XML 文档,但它也适用于任何 HTML DOMDocument。

var serializer = new XMLSerializer();
var source = serializer.serializeToString(document);

这甚至适用于网页或萤火虫控制台。

于 2010-03-06T14:34:02.087 回答
2

您可以使用 获取 URLvar URL = document.location.href并导航到"view-source:"+URL

现在您可以获取整个源代码(viewsource 是正文的 id):

var code = document.getElementById('viewsource').innerHTML;

问题是源代码已格式化。所以你必须运行strip_tags () 和htmlspecialchars_decode () 来修复它。

例如,第 1 行应该是 doctype,第 2 行应该如下所示:

&lt;<span class="start-tag">HTML</span>&gt;

所以在strip_tags ()之后就变成了:

&lt;HTML&gt;

htmlspecialchars_decode () 之后我们终于得到了预期的结果:

<HTML>

该代码不会传递给 DOM 解析器,因此您也可以查看无效的 HTML。

于 2010-03-05T14:16:39.020 回答
2

真的看起来没有办法获得“所有源代码”。您可以使用

document.documentElement.innerHTML

获取顶部元素(通常是 html)的 innerHTML。如果您有 php 错误消息,例如

<h3>fatal error</h3>
segfault

<html>
    <head>
        <title>bla</title>
        <script type="text/javascript">
            alert(document.documentElement.innerHTML);
        </script>
    </head>
    <body>
    </body>
</html>

innerHTML 将是

<head>
<title>bla</title></head><body><h3>fatal error</h3>
segfault    
        <script type="text/javascript">
            alert(document.documentElement.innerHTML);
        </script></body>

但错误信息仍会保留

编辑:documentElement 在这里描述: https ://developer.mozilla.org/en/DOM/document.documentElement

于 2010-03-02T14:45:01.790 回答
1

也许你可以通过 DOM 得到它,使用

var source =document.getElementsByTagName("html");

并使用 DOMParser 获取源

https://developer.mozilla.org/En/DOMParser

于 2010-03-01T13:36:05.540 回答
0

更符合拉克兰的回答,但这里有一个关于内部结构的讨论,深入到 Cpp 代码中。

http://www.mail-archive.com/mozilla-embedding@mozilla.org/msg05391.html

然后按照底部的回复进行操作。

于 2010-04-12T10:22:20.830 回答
0

Sagi 的答案的第一部分,但document.getElementById('viewsource').textContent改为使用。

于 2010-03-06T16:49:00.037 回答