Firefox-Addon怎么能找到带有window.name =“mywindow”的标签?

时间:2014-07-04 11:23:37

标签: 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)我可以操作内容。 (比如改变textarea的值。)所以这没关系。

但我希望通过比较id来找到合适的文档对象,而不是通过比较URL!我怎么能这样做?

(这里有一个类似的问题,答案建议在选项卡上使用linkedBrowser。但是该选项卡没有该属性。它会抛出一个错误并检查for(var中的每个选项卡)不是&#39 ; t显示它。)

1 个答案:

答案 0 :(得分:2)

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

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

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

纠正两者,这里有一些应该有用的代码(虽然我没有测试它):

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