javascript - Firefox-Addon 如何找到 window.name ="mywindow"的选项卡?

标签 javascript firefox tabs window firefox-addon

我正在运行 Firefox 30。 我打开了一些选项卡。其中一个是我的 local-html 文件,我在其中尝试将 window.id 或 document.id 设置为“myhtmlpage”。

...
function init() {
    document.name = 'myhtmlpage';
    document.id = 'myhtmlpage';
// or window.name ='myhtmlpage';
//    window.id = 'myhtmlpage';
}

</script></head>
<body onload="init();">
...

使用以下代码(来自某些 mozilla 帮助页面)我可以找到 contentDocument,但它根本没有 .id 或 .name 属性或属性。

function findTabPerURL(url) {
  var wm = Components.classes["@mozilla.org/appshell/window-mediator;1"]
                     .getService(Components.interfaces.nsIWindowMediator);
  var browserEnumerator = wm.getEnumerator("navigator:browser");

  // Check each browser instance for our URL
  var found = false;
  while (!found && browserEnumerator.hasMoreElements()) {
    var browserWin = browserEnumerator.getNext();
    var tabbrowser = browserWin.gBrowser;

    // Check each tab of this browser instance
    var numTabs = tabbrowser.browsers.length;
    for (var index = 0; index < numTabs; index++) {
      var currentBrowser = tabbrowser.getBrowserAtIndex(index);
      if (url == currentBrowser.currentURI.spec) {

        // The URL is already opened. Select this tab.
        tabbrowser.selectedTab = tabbrowser.tabContainer.childNodes[index];

        // Focus *this* browser-window
        browserWin.focus();

        found = true;
        return tabbrowser;
        break;
      }
    }
  }
}
var tab; tab = findTabPerURL("file:///F:/myfile.html");
var cd = tab.contentDocument;
alert(cd.id);  // doesn't exist. I checked the contentDocument with a for (var each in cd) loop.

通过这个 contentDocument (cd),我可以操纵内容。 (就像更改文本区域的值一样。)所以这样就可以了。

但是我想通过比较 id 来找到正确的文档对象,而不是通过比较 URL!我怎样才能做到这一点?

(这里有一个类似的问题,答案建议在选项卡上使用 linkedBrowser。但是选项卡没有该属性。它会抛出错误,并且使用 for (var every in tab) 检查不会显示它要么。)

最佳答案

首先,您的代码实际上并不返回浏览器,而是返回 tabbrowser (即窗口的 gBrowser)。

document.id 不是 document 的标准属性。因此,由于它是在另一个安全上下文中定义的,因此您无法立即访问它。这是为了防止网站覆盖默认实现,从而可以提供附加假值。

由于您知道该值是网站定义的(因此不会被欺骗而相信虚假值),因此可以 unwrap the document object通过访问 .wrappedJS 属性。

纠正这两个问题,这里有一些应该可以工作的代码(尽管我没有测试它):

function findBrowserPerURL(url) {
  var wm = Components.classes["@mozilla.org/appshell/window-mediator;1"]
                     .getService(Components.interfaces.nsIWindowMediator);
  var browserEnumerator = wm.getEnumerator("navigator:browser");

  // Check each browser instance for our URL
  while (browserEnumerator.hasMoreElements()) {
    var browserWin = browserEnumerator.getNext();
    var tabbrowser = browserWin.gBrowser;

    // Check each tab of this browser instance
    var numTabs = tabbrowser.browsers.length;
    for (var index = 0; index < numTabs; index++) {
      var currentBrowser = tabbrowser.getBrowserAtIndex(index);
      if (url == currentBrowser.currentURI.spec) {
        // The URL is already opened. Select this tab.
        tabbrowser.selectedTab = tabbrowser.tabContainer.childNodes[index];

        // Focus *this* browser-window
        browserWin.focus();

        return currentBrowser;
      }
    }
  }
  return null;
}

var browser = findBrowserPerURL("file:///F:/myfile.html");
if (browser) {
  alert(browser.contentDocument.wrappedJSObject.id + " " + browser.contentDocument.wrappedJSObject.name);
}

关于javascript - Firefox-Addon 如何找到 window.name ="mywindow"的选项卡?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24573203/

相关文章:

javascript - 如何在不中断撤消的情况下在 contentEditable 范围内粘贴纯文本?

java - 从 Javascript 调用 Java 方法的选项

javascript - 可以用javascript写一个网络爬虫吗?

横向的 Android actionBar 选项卡不占据全宽

jquery - 两级选项卡 jquery 链接

javascript - 如何更改背景线的颜色,结构线的颜色

Firefox 位置栏自动完成 : suggest most visited full URL, 不是主机

css - Mozilla Firefox 边框渲染

intellij-idea - 如何保存 PyCharm 嵌入式终端选项卡?

javascript - 如果使用 Select2 YII2 选择第一个字段,则自动填充下面的字段