js事件处理程序的运行环境(改变attachEvent内部的this指向&封装兼容性的 addEvent方法)

<div style="width:100px; height:100px; background-color:red"></div>

<script>
    var div = document.getElementsByTagName('div')[0];
    div.onclick = function () {
        console.log(this);
    }
    //<div style="width:100px; height:100px; background-color:red"></div>

    div.addEventListener('click', function () {
        console.log(this);
    }, false)
    //<div style="width:100px; height:100px; background-color:red"></div>

    div.attachEvent('click', function () {
        console.log(this);
    })
    //演示不了,只能在IE中演示,而且这里的this指向的是window

</script>

1.ele.onxxx = function (event) {}
程序this指向是dom元素本身

2.obj.addEventListener(type, fn, false);
程序this指向是dom元素本身

3.obj.attachEvent(‘on’ + type, fn);
程序this指向window

因为attachEvent方法在使用时,内部的this指向的是window,不方便,所以有时候要把这里的this变成自身

改变attachEvent内部的this指向

var div = document.getElementsByTagName('div')[0];
div.attachEvent('onclick', function () {
    handle.call(div); //通过.call方法,把指向改成div
                      //然后再在外部的handle函数中执行,这样this就绝对指向div了。
});
function handle() {
    //事件处理程序
}

封装兼容性的 addEvent(elem, type, handle);方法

function addEvent(elem, type, handle) {
    if(elem.addEventListener) {
        elem.addEventListener(type, handle, false);
    }else if(elem.attachEvent) {
        elem.attachEvent('on' + type, function () {
            handle.call(elem);
        })
    }else{
        elem['on' + type] = handle;
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值