Как указать, когда должно выполняться событие? - PullRequest
0 голосов
/ 09 июня 2011

Имеет некоторый (грязный старый) код, который делает в основном следующее

<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 обеспечивает myLoad и myAccept

Как более целесообразно использовать 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 голосов
/ 09 июня 2011

Вы не можете реально определить порядок, в котором выполняются обработчики событий load.Обычный подход - запуск setTimeout с нулевой задержкой в ​​обработчике события load:

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

Единственная проблема здесь - окно рисуется сразу после события load, поэтому ваши изменения могут вызватьвидимая перерисовка.

...