火狐插件看到标签,但哪些标签

Firefox plugin sees tags, but which tags?

本文关键字:标签 火狐 插件      更新时间:2023-09-26

我有一个简单的火狐插件在工作。它通过菜单打开和关闭。请参阅"工具 -> 经典定位器"菜单项。

该插件将对 HTML 文档中元素的类名进行一些报告。我不认为这会是一项如此令人讨厌的任务。

它看到标签,但哪些标签?它们似乎是XUL文档中的标签。很多"菜单项"等等。并且没有"输入"标签。我正在查看一个带有表单和两个文本字段的页面,那里有两个输入标签,但插件看不到它们。

侦听器函数为:

findClassLabels : function(anEvent) {
  var doc = window.document;
  var text = "// At " + Date() + ", Page = " + doc.title + "'n";
  oStream.write(text, text.length);
  var tags = doc.getElementsByTagName("*");
  for (var idx = 0; idx < tags.length; idx++) {
    var tag = tags[idx];
    var str = "tag: '" + tag.tagName + "' -> class: '" + tag.className + "''n";
    oStream.write(str, str.length);
  }
  oStream.write("'nDONE'n'n", 7);
}

这是写入文件"/tmp/test.txt"。这部分都有效,我看到的是起始消息和"完成",而不是介于两者之间的正确内容。

整个项目正在 https://github.com/rkiddy/classy-locator-firefox-extension.git

如果您克隆项目,键入"make",然后在Firefox中打开xpi文件,它将起作用。点击"开始"菜单,然后重新加载页面。您将在/tmp/test.txt 文件中看到一堆输出。

任何建议将不胜感激。

您的评论澄清了您的问题:

你得到的 xul 元素返回。你的范围是错误的。通过执行访问选项卡内容

  • window.gBrowser.contentWindow.document.getElementsByBlassName
    • 但是请注意,直接在gBrowser上执行contentWindow会为您提供当前所选选项卡的内容窗口,您也可以跳过contentWindow.document,只执行window.gBrowser.contentDocument
      • window是浏览器窗口而不是 html 窗口的DOMWindow
  • Services.wm.getMostRecentWindow('navigator:browser').gBrowser.contentWindow....
    • 这将获取窗口类型导航器的最新窗口:浏览器 在此处查看有关窗口类型:
    • 您可以使用aDOMWindow.document.documentElement.getAttribute('windowtype')获取窗口类型
  • 像这样浏览所有窗口:

            var DOMWindows = Services.wm.getEnumerator(null);
            while (DOMWindows.hasMoreElements()) {
                var aDOMWindow = DOMWindows.getNext();
                var windowtypeOfADomWindow = aDOMWindow.document.documentElement.getAttribute('windowtype');
                console.log('windowtype of this domwindow is:', windowtypeOfADomWindow)
            }
    

navigator:browser窗口有一个gBrowser,通常是一个gBrowser.tabContainer,tabConatiner有子节点,它们是选项卡。因此,您可以像这样浏览选项卡:

var tabs = gBrowser.tabContainer.childNodes;
for (var i=0; i<tabs.length; i++) {
    var aTab = tabs[i];
    var aTabContentWindow = aTab.linkedBrowser.contentWindow;
}