工作比较忙,但是也一定要抽时间出来提升一下自己的基本功,只有技术实力到位,才能为公司和个人创造更多的价值。下面进入主题:

IE中事件监听比较容易用到,但是由它所引出的一个关于this的问题,不得不着重的去思考和记录一下。

一、浏览器中不同的事件监听/绑定(个人感觉用监听比较通俗易懂):

//IE
element.attachEvent("event",functionname);                    //参数:1,表示监听的事件,需要在事件前加on(onclick,onfocus,onkeyevent……)2,响应事件时候所要执行的方法。
//Chrome and FireFox
element.addEventListener("event",functionname,false);         //参数:1和2同上(事件前不加on),3,是一个boolean,表示事件处理器是否启用事件捕捉。

二、既然不同的浏览器中的监听事件都清楚了,那我们有必要整合一种兼容性的方法出来。

//封装可重用的代码
functioin addListener(element,event,listener){
    if(element.addEventListener){                              //通过去区别该浏览器是否支持该方法,而执行不同的监听事件
        element.addEventListener(event,listener,false);
    }else if(element.attachEvent){
        element.attachEvent("on"+event,listener);
    }
}

//这样就可以监听事件了在ie和webkit等内核浏览器下都ok
addListener(window,"keydown",HandleKeyDown);
addListener(window,"load",init);
addListener(document.getElementById("link"),"click",onclick);

三,通用的方法,写好了,但是如果想用this的话,会遇到一点麻烦。思考如下代码:

addListener(document.getElementById("mylink"),"click",foo(){
    alert(this.href);
})

我们预期的效果是输出mylink元素的href,但在IE下事实是这样么?

重点:当执行某个方法的时候,this所指向函数的拥有者。

例如:

//方法1
function myFuc(){
    alert(this);                        //这时候this指向window对象
}

//方法2
var el = function(){
    alert(this);                       //this-->window对象
} 

//方法2
var el.method = function(){
    alert(this);                       //this-->el对象
}
//方法2
var el = function(){
    alert(this);                       //this-->window对象
} 

//方法2
var el.method = function(){
    alert(this);                       //this-->el对象
}

这样比较容易理解,但将一个对象的方法传递给另外的函数时候,那结果就匪夷所思了:

function myFunc(func){
    func()
}

var el.method = function(){
    alert(this);
}

myFunc(el.method);               //参数只是el.method的一个引用,并非整个el对象,所以这个时候this是window,因为myFunc属于window

//这样有歧义的用法,最好了解透彻,然后根据需求设计。我们的本意其实可以用另外的一种方式实现。

function myFunc(func){
    func.call(el)                      //call方法:允许一个方法在另一个对象中执行(抽象),简单的说,其实是,func是在el对象的基础上执行。等价el.method();
}

所以调用call方法之后,此刻this又指向了el对象。

四,修改addListener方法

functioin addListener(element,event,listener){
    if(element.addEventListener){
        element.addEventListener(event,listener,false);
    }else if(element.attachEvent){
        element.attachEvent("on"+event,function(){listener.call(element)});
    }
}

五,事件既然可以监听,那就可以取消监听

//webkit
var bKeyEvent = false;

function HandleKeydown(evt){
       if(bKeyEvent){
            //todo
        } else {
             evt.preventDefault()
         }
}
addListener(window,"keydown",HandleKeydown);

//IE
var bKeyEvent = false;

function HandleKeydown(evt){
       if(bKeyEvent){
            //todo
        } else {
             evt.returnValue = false
         }
}
addListener(window,"keydown",HandleKeydown);

另外一种方法(更简洁直观):

