JS高级——封装注册事件
兼容性问题
1、ele.on事件类型 = function(){}一个元素ele注册一种事件多次,会被替换成最后一个,所以有局限性
2、addEventListener(事件类型,事件处理函数,useCapture) 第三个参数默认是false,冒泡阶段执行
3、attachEvent(事件类型,事件处理函数)
4、addEventListener、attachEvent在IE兼容性问题上正好可以互补
基本函数封装
<script>
//封装成函数,问题是每次都会判断
function registeEvent(target, type, handler) {
if (target.addEventListener) {
target.addEventListener(type, handler)
} else if (target.attachEvent) {
target.attachEvent("on" + type, handler)
} else {
target["on" + type] = handler;
}
}
</script>
在注册事件的时候,判断浏览器的注册事件的方式,然后直接使用该方式进行注册事件,就像上面那样,代码复用性差
解决方案:
1、将注册事件的代码封装到一个函数中,在函数中返回函数,让外部函数只执行一次,判断也就只会执行一次
2、外部函数只需要调用一次就可以知道客户浏览器的兼容方式是什么,然后利用这次返回的函数,注册事件,可以重复的注册
<script>
function createEventRegister(){
if(window.addEventListener){
return function(target, type, handler){
target.addEventListener(type,handler);
}
}else if(window.attachEvent){
return function(target, type, handler) {
target.attachEvent("on" + type, function(){
handler.call(target, window.event);
})
}
}else{
return function(target, type, handler) {
target["on" + type] = handler;
}
}
}
window.onload =function () {
var div = document.getElementById("div1");
registeEvent(div,"click",function(e){
console.log(e);
console.log(this);
})
}
</script>
需要注意的是IE6的时候只能使用attachEvent来解决兼容性问题,但是attachEvent,是不能够在注册的函数中传入的参数event对象的,它的访问形式都是window.event,此时我们可以使用call方法,修改传入参数handler函数,将它的参数强行注入进去。
JS高级——封装注册事件的更多相关文章
- JS——input标签注册事件
注意:淘宝的lable是用定位制作的,事件是oninput事件 <!DOCTYPE html> <html> <head lang="en"> ...
- js高级程序设计笔记之-addEventListener()与removeEventListener(),事件解除与绑定
js高级程序设计笔记之-addEventListener()与removeEventListener(),事件解除与绑定 addEventListener()与removeEventListener( ...
- js闭包理解案例-解决for循环为元素注册事件的问题
转发自http://www.ruanyifeng.com/blog/2009/08/learning_javascript_closures.html 一.变量的作用域 要理解闭包,首 ...
- JavaScript DOM高级程序设计 4.3控制事件流和注册事件侦听器--我要坚持到底!
一.事件流 我们通过下面一个实例,进行说明. <body> <h1>Event Flow</h1> <ul id="nav"> &l ...
- JS——行内式注册事件
html中行内调用function的时候,是通过window调用的function,所以打印this等于打印window,所以在使用行内注册事件时务必传入参数this <!DOCTYPE htm ...
- JS注册事件
<html xmlns="http://www.w3.org/1999/xhtml"><head> <title></title&g ...
- Node.js 教程 05 - EventEmitter(事件监听/发射器 )
目录: 前言 Node.js事件驱动介绍 Node.js事件 注册并发射自定义Node.js事件 EventEmitter介绍 EventEmitter常用的API error事件 继承EventEm ...
- 带你玩转JavaWeb开发之四 -如何用JS做登录注册页面校验
今日内容 使用JQuery完成页面定时弹出广告 使用JQuery完成表格的隔行换色 使用JQuery完成复选框的全选效果 使用JQuery完成省市联动效果 使用JQuery完成下列列表左右选择 使用J ...
- 关于javaScript注册事件传递参数的浅析
最近这半年作为一个java 程序员,我写的javaScript代码都快比java代码多了,前段时间是给某银行做一个柜员管控系统,在柜员授权这一块功能上,由于柜员的授权需要考虑各方面的因素,比如机构权限 ...
随机推荐
- UVa - 12450 - SpaceRecon Tournament
先上题目: Problem G: SpaceRecon Tournament SpaceRecon, the hottest game of 2011, is a real-time strategy ...
- 【ZJOI2017 Round2练习&BZOJ4827】D1T3 gift(FFT)
题意: 思路:可以看出题目所要最小化的是这样一个形式: 拆出每一项之后发现会变化的项只有sigma a[i]*b[i+t]与c^2,c*(a[i]-b[i]) c可以在外层枚举,剩下的只有sigma ...
- [bzoj1613][Usaco2008 Jan]Running贝茜的晨练计划_动态规划
Running贝茜的晨练计划 bzoj-1613 Usaco-2008 Jan 题目大意:题目链接(U组题题意真的是没法概括qwq....). 注释:略. 想法:一眼dp题. 状态:dp[i][j]表 ...
- [bzoj3289]Mato的文件管理_莫队_树状数组
Mato的文件管理 bzoj-3289 题目大意:给定一个n个数的序列.m次询问:一段区间中的逆序对个数. 注释:$1\le n\,mle 5\cdot 10^4$. 想法: 开始想这个题的大佬们,给 ...
- [poj1704]Georgia and Bob_博弈论
Georgia and Bob poj-1704 题目大意:题目链接 注释:略. 想法:我们从最后一个球开始,每两个凑成一对.如果有奇数个球,那就让第一个球和开始位置作为一对. 那么如果对手移动的是一 ...
- UVA_1575
https://vjudge.net/problem/UVA-1575 枚举答案(k)..对k质因数分解,质数的指数为cnt[i],若n==A(tot_cnt,tot_cnt) / A(cnt[i]& ...
- [Vue @Component] Extend Vue Components in TypeScript
This lesson shows how you can extend and reuse logic in Vue components using TypeScript inheritance. ...
- jdk1.6下使用sardine和jackrabbit-webdav的问题
同步一个遇到的问题,前几天,客户给了一个server地址和usernamepassword.让把上面的文件,download到还有一台server上.我查了下,发现该server使用文件协议是webd ...
- SoapUI在Jenkins中的配置
Jenkins Label: windows_ws_test 已有Jenkins环境变量 %READYAPI_PRO_HOME% - <D:\Program Files\SmartBear ...
- oc75--不可变字典NSDictionary
// // main.m // NSDictionary // // #import <Foundation/Foundation.h> int main(int argc, const ...