我需要在启动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()
是自动关闭对话框的更好选择吗?
答案 0 :(得分:3)
阅读Working with windows in chrome code。
似乎您不知道Firefox(以及常规网页)中存在多个“范围”。我的意思是:每个窗口,制表符和iframe都有自己的一组对象(全局对象,即Window
对象,文档等)。除此之外,还有“范围”与自己的全局对象,但没有DOM(没有window
或document
) - XPCOM组件,jsm模块,工作者,沙箱。
openDialog
返回新对话框的窗口对象。可以在该窗口的文档中访问<dialog id='myWindowName'>
元素,语法取决于要访问它的脚本的运行位置:如果它在对话框中运行,则可以使用{{ 1}},而另一个窗口中的脚本必须通过对对话框窗口(例如document.getElementById()
)的引用来访问它:dialogWindow
。
dialogWindow.document.getElementById()
是XUL上的方法cancelDialog
元素,而<dialog>
是窗口的方法,为什么window.cancelDialog()不起作用,而window.close()则不起作用。
至于哪个对话。close()
或cancelDialog
是“更好”:cancelDialog不仅仅是一个简单的window.close()(参见its code on mxr ) - 与按下对话框上的“取消”按钮时的步骤相同。因此,在关闭窗口之前,它会检查对话框的取消按钮是否被禁用,然后触发ondialogcancel事件,让感兴趣的代码阻止这种情况发生,然后如果一切正常,它会通过window.close()
关闭窗口。