//webkit
window.removeEventListener("keydown",HandleKeyDown,false);
//IE
window.detachEvent(("keydown",HandleKeyDown);

第一话:IE中用DOM方法绑定事件的更多相关文章

  1. Js为Dom元素绑定事件须知

    为异步加载的Dom 元素绑定事件必须在加载完成之后绑定: $('body').load('LearnClickBinding.ashx');$('a').click(function () { ale ...

  2. 随笔一个dom节点绑定事件

    以下利用jquery说明: js中,给一个dom节点绑定事件再平常不过了.这里说下,如果dom经常发生变化的话,给这个dom绑定事件的情况. 比如代码如下: li的节点,绑定了事件:点击会打出来里头的 ...

  3. mui-当使用addeleventlisener()方法绑定事件时选择器无法绑定事件

    在mui中绑定事件不能用jQuery或mui(“#XX”)的形式选取某个元素,而是document.getelementbyid()的形式 mui(“#XX”)可以使用on方法绑定事件

  4. attachEvent方法绑定事件

    <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...

  5. Chrome插件Visual Event查看Dom元素绑定事件的利器

    找这工具找了好久,统一找着了,开发人员不可多得的好东东,收藏做一下分享. 用Chrome插件Visual Event查看Dom绑定的事件 Visual Event简介 Visual Event是一个开 ...

  6. AngularJS如何给动态添加的DOM中绑定事件

    正常情况(即非动态插入 DOM 对象)下,ng-click 这样的指令之所以有效(即点击之后能调用注册在可见作用域里的方法),是因为 angular 在 compiling phase(编译阶段)将宿 ...

  7. jquery给动态添加的dom元素绑定事件

    $('input').click(function () { //处理代码 }); 这只能是对已经加载好的元素定义事件,那些后来添加插入的元素则需要另行绑定,对于页面中动态添加的元素,在页面加载完成后 ...

  8. jQuery之方法绑定(事件注册)代码小结

    1.最直接的模式,直接将一个function对象传入方法函数,如下面的click(),好处坏处一看便知 $("#btnComfirmChooseCompany").click(fu ...

  9. jQuery clone()方法绑定事件

    先看如下代码: (function ($) { var div = $("<div></div>").css({width: "100px&quo ...

随机推荐

  1. TOMCATE8下面项目启动问题

    1.将servlet-api.jar替换项目中的servlet-api2.4 2.<servlet>           <servlet-name>dwr-invoker&l ...

  2. Codeforces Round #204 (Div. 2) C. Jeff and Rounding——数学规律

    给予N*2个数字,改变其中的N个向上进位,N个向下进位,使最后得到得数与原来数的差的绝对值最小 考虑小数点后面的数字,如果这些数都非零,则就是  abs(原数小数部分相加-1*n), 多一个0 则 m ...

  3. C/S模式与B/S模式的详细介绍

    网络程序开发的两种计算模式--C/S模式与B/S模式.两种各有千秋,用于不同场合. C/S适用于专人使用,安全性要求较高的系统: B/S适用于交互性比较频繁的场合,容易被人们所接受,倍受用户和软件开发 ...

  4. JAVA-Unit04: SQL(高级查询)

    Unit04: SQL(高级查询) 查看SMITH的上司在那个城市工作? SELECT e.ename,m.ename,d.loc FROM emp e,emp m,dept d WHERE e.mg ...

  5. 与FPGA相关的独热码

    独热码在状态机里面使用比价广泛,这一块有些人爱用,有些人嫌烦,有时候可以用用格雷码跳转,不过格雷码只支持那种一步到底的,中间有分支就不好做了,所以后来还是回到了独热码的正道上. 说白了独热码的使用,在 ...

  6. SpringBoot运行报Address already in use: bind

    java.net.BindException: Address already in use: bind at sun.nio.ch.Net.bind0(Native Method) at sun.n ...

  7. CRUD

    identity 自增长 primary key 主键 unique 唯一键 not null 非空 references 外键(引用) 1.删除表 drop table Student 2.修改表 ...

  8. iis 重新安装后 重新注册asp.net

    服务器IIS问题: 卸载并重新安装了IIS.... 解决方法:原因是IIS重装后要重新安装一下.NET Framework. 开始-->运行-->CMD-->然后在CMD窗口中输入命 ...

  9. NGUI的UICamera

    参考 https://blog.csdn.net/kakashi8841/article/details/20548429   全文请查看:http://note.youdao.com/notesha ...

  10. ApacheOFBiz的相关介绍以及使用总结(一)

    由于最近一段时间在给一个创业的公司做客户关系管理CRM系统,限于人力要求(其实是没有多少人力),只能看能否有稳定,开源的半成品进行改造,而且最好不需要前端(js)相关开发人员的支援就可以把事情做成,经 ...