JS通用事件监听函数

版本一

//把它全部封装到一个对象中
var obj={
readyEvent:function (fn){
if(fn==null){
fn=document;
}
var oldOnload=window.onload;
if(typeof window.onload !='function'){
window.onload=fn;
}else{
window.onload=function (){
oldOnload();
fn();
}
}
},//添加事假
addEvent:function (element,type,handler){
if(element.addEventListener){
//事件类型 需要执行的函数 是否捕捉
element.addEventListener(type,handler,false)
}else if(element.attachEvent){
element.attachEvent('on'+type,function (){
handler.call(element);
});
}else{
element['on'+type]=handler;
}
},//移除事件
removeEvent:function (element,type,handler){
if(element.removeEventListener){
element.removeEventListener(type,handler,false)
}else if(element.detachEvent){
element.detachEvent('on'+type,handler)
}else{
element['on'+type]=null;
}
},//阻止事件冒泡
stopPropagation:function (ev){
if(ev.stopPropagation){
ev.stopPropagation();
}else{
ev.canceBubble=true;
}
},//取消事件的默认行为
preventDefault:function (ev){
if(event.preventDefault){
event.preventDefault();
}else{
event.returnValue=false;
}
},//获取事件目标
getTarget:function (event){
return event.target || event.srcElement;
},//获取event对象的引用,取到event对象的引用;取得事件的所有信息;确保随时能用到event;
getEvent:function (e){
var ev=e||window.event;
if(!ev){
var c=this.getEvent.caller;
while(c){
ev=c.arguments[0];
if(ev && Event==ev.constructor){
break;
}
c=c.caller;
}
}
return ev;
}
}

这里补充一点关于事件:srcElement 和 target(都指的是事件源)

srcElement是IE下的属性
 target是Firefox下的属性
 Chrome浏览器同时有这两个属性

实例一:

html

<input id="btnInfo" type="button" value="show" name="btn" />

<div id="infoq" style=" height:100px; width:100px; background:green;"></div>

js

window.onload=function (){

     var obj=document.getElementById("btnInfo");
obj.onclick=function (ev){
var e=ev || event;
var target=e.srcElement || e.target; //这样就获取到饿了我们的事件源滴呀
alert(target.value)
} //我们也可以直接的添加这个事件的属性滴呀
var div=document.getElementById("infoq");
div.onclick=function (ev){
var e=ev || event;
var target=e.srcElement || e.target; //这样就获取到饿了我们的事件源滴呀
alert(target.style.width)
}
}

我们再来看一个实例

html

<input type="text" onblur="alert(this.value)" />

<input type="text" onblur="alertValue()" />

<input type="text" onblur="alertValue1(this)" />

js

function alertValue(){
alert(this.value); //这样是不行的
}
function alertValue1(oThis){
alert(oThis.value);
}

版本二

var EventUtil={
addHandler:function (element,type,handler){
if(element.addEventListener){
element.addEventListener(type,handler,false);
}else{
element.attachEvent('on'+type,hanlder);
}
},
removeHandler:function (element,type,handler){
if (element.removeEventListener){
element.removeEventListener(type,hanlder,false);
}else if(element.detachEvent){
element.detachEvent('on'+type,handler);
}else{
element['on'+type]=null;
}
},
getEvent:function (event){
return event?event:window.event;
},
getTarget:function(event){
return event.target || event.srcElement;
},
preventDefault:function (event){
if(event.preventDefault){
event.preventDefault();
}else{
event.returnVauel=false;
}
},
stopPropagation:function (event){
if (event.stopPropagation){
event.stopPropagation();
}else{
event.cancleBubble=true;
}
} }

这里补充一篇关于事件的详细解读:http://www.admin10000.com/document/6293.html

这里,我们再补充一个高级一点js版本

 html

<style type="text/css">
.outer{
height:100px;
width:100px;
background:green;
}
</style>
</head> <body>
<div id="outer" class="outer">
</div>
</body>

javaScript

   //这个就是他的基本使用
var $=function (d){
typeof d=='string' && (d=document.getElementById(d))
return $.fn.call(d); //这个就是基本的写法
}
$.fn=function (){
this.addEvent=function (eventType,handler){
if(this.addEventListener){this.addEventListener(eventType,handler,false)}
else if(this.attachEvent){this.attachEvent('on'+eventType,handler)}
else {this['on'+eventType]=handler}
}
this.removeEvent=function (eventType,handler){
if(this.removeEventListener){this.removeEventListener(eventType,handler,false)}
else if(this.detachEvent){this.detachEvent('on'+eventType,handler)}
else{this['on'+eventType]==null}
}
return this;
}
//这样就添加了我们的事件监听的函数的呀
var Bind=function (obj,fun,arr){
return function (){
return fun.apply(obj,arr);//这样做是为了方面传递参数滴呀
}
} //测试
var obj=$('outer');
obj.setAttribute('at','fuck');
//要不然,被绑定的事件,无法获取该对象的属性的啊
//这样就能够获取到我们对象的值滴呀
//同样能够获取到我们传递的参数体呀
obj.addEvent('mouseover',Bind(obj,function (para){
var s=arguments;
console.log(para);
console.log(this.getAttribute('at'))
},['mouseover']) //这样我们的参数才算是完毕了滴呀
);
//这样我们的额参数就传递进去了滴一
obj.addEvent('mouseout',Bind(obj, function (para){
console.log(para);
console.log(this.getAttribute('at'))
},['mouseout'])
);

