我是 XUL 的初学者。我有以下问题。
在浏览器覆盖中,我声明了一个打开新窗口的菜单项 - 到目前为止一切顺利。
menu_entry.addEventListener('command', function() {
window.open('chrome://myextension/content/mywindow.xul',
'myextension-mywindow',
'chrome,centerscreen');
}, false);
Run Code Online (Sandbox Code Playgroud)
我希望这更灵活。如果窗口已经打开,则应将其聚焦。这是我尝试过的
menu_entry.addEventListener('command', function() {
let mywindow = document.getElementById('myextension-mywindow');
if (mywindow) {
mywindow.focus();
}
else {
window.open('chrome://myextension/content/mywindow.xul',
'myextension-mywindow',
'chrome,centerscreen');
}
}, false);
Run Code Online (Sandbox Code Playgroud)
问题是 document.getElementById('myextension-mywindow') 总是返回 null,所以我从不输入 if。我想这是因为窗户本身就是另一种镀铬物。
但如果是这样,我怎样才能让窗口相互交互?是否可以从另一个窗口中的小部件聚焦窗口?我无法从模块执行此操作,因为那里没有文档和窗口。
我终于发现我必须使用nsiWindowMeditator。我所要做的就是
menu_entry.addEventListener('command', function() {
let windowManager = Cc['@mozilla.org/appshell/window-mediator;1'].
getService(Ci.nsIWindowMediator);
let mywindow = windowManager.getMostRecentWindow('mywindowtype');
if (mywindow) {
mywindow.focus();
}
else {
window.open('chrome://myextension/content/mywindow.xul',
'myextension-mywindow',
'chrome,centerscreen');
}
}, false);
Run Code Online (Sandbox Code Playgroud)
然后在 xul
<window id="myextension-mywindow" windowtype="mywindowtype>
...
</window>
Run Code Online (Sandbox Code Playgroud)