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绑定事件方式示例:
. <div id="btn" onclick="clickone()"></div> //直接在DOM里绑定事件
    <script>
     function clickone(){ alert("hello"); }
    </script>
. <div id="btn"></div>
  <script>
     document.getElementById("btn").onclick = function(){ alert("hello"); }
//脚本里面绑定
  </script>
. <div id="btn"></div>
  <script>
     document.getElementById("btn").addeventlistener("click",clickone,false);
//通过侦听事件处理相应的函数
     function clickone(){ alert("hello"); }
  </script>
用“addeventlistener”可以绑定多次同一个事件,且都会执行,而在DOM结构如果绑定两个“onclick”事件,只会执行第一个;在脚本通过匿名函数的方式绑定的只会执行最后一个请求。
. <div id="btn" onclick="clickone()" onclick="clicktwo()"></div>
  <script>
     function clickone(){ alert("hello"); } //执行这个
     function clicktwo(){ alert("world!"); }
  </script>
. <div id="btn"></div>
  <script>
     document.getElementById("btn").onclick = function(){ alert("hello"); }
     document.getElementById("btn").onclick = function(){ alert("world"); } //执行这个
  </script>
. <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')[]).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()方法处理。

关于JavaScript的事件绑定的更多相关文章

  1. javascript对象事件绑定方法

    javascript对象事件绑定方法 今天在做对象事件绑定的过程中出现了一点异外情况,由于事件方法是由参数传过来的,需要将当前对象call过去,方便方法体里直接调用this 错误写法 obj.oncl ...

  2. javascript之事件绑定

    曾经写过一篇随笔,attachEvent和addEventListener,跟本文内容有很多相似之处 本文链接:javascript之事件绑定 1.原始写法 <div onclick=" ...

  3. jQuery 事件绑定 和 JavaScript 原生事件绑定

    总结一下:jQuery 事件绑定 和 JavaScript 原生事件绑定 及 区别 jQuery 事件绑定 jQuery 中提供了四种事件监听绑定方式,分别是 bind.live.delegate.o ...

  4. JavaScript的事件绑定及深入

     事件绑定分为两种:一种是传统事件绑定(内联模型,脚本模型),一种是现代事件绑定 (DOM2 级模型).现代事件绑定在传统绑定上提供了更强大更方便的功能. 一.传统事件绑定的问题传统事件绑定有内联模型 ...

  5. JavaScript之事件绑定多个序列执行方法

    //一种事件绑定多个方法:以加载事件为例 function addEventLoad(func,isLog) { var oldOnLoad = window.onload; if (typeof w ...

  6. javascript 的事件绑定和取消事件

    研究fabricjs中发现,它提供canvas.on('mousemove', hh) 来绑定事件, 提供 canvas.off()来取消绑定事件这样的接口,很是方便, 那我们就不妨探究一下内在的实现 ...

  7. JavaScript 中事件绑定的三种方式

    以下是在 JS 中事件绑定的三种方式.   1. HTML onclick attribute     <button type="button" id="uplo ...

  8. JavaScript中事件绑定的方法总结

    最近收集了一些关于JavaScript绑定事件的方法,汇总了一下,不全面,但是,希望便于以后自己查看. JavaScript中绑定事件的方法主要有三种: 1 在DOM元素中直接绑定 2 JavaScr ...

  9. JavaScript中事件绑定的三种方式

    JavaScript使得网页与用户友好交互,在使用 js 进行时间绑定的时候有三种绑定方式. 第一种:初学者以及普通写法 <div id="dom0"> <inp ...

随机推荐

  1. vue项目自动构建工具1.0,支持多页面构建

    该工具适用于超多项目开发,每个项目不用都安装依赖,所有依赖都安装在ffk命令项目中,对于多分支拉到本地进行开发,亦有益处.对于多页面开发,也是相当便利,不用手动撸entry和plugin. git: ...

  2. Oracle - 函数及多表关联

    函数一般是在数据上执行的,它给数据的转换和处理提供了方便.只是将取出的数据进行处理,不会改变数据库中的值.函数根据处理的数据分为单行函数和聚合函数(组函数),组函数又被称作聚合函数,用于对多行数据进行 ...

  3. Codeforces Round #333 (Div. 2) B. Approximating a Constant Range

    B. Approximating a Constant Range Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://codeforces.com ...

  4. Java Volatile关键字(转)

    出处:  Java Volatile关键字 Java的volatile关键字用于标记一个变量“应当存储在主存”.更确切地说,每次读取volatile变量,都应该从主存读取,而不是从CPU缓存读取.每次 ...

  5. @Autowired注解与@Qualifier注解搭配使用----解决多实现选择注入问题

    问题:当一个接口实现由两个实现类时,只使用@Autowired注解,会报错,如下图所示 实现类1 实现类2 controller中注入 然后启动服务报错,如下所示: Exception encount ...

  6. c# word excel text转html的方法

    首先是预览图片,这个功能很好实现,无非就是创建一个html页面,嵌套一个<img>,为了限制图片类型,可以定义一个允许预览类型数组作为限制: /// <summary> /// ...

  7. 【原创】大数据基础之Kudu(5)kudu增加或删除目录/数据盘

    kudu加减数据盘不能直接修改配置fs_data_dirs后重启,否则会报错: Check failed: _s.ok() Bad status: Already present: FS layout ...

  8. 不同格式的YUV 和 RGB互转

    YUV色彩空间:        Y是亮度值,也就是说8位的灰度值即可组成一幅黑白图像,黑白电视机就是这样的.        UV是色彩值,是给Y上色用的.U是Cb也就是RGB中的蓝色分量,V是Cr也就 ...

  9. 4.Struts2-OGNL

    /*ognl 是 strut2 特有的表达式,使用 ognl,struts2 就无需将对象手动放值进request等范围,页面(从值栈中)直接传值*/ OGNL <?xml version=&q ...

  10. 1.Linux文件及目录结构

    Linux 文件结构 在Linux中 ,一切皆文件 目录结构