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. 【BZOJ】3038: 上帝造题的七分钟2(线段树+暴力)

    http://www.lydsy.com:808/JudgeOnline/problem.php?id=3038 这题我就有得吐槽了,先是线段树更新写错,然后不知哪没pushup导致te,精度问题sq ...

  2. StereoBM::disp12MaxDiff Crash the Release

    Initializing "cv::StereoBM bm.state->disp12MaxDiff" should be careful, inappropriate va ...

  3. 紧挨导航栏下的链接a标签失效

    在我编完网页测试的的时候,发现导航下的链接不能用,不出现小手的图表,而下面的相同的链接都能用.如下图所示 遇到的相同问题的另一个未完成的页面如图 先不谈论其原因,说一下我对第一个页面的解决办法,我在导 ...

  4. Linux环境下实现生产者消费者问题

    #include <stdio.h> #include <semaphore.h> #include <stdlib.h> #include <pthread ...

  5. Java集合之Map接口

    Map使用键值对来存储数据,将键映射到值对象,一个映射不能包含重复的键,每一个键最多只能映射到一个值.Map接口的具体实现类:HashMap,Hashtable,TreeMap,LinkedHashM ...

  6. eclipse安装swing插件

    最近想用java做个小应用,是那种可视化图形类的应用.因为一直比较懒,所以打算用swt拖拖拽拽.于是在就去找swt,这是以前的办法.结果发现原来最新版的eclipse自己带有一个windowbuild ...

  7. 简单排序算法 C++类实现

    简单排序算法: 冒泡排序 插入排序 选择排序 .h代码: // // SortClass.h // sort and selection // // Created by wasdns on 16/1 ...

  8. MySQL DATE_FORMAT() 函数

    定义和用法 DATE_FORMAT() 函数用于以不同的格式显示日期/时间数据. 语法 DATE_FORMAT(date,format) date 参数是合法的日期.format 规定日期/时间的输出 ...

  9. extjs文件上传

    EXT学习教程:http://www.cnblogs.com/iamlilinfeng/category/385121.html Ext文件上传: 例子用到的jar:   1.upload.js /* ...

  10. nginx gzip 模块配置

    #gzip模块设置 gzip on; #开启gzip压缩输出 gzip_min_length 1k; #最小压缩文件大小 gzip_buffers 4 16k; #压缩缓冲区 gzip_http_ve ...