• listener的执行先后问题


    20121010日添加: franky教主(http://www.cnblogs.com/_franky/)说在IE各个版本下,attachEvent执行顺序是乱序的(这里是乱序,不是随机)。在我的环境下没有重现,我需要进一步验证下

    问题提出:

      问题一:如果一个element同时绑定了onclick,并且添加了click的listener。哪个最先执行呢?

      问题二:如果绑定了多个listener,那么执行顺序是按照添加顺序么

    做了一些例子,得出结论如下,希望大家批评指正:

    1) 第一个问题,ie是onclick优先于listener,无论顺序;非ie浏览器是根据代码执行顺序进行触发。但是如果用jQuery的trigger,会发现jQuery人为的将onclick触发点放在listener之后(此处不解,具体事例可参照jk的文章的详细描述:http://www.cnblogs.com/jkisjk/archive/2012/04/08/the_order_of_onclick_and_listeners.html

    2)第二个问题,ie是按照最后添加的listener优先触发、倒序触发;其他浏览器则是按照addEventListener顺序,顺序触发。jQuery内部将ie的也统一成按照绑定顺序触发。

    3)IE下测试验证

      3-1)IE下listener的倒序执行示例

    <!DOCTYPE HTML>
    <HTML>
     <HEAD>
      <TITLE> @si test </TITLE>
     </HEAD>
    
     <BODY>
        <div id="div1" style="position:relative;200px;height:200px;background-color:green;left:100px;top:100px;">
            
        </div>
        <SCRIPT LANGUAGE="JavaScript">
        <!--
            var div1 = document.getElementById("div1");
    
            //*****1)添加onclick
            div1.onclick = function(){alert("fire onclick")};
            //*****2)给listener绑定click 1
            div1.attachEvent("onclick", function(){alert("fire listener click 1")});
            //*****3)给listener绑定click 2
            div1.attachEvent("onclick", function(){alert("fire listener click 2")});
         //*****4)触发
         div1.fireEvent("onclick");
    //--> </SCRIPT> </BODY> </HTML>

    执行顺序为:

      fire onclick

      fire listener click 2

      fire listener click 1

      3-2)IE下listener的onclick优先执行示例

    <!DOCTYPE HTML>
    <HTML>
     <HEAD>
      <TITLE> @si test </TITLE>
     </HEAD>
    
     <BODY>
        <div id="div1" style="position:relative;200px;height:200px;background-color:green;left:100px;top:100px;">
            
        </div>
        <SCRIPT LANGUAGE="JavaScript">
        <!--
            var div1 = document.getElementById("div1");
    
            //*****1)给listener绑定click 1
            div1.attachEvent("onclick", function(){alert("fire listener click 1")});
    
         //*****2)添加onclick
            div1.onclick = function(){alert("fire onclick")};

    //*****3)给listener绑定click 2 div1.attachEvent("onclick", function(){alert("fire listener click 2")});      //*****4)触发      
         div1.fireEvent("onclick");
      //--> </SCRIPT> </BODY> </HTML>

    执行顺序为:

      fire onclick

      fire listener click 2

      fire listener click 1

    4)非IE下测试验证

    <!DOCTYPE HTML>
    <HTML>
     <HEAD>
      <TITLE> @si test </TITLE>
     </HEAD>
    
     <BODY>
        <div id="div1" style="position:relative;200px;height:200px;background-color:green;left:100px;top:100px;">
            
        </div>
        <SCRIPT LANGUAGE="JavaScript">
        <!--
            var div1 = document.getElementById("div1");
    
            
            //*****1)给listener绑定click 2
            div1.addEventListener("click", function(){alert("fire listener click 1")});
            //*****2)添加onclick
            div1.onclick = function(){alert("fire onclick")};
            //*****3)给listener绑定click 1
            div1.addEventListener("click", function(){alert("fire listener click 2")});
            //*****4)触发事件
            var e = document.createEvent('HTMLEvents');
            e.initEvent('click', true, true);
            div1.dispatchEvent(e);
        //-->
        </SCRIPT>
     </BODY>
    </HTML>

    执行顺序为:

      fire listener click 1

      fire onclick

      fire listener click 2

    4)jQuery1.7中onclick和listener测试验证

    <!DOCTYPE HTML>
    <HTML>
     <HEAD>
      <TITLE> @si test </TITLE>
      <script src="http://s0.qhimg.com/lib/jquery/172.js" type="text/javascript"></script> 
     </HEAD>
    
     <BODY>
        <div id="div1" style="position:relative;200px;height:200px;background-color:green;left:100px;top:100px;">
            
        </div>
        <SCRIPT LANGUAGE="JavaScript">
        <!--
            var div1 = document.getElementById("div1");
    
            //*****1)给listener绑定click 1
            $('#div1').bind('click',function(){alert("fire listener click 1")});
            //*****2)添加onclick
            div1.onclick = function(){alert("fire onclick")};
            //*****3)给listener绑定click 2
            $('#div1').bind('click',function(){alert("fire listener click 2")});
    
            $('#div1').trigger('click');
        //-->
        </SCRIPT>
     </BODY>
    </HTML>

    执行顺序为:

      fire listener click 1

      fire listener click 2

      fire onclick

      

  • 相关阅读:
    C++ Programming Language中的narrow_cast实现
    使用反射处理protobuf数据结构
    Qt中三种解析xml的方式
    iterator简单描述
    关于Strategy和State设计模式
    Jedis连接redis客户端
    Redis基础命令
    redis的安装和启动linux环境
    Redis简介和常见的面试题
    SSM框架整合
  • 原文地址:https://www.cnblogs.com/withasi/p/2481031.html
Copyright © 2020-2023  润新知