0

我的插件中有一个对话框,当某些删除过程完成时会打开。我对所有此类消息使用 XUL 对话框,如下所示:

<?xml version="1.0"?>
<?xml-stylesheet href="chrome://myaddon/skin/Style.css" type="text/css"?>
<!DOCTYPE overlay SYSTEM "chrome://myaddon/locale/mydtd.dtd">

<dialog xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul"
        class="dialog" ondialogcancel="return true;">
    <dialogheader id="dlgHdr"/>
    <vbox flex="1" id="content" pack="center">
    </vbox>
    <script
        type="application/x-javascript"
        src="chrome://myaddon/content/mainScript.js"
    />
    <script
        type="application/x-javascript"
        src="chrome://myaddon/content/dialogInit.js"
    />
    <tfs_string id="new-profile-success" value="&newProfileSuccess.Text;"
                style="overflow: hidden" />
    <tfs_string id="delete-profile-success" value="&deleteProfileSuccess.Text;"
                style="overflow: hidden" />
</dialog>

它有取消按钮,ondialogcancel处理程序返回 true。但它不会在按下按钮后立即关闭。我必须稍微拖动此对话框以使其消失。此外,只有在重新安装插件后重新启动浏览器时才会出现此问题。在我按下取消后立即关闭另一个重新启动对话框。我将此对话框用于其他一些消息,它们没有这样的问题。

如果我关闭窗口并使用 Chromebug 调试器再次打开它而不是使用弹出窗口重新启动,我无法重现此错误。但是,如果我发布另一个 FF 版本,然后再次发布第一个版本(使用调试器),我会设法重现它。但是当我在 dialogcancel 处理程序上使用逐步执行时,Chromebug 的界面变得无响应(脚本内容区域除外)并且在我在调试器中看到 window.close() 执行后对话框没有关闭,所以我必须拖动对话框窗口再绕一圈使其消失。我该怎么办?

4

1 回答 1

1

我终于找到了原因。问题确实是由 dialogInit.js 脚本引起的。

window.addEventListener('load', function () { myext.simpleDialogInitialize(); }, false);
window.addEventListener("MozAfterPaint", function () { window.sizeToContent(); }, false);
window.addEventListener('unload', function () { myext.simpleDialogFinalize(); }, false);

它甚至包含“加载”和“卸载”事件的处理程序。第一个调用在打开此窗口的方法中指定的初始化程序。但我猜还有一个名为 window.sizeToContent 的“MozAfterPaint”事件处理程序,因此触发了无限循环。扩展不是从头开始创建的,所以我有一段时间没有注意到这个错误。在调用该初始化程序后,我将调整大小移动到“加载”事件处理程序,工作正常。

于 2012-07-04T10:39:33.027 回答