我正在做一个扩展,在每个页面加载时创建专门用于该页面的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 Dev Site的代码)遍历所有选项卡并访问每个文档:
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);
}
}