【问题标题】:Firefox plugin sees tags, but which tags?Firefox 插件看到标签,但哪些标签?
【发布时间】:2014-11-10 23:59:49
【问题描述】:

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

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

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

监听函数是:

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 文件中看到一堆输出。

任何建议将不胜感激。

【问题讨论】:

    标签: javascript firefox firefox-addon dom-events


    【解决方案1】:

    您的 cmets 澄清了您的问题:

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

    • window.gBrowser.contentWindow.document.getElementsByBlassName
      • 但是请注意,直接在gBrowser 上执行contentWindow 会为您提供当前选定选项卡 的内容窗口,您也可以跳过contentWindow.document 并直接执行window.gBrowser.contentDocument
        • windowDOMWindow 是浏览器窗口而不是 html 窗口
    • Services.wm.getMostRecentWindow('navigator:browser').gBrowser.contentWindow....
      • 这将获取 windowtype navigator:browser 的最新窗口,在此处查看有关 window-type 的信息:
      • 可以通过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;
    }
    

    【讨论】:

    • w3schools.com/jsref/met_document_getelementsbytagname.asp 请参阅“提示”,“*”为您提供所有标签。不过,我会尝试你的建议。
    • 不。调用 quaerySelectorAll("input") 而不是 getElementsByClassName 并一无所获。或者更确切地说,无论出于何种原因,我什么都没看到。
    • 这样做var collection = document.querySelectorAll('tag.class')
    • 哦,我明白你在做什么。您将返回 xul 元素。你的范围是错误的。通过window.gBrowser.contentWindow.document.getElementsByBlassName 访问标签内容
    • 如果你编辑我可以+这个答案的答案。就是这样!令人惊讶的是,我看到的很多东西都没有这么说。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-26
    • 1970-01-01
    • 2011-04-22
    • 2015-05-09
    相关资源
    最近更新 更多