一个firefox插件怎么能找到带有window.name="mywindow"的标签呢?

How could a Firefox-Addon find the the tab with the window.name="mywindow"?

本文关键字:quot mywindow 标签 name 怎么能 插件 firefox window 一个      更新时间:2023-09-26

我运行的是Firefox 30。我打开了一些标签。其中一个是我的local-html文件,我试图在其中设置一个窗口。Id或文件。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 each in tab)检查也不会显示错误。

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

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

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

修正两者,这里是一些应该工作的代码(尽管我没有测试它):

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);
}