在Firefox扩展中使用XUL对话框

3
在Firefox扩展启动后,我需要打开一个模态对话框,并在某些条件下关闭它。在XUL文件中,我使用id = 'myWindowName'定义了对话框,然后直接使用window.openDialog('xul url', 'myWindowName', ...)启动它,而不将其分配给任何变量。然后,在稍后的函数中,我定义了y = document.getElementById('myWindowName'),并使用y.cancelDialog()来关闭它。到目前为止,看起来这个方法是正确的,但我想问一下这种方法是否正确。 y=window.openDialog("url', 'myWindowName', ...)是否返回与y=document.getElementByID('myWindowName')相同的引用?此外,为什么window.cancelDialog()无法正常工作?使用window.close()自动关闭对话框是否更好?
1个回答

4

请阅读《在Chrome代码中使用窗口》

你可能不知道,在Firefox(以及常规的网页)中,有不止一个“作用域”。我的意思是:每个窗口、选项卡和iframe都有自己的对象集合(全局对象,即Window对象,文档等)。除此之外,有时还会有“作用域”,它们有自己的全局对象,但没有DOM(没有windowdocument),如XPCOM组件、jsm模块、workers和沙箱。

openDialog返回新对话框的window对象。该元素 <dialog id='myWindowName'> 可以在该窗口的文档中访问,语法取决于想要访问它的脚本运行的位置:如果它在对话框中运行,则可以使用document.getElementById(),而其他窗口中的脚本必须通过引用对话框的窗口(例如dialogWindow)来访问它:dialogWindow.document.getElementById()

cancelDialog是XUL <dialog>的一个方法,而close()window的一个方法,这就是为什么window.cancelDialog()不起作用,而window.close()起作用的原因。

至于哪个更好:dialog.cancelDialog还做了比简单的window.close()更多的事情(请参见mxr上的代码)--与单击对话框上的取消按钮相同的步骤。因此,在关闭窗口之前,它会检查对话框的取消按钮是否禁用,然后触发ondialogcancel事件,让感兴趣的代码防止这种情况发生,然后如果一切正常,通过window.close()关闭窗口。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接