<script language="JavaScript">
var x = 0;window.onbeforeunload = function()
{
setTimeout(test, 1);
return "exit?"
}window.onunload = function()
{
alert("onunload  x=" + ++x);
}function test()
{
alert("test  x=" + ++x);
}
</script>
依次显示:
onunload  x=2
test  x=1从变量值说明是后者先执行,对话框确实前者先跳出。Fx的事件模型?

解决方案 »

  1.   

    刷新浏览器的内部执行顺序:卸载(unload)->重建(load)
      

  2.   

    我的流程推测:[Native Code]:{
       ...
       msg = window.onbeforeunload();
       ...   //在这句线程挂起,转而执行setTimeout里的代码,但test函数中有alert,又挂起,等待此线程   ret = confirm(msg, ..., YES | NO);   if(ret == YES)
       {
           ...
           window.onunload();
           ...
       }   //线程完成,继续setTimeout里的代码   不知这样分析是否正确。
      

  3.   

    应该是浏览器的BUG。
    FF和其他浏览器一样,是可以同时出现多个alert的,包括关闭确认对话框和alert同时出现也可以。(通过弹出窗口的window.opener.alert可以实现)
      

  4.   

    setTimeout不会阻塞线程, 而return "exit"会. 若取消, 则不走unload/若yes则马上进一步执行. 由于setTimeout没有阻塞住线程, 所以执行了unload下的alert. 继而回到test的alert. 而test虽然在时间上晚于第二个alert, 但是init此函数却是在exit前. 说了这么多...应该就是2L的意思
      

  5.   

    这就不对了。
    <script language="JavaScript">
    var x = 0;
    function Demo()
    {
    setTimeout(A, 0);
    x = 10;
    x = 20; alert("Sleep") x = 30;
    }function A()
    {
    alert("x=" + x);
    }Demo();
    </script>
    结果是30.说明A是Demo函数全部运行完成后才在开始执行的,即使中间有个Sleep,A也没有开始执行。
      

  6.   

    不要用alert弹,会阻止当前程序向下运行的
    用innerHTML在页面写值看看结果
    load是页面加载运行,unload是卸载
    onbeforeunload 是关闭