apply补充
当时用call和apply传入的第一个参数为值类型的时候
会将值类型转换成对应的对象(引用类型) 然后赋值给this
1 | //当传入的第一个参数为 null或者Undefined的时候, |
注册事件的兼容性处理
- ele.on事件类型 = function(){}
- addEventListener(事件类型,事件处理函数,useCapture) 第三个参数默认是false,冒泡阶段执行
- attachEvent(事件类型,事件处理函数)
封装成函数,问题是每次都会判断
1 | // function registeEvent(target, type, handler){ |
1.在注册事件的时候,判断浏览器的注册事件的方式,然后直接使用该方式进行注册事件
复用性太差
2.将注册事件的代码封装到一个函数中
//每次调用该函数,都会进行浏览器能力检测
3.在函数中返回函数,让外部函数只执行一次,判断也就只会执行一次
使用函数内创建的函数返回给外界,就可以重复使用该函数,进行事件的注册
1 | function createEventRegister(){ |
使用更好的方式,避免了多次的判断
这里存在问题就是
我们使用统一的方式,进行事件注册
1、注册的事件的处理函数中的,this指向不一致
使用addEventListener的方式注册的点击事件的回调函数中的this 指向target
但是使用attachEvent的方式注册点击事件的回调函数中的this 指向window
2、3种注册事件的方式中,回调函数内获取事件对象的方式也是不一致的
要让他们统一,
在第二种的事件注册方式(attachEvent)中,手动给handler传递window.event
1 | div.addEventListener("click",function(e){ |
注册事件兼容性分析
1 | var div = document.getElementById("dvd1"); |