JS通用事件监听函数的更多相关文章

  1. js添加事件监听的方式与this

    js添加事件监听与this js添加事件监听的方式与this 在标签中调用自定义函数 DOM0级事件处理程序 DOM2级事件处理程序 this 代表谁? js添加事件监听的方式与this <di ...

  2. JS的事件监听机制

    很久以前有个叫Netscape的姑娘,她制订了Javascript的一套事件驱动机制(即事件捕获) 后来又有一个叫“IE”的小子,这孩子比较傲气,他认为“凭什么我要依照你的规则走”,于是他又创造了一套 ...

  3. js实现事件监听与阻止监听传播

    监听事件: 使用attachEvent(用于IE)和addEventListener(用于谷歌.火狐)时则可以实现多个事件处理函数的调用 1.下面都是dom对象的方法,可以实现一种事件绑定多个事件处理 ...

  4. JS之事件监听

    一 如果事件监听类似于如下写法,则最终只会执行最后一个事件监听,其他监听都会被覆盖掉. window.onload=funtion(){console.log(1);}; window.onload= ...

  5. Node.js之事件监听和发送

    演示事件的发送和监听 const events = require("events"); function Account() { this.balance = 0; events ...

  6. JavaScript中绑定事件监听函数的通用方法addEvent() 和 事件绑定之bindEvent()与 unBindEvent()函数

    下面绑定事件的代码,进行了兼容性处理,能够被所有浏览器支持: function addEvent(obj,type,handle){ try{ // Chrome.FireFox.Opera.Safa ...

  7. JS键盘事件监听

    window.onload=function(){ var keyword = document.getElementById("keyword"); keyword.onkeyu ...

  8. js事件监听-addEventListener (w3c标准) 和 attachEvent(ie)

    研究了一个小时,没看懂这两个属性 window.onload = function(){ var oDiv = document.getElementById("J_myDiv") ...

  9. React.js 小书 Lesson9 - 事件监听

    作者:胡子大哈 原文链接:http://huziketang.com/books/react/lesson9 转载请注明出处,保留原文链接和作者信息. 在 React.js 里面监听事件是很容易的事情 ...

随机推荐

  1. COJ574 数字序列

    试题描述   霸中智力测试机构的一项工作就是按照一定的规则删除一个序列的数字,得到一个确定的数列.陈思同学很渴望成为霸中智力测试机构的主管,但是他在这个工作上做的并不好,俗话说熟能生巧,他打算做很多练 ...

  2. python requests库学习

    Python 第三方 http 库-Requests 学习 安装 Requests 1.通过pip安装 $ pip install requests 2.或者,下载代码后安装: $ git clone ...

  3. 看看 JDK 8 给我们带来什么(转)

    世界正在缓慢而稳步的改变.这次改变给我们带来了一个新模样的JDK7,java社区也在一直期盼着在JDK8,也许是JDK9中出现一些其他的改进.JDK8的改进目标是填补JDK7实现中的一些空白——部分计 ...

  4. iOS开发项目之四 [ 调整自定义tabbar的位置与加号按钮的位置]

    自定义tabbar与按钮的添加 01 - 把系统的tabbar用我们自己的覆盖 LHQTabBar *lhqTabBar = [[LHQTabBar alloc]init]; [self setVal ...

  5. Windows下PHPUnit安装

    收藏的介绍地址 1.手动方式安装示例:http://blog.sina.com.cn/s/blog_5d3dc0110100ghlo.html2.通过Pear安装示例:blog.sina.com.cn ...

  6. 自制Chrome拓展

    淘宝试用自动点击: 谷歌其实就是一些html+css+js+静态资源.但是里面有一个特别的配置文件manifest.json.该文件和Android的那个androidmanifest.xml类似,记 ...

  7. 18. 求交错序列前N项和

    求交错序列前N项和 #include <stdio.h> int main() { int numerator, denominator, flag, i, n; double item, ...

  8. Universal Serial Bus USB 3.0

    Computer Systems A Programmer's Perspective Second Edition A Universal Serial Bus (USB) controller i ...

  9. Subset sum problem

    https://en.wikipedia.org/wiki/Subset_sum_problem In computer science, the subset sum problem is an i ...

  10. Java中同步

    解决资源共享的同步操作,有两种方法:一是同步代码块,二是同步方法. 在需要同步的代码块加上synchronized关键字, 同步代码块时必须指定一个需要同步的对象,但一般都是将当前对象(this)设置 ...