zoukankan      html  css  js  c++  java
  • 关于JavaScript的事件绑定

    js事件绑定的几种方式

    JavaScript中有三种常用的绑定事件方法:
    1. 在DOM元素中直接绑定;
    2. 在JavaScript代码中绑定;
    3. 绑定事件佳妮婷函数。
    一、在DOM元素中直接绑定
    这里的DOM元素指HTML标签。JavaScript支持在标签中直接绑定事件,语法:
    onXXX = "JavaScript Code"
    其中:
    1)、onXXX为事件名称。如:鼠标单击事件onclick,鼠标双击事件ondouble,鼠标移入事件onmouseover,鼠标移出事件onmouseout等。
    2)、JavaScript Code为处理事件的JavaScript代码,一般是函数。
    ① 原生函数
    <input onclick="alert('谢谢支持')" type="button" value="点击我,弹出警告框" />
    ② 自定义函数
    <input onclick="myAlert()" type="button" value="点击我,弹出警告框" />
    <script type="text/javascript">
    function myAlert(){
    alert("谢谢支持");
    }
    </script>
    二、在<script>元素中直接绑定
    在JavaScript代码中(即<script>标签内)绑定事件可以使JavaScript代码与HTML标签分离,文档结构清晰,便于管理和开发。
    在JavaScript代码中绑定事件的语法为:
    elementObject.onXXX=function(){
     // 事件处理代码
    }
    其中:
    1)、elementObject 为DOM对象,即DOM元素。
    2)、onXXX 为事件名称。
    例如,为 id="demo" 的按钮绑定一个事件,显示它的 type 属性:
    <input  id="demo"  type="button"  value="点击我,显示 type 属性" />  
    <script type="text/javascript">  
    document.getElementById("demo").onclick=function(){  
        alert(this.getAttribute("type"));  
    // this 指当前发生事件的HTML元素,这里是<div>标签  
    }  
    </script>
    三、绑定事件监听函数
    绑定事件的另一种方法是用 addEventListener() 或 attachEvent() 来绑定事件监听函数。
    1、addEventListener()函数语法:
    elementObject.addEventListener(eventName,handle,useCapture);
    1)、elementObject:DOM对象(即DOM元素)。
    2)、eventName:事件名称。注意,这里的事件名称没有“ on ”,如鼠标单击事件 click ,鼠标双击事件 doubleclick ,鼠标移入事件 mouseover,鼠标移出事件 mouseout 等。
    3)、handle:事件句柄函数,即用来处理事件的函数。
    4)、useCapture:Boolean类型,是否使用捕获,一般用false 。
    2、attachEvent()函数语法:
    elementObject.attachEvent(eventName,handle);
    1)、elementObject:DOM对象(即DOM元素)。
    2)、eventName:事件名称。注意,与addEventListener()不同,这里的事件名称有“ on ”,如鼠标单击事件 onclick ,鼠标双击事件 ondoubleclick ,鼠标移入事件 onmouseover,鼠标移出事件 onmouseout 等。
    3)、handle:事件句柄函数,即用来处理事件的函数。
    注意:事件句柄函数是指“ 函数名 ”,不能带小括号。
    addEventListener()是标准的绑定事件监听函数的方法,是W3C所支持的,Chrome、FireFox、Opera、Safari、IE9.0及其以上版本都支持该函数;但是,IE8.0及其以下版本不支持该方法,它使用attachEvent()来绑定事件监听函数。所以,这种绑定事件的方法必须要处理浏览器兼容问题。
    下面绑定事件的代码,进行了兼容性处理,能够被所有浏览器支持:
    function addEvent(obj,type,handle){  
        try{  // Chrome、FireFox、Opera、Safari、IE9.0及其以上版本  
            obj.addEventListener(type,handle,false);  
        }catch(e){  
            try{  // IE8.0及其以下版本  
                obj.attachEvent('on' + type,handle);  
            }catch(e){  // 早期浏览器  
                obj['on' + type] = handle;  
            }  
        }  
    }  
    这里使用 try{ ... } catch(e){ ... } 代替 if ... else... 语句,避免浏览器出现错误提示。
    例如,为一个 id="demo" 的按钮绑定事件,鼠标单击时弹出警告框:
    addEvent(document.getElementById("demo"),"click",myAlert);
    function myAlert(){
        alert("又是一个警告框");
    }
    以上三种js绑定事件方式示例:
    1. <div id="btn" onclick="clickone()"></div> //直接在DOM里绑定事件
        <script>
         function clickone(){ alert("hello"); }
        </script>
    2. <div id="btn"></div>
      <script>
         document.getElementById("btn").onclick = function(){ alert("hello"); }
     //脚本里面绑定
      </script>
    3. <div id="btn"></div>
      <script>
         document.getElementById("btn").addeventlistener("click",clickone,false); 
    //通过侦听事件处理相应的函数
         function clickone(){ alert("hello"); }
      </script>
    用“addeventlistener”可以绑定多次同一个事件,且都会执行,而在DOM结构如果绑定两个“onclick”事件,只会执行第一个;在脚本通过匿名函数的方式绑定的只会执行最后一个请求。
    1. <div id="btn" onclick="clickone()" onclick="clicktwo()"></div> 
      <script>
         function clickone(){ alert("hello"); } //执行这个
         function clicktwo(){ alert("world!"); }
      </script>
    2. <div id="btn"></div>
      <script>
         document.getElementById("btn").onclick = function(){ alert("hello"); }
         document.getElementById("btn").onclick = function(){ alert("world"); } //执行这个
      </script>
    3. <div id="btn"></div>
      <script>
         document.getElementById("btn").addeventlistener("click",clickone,false);
         function clickone(){ alert("hello"); } //先执行
         document.getElementById("btn").addeventlistener("click",clicktwo,false);
         function clicktwo(){ alert("world"); } //后执行
      </script>

    jQuery事件绑定

    一、.bind()、.live()、.delegate()之间的区别
    1) .bind()
    $('a').bind('click', function() {alert('That tickles') });
    这是最简单的绑定方法。jQuery扫描文档找出所有的$('a')元素,并把alert函数绑定到每个元素的click事件上。
    2) .live()
    $('a').live('click',function(){alert('That tickles!)});
    jQuery把alert函数绑定到$(document)元素上,并使用‘click’和‘a’作为参数。任何时候只要有事件冒泡到document节点上,它就查看该事件是否是一个click事件,以及该事件的目标元素与‘这一CSS选择器是否匹配,如果都是的话,则执行函数。
    live方法还可以被绑定到具体的元素(或context)而不是document上,像这样:
    $('a',$('#container')[0]).live(...);
    3) .delegate()
    $('#container').delegate('a','click',function(){alert(”That tickles!")});
    jQuery扫描文档查找$('#container'),并使用click事件和‘a'这一CSS选择器作为参数把alert函数绑定到$('#container')上。任何时候只要有事件冒泡到$('#container')上,它就查看该事件是否是click事件,以及该事件的目标元素是否与CSS选择器相匹配。如果两种检查的结果都为真的话,它就执行函数。
    可以注意到,这一过程与.live()类似,但是其把处理程序绑定到具体的元素而非document这一根上。
    为什么.delegate()要比.live()好用?
    基于几个原因,人们通常更愿意选用jQuery的delegate方法而不是live方法。考虑下面的例子:
    $('a').live('click', function() { blah() }); 
    // 或者 
    $(document).delegate('a', 'click', function() { blah() });
    停止传播
    最后一个我想做的提醒与事件传播有关。通常情况下,我们可以通过使用这样的事件方法来终止处理函数的执行:
    $('a').bind('click', function(e) { 
      e.preventDefault(); 
      // 或者 
      e.stopPropagation(); 
     });
    二、比较和联系:
    1.bind()函数只能针对已经存在的元素进行事件的设置;但是live(),on(),delegate()均支持未来新添加元素的事件设置;
    2.bind()函数在jquery1.7版本以前比较受推崇,1.7版本出来之后,官方已经不推荐用bind(),替代函数为on(),这也是1.7版本新添加的函数,同样,可以用来代替live()函数,live()函数在1.9版本已经删除;
    3.live()函数和delegate()函数两者类似,但是live()函数在执行速度,灵活性和CSS选择器支持方面较delegate()差些。
    4.bind()支持Jquery所有版本;live()支持jquery1.9-;delegate()支持jquery1.4.2+;on()支持jquery1.7+;
    三、推荐使用.on()方法绑定,原因有两点:
    1.on()方法可以绑定动态添加到页面元素的事件
    比如动态添加到页面的DOM元素,用.on()方法绑定的事件不需要关心注册该事件的元素何时被添加进来,也不需要重复绑定。有的同学可能习惯于用.bind()、.live()或.delegate(),查看源码就会发现,它们实际上调用的都是.on()方法,并且.live()方法在jQuery1.9版本已经被移除。
    bind: function( types, data, fn ) {
        return this.on( types, null, data, fn );
    },
    live: function( types, data, fn ) {
        jQuery( this.context ).on( types, this.selector, data, fn );
        return this;
    },
    delegate: function( selector, types, data, fn ) {
        return this.on( types, selector, data, fn );
    }
    2.on()方法绑定事件可以提升效率
    测试:
    假设页面添加了5000个li,用chrome开发者工具Profiles测试页面载入时间。
    普通
    $('li').click(function(){
        console.log(this)
    });
    普通绑定相当于在5000li上面分别注册click事件,内存占用约4.2M,绑定时间约为72ms。
    .on()绑定
    $(document).on('click', 'li', function(){
        console.log(this)
    })
    .on()绑定利用事件代理,只在document上注册了一个click事件,内存占用约2.2M,绑定时间约为1ms。
     
    tip:如果你需要移除on()所绑定的方法,可以使用off()方法处理。
  • 相关阅读:
    牛客网 二叉树的镜像 JAVA
    牛客网 反转链表 JAVA
    牛客网 调整数组顺序使奇数位于偶数前面 JAVA
    Integer to Roman LeetCode Java
    Valid Number leetcode java
    Longest Common Prefix
    Wildcard Matching leetcode java
    Regular Expression Matching
    Longest Palindromic Substring
    Add Binary LeetCode Java
  • 原文地址:https://www.cnblogs.com/memphis-f/p/7357668.html
Copyright © 2011-2022 走看看