有一个html片段,
请问为什么执行顺序是 Func1() -> Func3() -> Func2() ?
<head>
   <script>
        function Func1(){
             //..do something
        }
        function Func2(){
             //..do something
        }
        function Func3(){
             //..do something
        }
   </script>
</head>
<body>
   <div onmousedown='Func1()' id='mydiv'>Something</div>
   <script>
        var obj=document.getElementById('mydiv');
        obj.attachEvent('onmousedown',Func2);
        obj.attachEvent('onmousedown',Func3);
   </script>
</body>
我看资料好像说最后attach上去的事件应该是最先执行的, 但是为什么 Func1()会被先执行,再执行Func3()呢?

解决方案 »

  1.   


    但是我希望attach上去的函数先执行应该如何做,或者说我应该怎么做才能先执行我自己的函数才执行它本身的Func1()? 因为我需要在执行它本身的Func1()前,先执行我自己的函数.谢谢...
      

  2.   

    不行的...因为 <div onmousedown='Func1()' id='mydiv'>Something</div>
    是客户的代码,不能改的. 我的Func2()和Func3()是注入进去执行的...
      

  3.   

       这里只讨论技术,不讨论意图!   我个人认为,既然顺序改不了,那个<div on...〉已经被定死了。无法改变,那就想办法改Func1()函数的定义,我想楼主应该知道JS里的函数定义,后面定义的可以替换前面定义的函数,自己定义的函数可以替换系统自带的函数,比如我们常用的alert()也可以自己定义自己的风格内容,利用这个原理,你再定义一个Func1()出来,替换别人写的Func1()函数,这样可否变相执行了你自己的函数呢?
      

  4.   

    替换掉原来的函数,那么原来的Func1()也需要执行的,怎么办?谢谢。。
      

  5.   

    <div onmousedown='Func1()' id='mydiv'>Something</div>
    你确定他的客户端代码是上面这样的吗?
    如果是,那么只要你在F定义之后再定义一个Func1()函数,那么执行的时候就是你定义的那个Func1,而不是他定义的那个。
    怎么执行,那当然就是靠onmousedown这个事件来激发了。
      

  6.   

    因为定义在标签内作为属性的事件处理函数是作为标签的一部分,因此在DOM构造的时候才会注册,javascript对函数的预编译是先与DOM树的,因此相当于你的FUNC1是最后一个注册进来,因此会最新执行,如果更改
     var obj=document.getElementById('mydiv');
    obj.onmousedown=null;//设置为null移除处理函数
    obj.attachEvent('onmousedown',Func1);
            obj.attachEvent('onmousedown',Func2);
            obj.attachEvent('onmousedown',Func3);
      

  7.   


    谢谢! 您的解释很好很明白。 那么假如客户的代码的onmousedown里用了this, 我在attachEvent时怎么处理?