如何指定何时应该运行事件?

时间:2011-06-09 00:14:26

标签: firefox javascript-events firefox-addon

有一些(脏旧的)代码基本上执行以下操作

<overlay id="slomozOverlay"
    xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul">

    <dialog id="commonDialog"       
        onload="commonDialogOnLoad(); myLoad();"
        ondialogaccept="myAccept(); Dialog.onButton0(); return true;">
        <script type="application/x-javascript" src="chrome://myjar/overlay.js" />
    </dialog>
</overlay>

名称已更通用,但overlay.js提供myLoadmyAccept

因为使用addEventListener来接收免于

的事件更合适
  • 搞乱对源对话框的更改
  • 没有吹走其他事件听众

以下是尝试更改结构的示例。

<overlay id="myOverlay"
    xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul">

    <script type="text/javascript"><![CDATA[
        window.addEventListener("load", function()
        {
            // code here equivelant to myLoad
            // find button
            button.addEventListener("command", function() { myAccept(); }, false);
        }, false);
    ]]></script>
    <dialog id="commonDialog"/>
</overlay>

现在我尝试进行此更改时似乎遇到的问题是myLoad要求onLoad的原始对话框完成其所做的一些更改 - 例如显示复选框。
即使那个在按钮上添加事件的地方似乎完全被忽略了。

因此,我尝试对事件使用loadComplete,并注意到行为没有变化,myLoad仍然在commonDialogOnLoad之前运行。

是否有某种方法可以指定最后运行事件,还是使用其他一些将在以后运行的事件? 关于如何处理此问题的其他建议是什么?

1 个答案:

答案 0 :(得分:0)

您无法确定执行load个事件处理程序的顺序。通常的方法是在setTimeout事件处理程序中以{0}延迟运行load

window.addEventListener("load", function(event)
{
    window.setTimeout(function()
    {
        // Your code here
    }, 0);
}, false);

此处唯一的问题 - 窗口是在load事件后立即绘制的,因此您的更改可能会导致可见的重绘。