我在我的副词中有一个对话框,当某些删除过程完成时会打开它。我使用这样的消息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>它有cancel按钮,ondialogcancel处理程序返回true。但按下按钮后它不会立即关闭。我得稍微拖一下这个对话框才能让它消失。此外,只有在重新安装addon之后重新启动浏览器时,才会出现此问题。在我按下“取消”之后,再重新启动一次对话框后立即关闭。我使用这个对话框来处理一些其他消息,它们没有这样的问题。
如果我关闭窗口并使用Chromebug调试器再次打开它,而不是使用弹出窗口重新启动,我就无法复制这个bug。但是,如果我再次使用FF版本,然后再使用第一个版本(使用调试器),我就可以复制它。但是,当我在对话框取消处理程序上一步一步地执行时,Chromebug的界面会变得没有响应(除了脚本内容区域),并且在我在调试器中看到window.close()被执行之后,对话框不会关闭,所以我不得不再次拖动对话框窗口使其消失。我该怎么办?
发布于 2012-07-04 10:39:33
我终于找到了原因。问题确实是由dialogInit.js脚本引起的。
window.addEventListener('load', function () { myext.simpleDialogInitialize(); }, false);
window.addEventListener("MozAfterPaint", function () { window.sizeToContent(); }, false);
window.addEventListener('unload', function () { myext.simpleDialogFinalize(); }, false);它甚至包含“load”和“卸载”事件的处理程序。首先,调用在打开此窗口的方法中指定的初始化程序。但是,“MozAfterPaint”事件还有一个名为window.sizeToContent的处理程序,因此我猜会触发无限循环。扩展不是从零开始创建的,所以我有一段时间没有注意到这个错误。在调用该初始化程序后,我将调整大小移到“load”事件处理程序上,运行良好。
https://stackoverflow.com/questions/11246325
复制相似问题