由于开学后的编程实验课,接触了海量字符换搜索的实验,所以好几天没有学习JS课程了,今天继续学习事件绑定。

  传统事件绑定存在一些问题,如:同名事件函数都执行,第二个函数会覆盖第一个。

  下面我们以事件切换器(传统绑定机制)为例。

  实现box标签属性红绿互换。如下:

window.onload=function(){
var box=document.getElementById('box');
box.onclick=toBlue;
}; function toRed(){
this.className='red';
this.onclick=toBlue;
} function toBlue(){
this.className='blue';
this.onclick=toRed;
}

  但传统事件机制容易出现以下的问题:覆盖问题、可读性问题和this传递问题。

  我们通过如下方法来解决这些问题。

  首先,添加一个事件函数addEvent。

function addEvent(obj,type,fn){
//用于保存上一个事件
var saved=null; //判断事件是否存在
if(typeof obj['on'+type]=='function'){
saved=obj['on'+type]; //保存上一个事件
}
//执行事件
obj['on'+type]=function(){
fn();
};
} addEvent(window,'load',function(){
alert('Lee');
}); addEvent(window,'load',function(){
alert('Mr.Lee');
});

  执行结果会出现Lee和Mr.Lee。

  当然,在添加其他事件时还会出现其他问题,如:this没有传递过去等。

  解决方法是利用call传递this。如:

    //执行事件
obj['on'+type]=function(){
fn.call(this);
};

  在事件切换中,常会出现过多切换会使浏览器卡死报错too much recursion。原因是保存了太多的事件,解决办法是及时释放执行过的事件对象。

  我们添加一个移除事件函数。如下:

function removeEvent(obj,type){
if(obj['on'+type]) obj['on'+type]=null;
}

  但我们在移除事件时,要注意不要一概而论,把整个事件对象全部删除,导致影响其他对象方法的调用。

  

  

  

  

  

  

  

Javascript事件绑定及深入的更多相关文章

  1. 第一百二十一节,JavaScript事件绑定及深入

    JavaScript事件绑定及深入 学习要点: 1.传统事件绑定的问题 2.W3C事件处理函数 3.IE事件处理函数 4.事件对象的其他补充 事件绑定分为两种:一种是传统事件绑定(内联模型,脚本模型) ...

  2. Javascript事件绑定的几种方式

    Javascript的事件绑定主要有四种方法(一下在IE中运行正常,但不保证其他浏览器): [注:onXXX为某一事件,fun为某一function,domId为某一DOM对象id,event类型见后 ...

  3. Javascript事件模型(三):JavaScript事件绑定方法总结(及Jquery)

    JavaScript中绑定事件的方法主要有三种: 1 在DOM元素中直接绑定 2 JavaScript代码中直接绑定 3 绑定事件监听函数 JQuery中绑定事件的几种方法 主要有on().bind( ...

  4. javaScript事件绑定

    事件绑定,就是要对某一个东西进行操作.(因为你想让他实现什么效果,所以就得绑定他,哈哈哈!) 要想让 JavaScript 对用户的操作作出响应,首先要对 DOM 元素绑定事件处理函数.所谓事件处理函 ...

  5. 详解javascript事件绑定使用方法

    由于html是从上至下加载的,通常我们如果在head部分引入javascript文件,那么我们都会在javascript的开头添加window.onload事件,防止在文档问加载完成时进行DOM操作所 ...

  6. javascript事件绑定和普通事件的区别

    <!doctype html><html lang="en"><head> <meta charset="UTF-8" ...

  7. javascript 事件绑定

    一.最简单和向后兼容性最好的事件绑定方法是把事件绑定到元素标识的属性.事件属性名称由事件类型外加一个“on”前缀构成.这些属性也被称为事件处理器 <INPUT TYPE="text&q ...

  8. javascript事件绑定1-模拟jquery可爱的东西

    1.给对象添加事件attachEvent(兼容IE,不兼容ff.chrome) <html xmlns="http://www.w3.org/1999/xhtml"> ...

  9. JavaScript事件绑定的常见方式

    在Javascript中,事件绑定一共有3种方式: ① 行内绑定 ② 动态绑定 ③ 事件监听 原文: https://mbd.baidu.com/newspage/data/landingsuper? ...

  10. JavaScript事件绑定的三种方式

    (一)事件绑定的三种方式 (1)通过on的形式 <script type="text/javascript"> var div = document.getElemen ...

随机推荐

  1. jquery 中prop()的使用方法

    1:设置input的选中属性:$('.passenger').find('.is-need-tel').prop('checked',true); 2:获取input是否选中: $('.passeng ...

  2. Windows与Linux文件系统互访的几种方法

    首先,我们知道基于文件的几种服务:ftp,sftp,这两种服务都是文件传输服务,偏重于网络传输,并不是实时互访.通常,我们需要在远程和本地 同时操作同一个目录,如:在Windows下使用各种强大的ID ...

  3. 日历视图(CalendarView)组件的功能和用法

    日历视图(CalendarView)可用于显示和选择日期,用户既可选择一个日期,也可通过触摸来滚动日历.如果希望监控该组件的日历改变,可调用CalendarView的setOnDateChangeLi ...

  4. mysql5.5慢日志设置和查询

    mysql> showvariables like '%version%'; +-------------------------+---------------------+ | Variab ...

  5. Goldengate双向复制配置

    一.Goldengate双向复制配置 1.1.在进行如下配置之前,先在源数据库source system(原来的目标数据库)端 添加辅助的redolog配置: SQL>alter databas ...

  6. C# Linq to SQL — Group by

    需求是需要统计数据库中表某一列的总数量,同时以List的形式返回到UI层. Linq to SQL中的Group by用法如下: IList<Unit.HandleCountClass> ...

  7. ejb ql 返回object

    String sqlStr="select t.car_kind,count(t) from table1 t where t.jb_date='"+jb_date+"' ...

  8. PayPal为什么从Java迁移到Node.js

    前言 大家都知道PayPal是另一家迁移到Node.js平台的大型公司,Jeff Harrell的这篇博文 Node.js at PayPal  解释了为什么从Java迁移出来的原因: 开发效率提高一 ...

  9. iOS 环信消息撤回

    这两天在做环信的消息回撤,在网上找了许久没有这种案例,之后官方的一些方法,但是自己做,还是需要花点时间去整理,所以我决定等我把这个做好之后,分享给大家,如果做的不好多多指教,谢谢- 首先要实现消息撤回 ...

  10. java操作redis redis连接池

    redis作为缓存型数据库,越来越受到大家的欢迎,这里简单介绍一下java如何操作redis. 1.java连接redis java通过需要jedis的jar包获取Jedis连接. jedis-2.8 ...