我的插件中有一个对话框,在完成一些删除过程后会打开。我用于所有这样的消息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()被执行后对话框没有关闭,所以我必须拖动对话框窗口再次稍微让它消失。 我该怎么办?
答案 0 :(得分: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'事件的处理程序,所以我想是触发了无限循环。扩展不是从头开始创建的,所以我有一段时间没有注意到这个错误。在调用初始化程序后,我将调整大小调整为'load'事件处理程序,运行正常。