javascript - 在 Firefox XPCOM 组件中使用 eval.call()

标签 javascript firefox xpcom

我正在制作一个扩展,在加载每个页面时都会专门为该页面创建 xpcom 组件的实例。

我这样做:

var appcontent = document.getElementById("appcontent");   // browser
if(appcontent) {
   appcontent.addEventListener("load", onPageLoad, true);
}
var onPageLoad = function(aEvent) {
   var doc = aEvent.originalTarget; //this is the reference to the opened page
   pages.push(createInstanceOfMyXPCOM(doc));
}

我的问题是,在 XPCOM 组件中,如何在该文档的全局上下文中使用 eval() 。如果你只是在 html 中的常规 javascript 中执行此操作,你可以这样做:

window.eval.call(window, somecode);

问题是我的 xpcom 组件中没有 window 变量(或者我有),我只有对文档的引用。我也可以在创建时将窗口传递给我的 XPCOM 组件,但如果我打开了多个页面,我不知道这是如何工作的..

最佳答案

从 XPCOM,您应该能够使用以下命令获取主窗口的引用:

var mainWindow = window.QueryInterface(Components.interfaces.nsIInterfaceRequestor)
                       .getInterface(Components.interfaces.nsIWebNavigation)
                       .QueryInterface(Components.interfaces.nsIDocShellTreeItem)
                       .rootTreeItem
                       .QueryInterface(Components.interfaces.nsIInterfaceRequestor)
                       .getInterface(Components.interfaces.nsIDOMWindow);

然后你可以通过以下方式获取当前选定的选项卡文档:

document = mainWindow.gBrowser.contentDocument;

您可以在此处找到更多信息:

https://developer.mozilla.org/en/Code_snippets/Tabbed_browser

https://developer.mozilla.org/en/Working_with_windows_in_chrome_code

更新:

试试这个,您应该能够获得对最近窗口的引用:

var wm = Components.classes["@mozilla.org/appshell/window-mediator;1"]
                   .getService(Components.interfaces.nsIWindowMediator);
var recentWindow = wm.getMostRecentWindow("navigator:browser");

如果您有多个选项卡,您可以使用类似以下内容(来自 Mozilla 开发站点的代码)来迭代所有选项卡并访问每个文档:

var num = gBrowser.browsers.length;
for (var i = 0; i < num; i++) {
  var b = gBrowser.getBrowserAtIndex(i);
  try {
    dump(b.currentURI.spec); // dump URLs of all open tabs to console
  } catch(e) {
    Components.utils.reportError(e);
  }

}

关于javascript - 在 Firefox XPCOM 组件中使用 eval.call(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3247748/

相关文章:

javascript - 为什么 Selenium 找不到动态添加的 DOM 元素?

javascript - 在 HR 上设置类别会破坏 TD colspan

javascript - 以编程方式更改 Firefox 中的主页

javascript - Firefox 扩展中的 __defineGetter__ 未定义

javascript - nsIDOMWindowUtils.isInModalState() 不工作

javascript - IE10 - 文件输入 : TIFF files and accept attribute

javascript - mongodb 异步等待 Post 方法

javascript - 如何让 js2-mode 在 Emacs 中使用空格而不是制表符?

javascript - Firefox 中的 SVG 对象未触发滚动事件

javascript - 点击Selenium on Sauce 发送后,Firefox 未完成页面加载