2011-12-02 66 views
2

我需要在Firefox擴展啓動後打開模式對話框,然後在特定條件後關閉它。在Firefox擴展中使用XUL對話框

我在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()是更好的選項來自動關閉對話框?

回答

3

閱讀Working with windows in chrome code

看來,你不知道在Firefox(和常規網頁)中有多個單一的「範圍」。我的意思是:每個窗口,選項卡和iframe都有自己的一組對象(全局對象,即對象,文檔等)。除此之外,有時候「範圍」有自己的全局對象,但沒有DOM(沒有windowdocument) - XPCOM組件,jsm模塊,工作者,沙箱。

openDialog返回窗口新對話框的對象。可以在該窗口的文檔中訪問<dialog id='myWindowName'>元素,語法取決於要訪問它的腳本的運行位置:如果它運行在對話框中,它可以使用document.getElementById(),而另一個窗口中的腳本必須訪問它通過參考對話框的窗口(比如dialogWindow):dialogWindow.document.getElementById()

cancelDialog是XUL <dialog>元件上的方法,而close()窗口的方法,這就是爲什麼window.cancelDialog()不工作,而window.close()的一樣。

至於哪個對話框cancelDialogwindow.close()是「更好的」:cancelDialog不僅僅是一個簡單的window.close()(參見its code on mxr) - 與按下對話框上的Cancel按鈕時相同的步驟。因此,在關閉窗口之前,它會檢查對話框的Cancel按鈕是否被禁用,然後觸發ondialogcancel事件,讓感興趣的代碼阻止該事件發生,如果一切正常,則通過window.close()關閉窗口。

+0

非常感謝您的詳細解釋和鏈接! – muffin

相關問題