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. Hashtable和Dictionary<T,K>的使用

    由于Hashtable内部自带有排序(根据Key的HashCode来进行的),因此有时在使用Hashtable时就会造成数据顺序不可控的情况,有两种办法可以解决, 测试代码: Dictionary&l ...

  2. Grasshopper 2.0 MP Color FireWire 1394b (Sony ICX274)

        相机参数如下,参见这里: Resolution 1624 x 1224 Frame Rate 30 FPS Megapixels 2.0 MP Chroma Color Sensor Name ...

  3. 【液晶模块系列基础视频】3.4fatfs接口函数的使用4

    ============================= 技术论坛:http://www.eeschool.org 博客地址:http://xiaomagee.cnblogs.com 官方网店:ht ...

  4. Ubuntu 启动停止脚本

    /etc/init.d 目录下的开机启动脚本 1. more redis_8010 #/bin/sh #Configurations injected by install_server below. ...

  5. 【转】区别和认识.Net四个判等函数

    原文地址:不详 .Net有四个判等函数?不少人看到这个标题,会对此感到怀疑.事实上确是如此,.Net提供了ReferenceEquals.静态Equals,具体类型的Equals以及==操作符这四个判 ...

  6. eXosip2代码分析

    主要类型定义: 1.struct eXtl_protocol struct eXtl_protocol { int enabled; int proto_port; ]; ]; int proto_n ...

  7. [ZZ] GTX 280 GPU architecture

    http://anandtech.com/show/2549 Now that NVIDIA’s has announced its newest GPU architecture (the GeFo ...

  8. PHP 开发 APP 接口 学习笔记与总结 - XML 方式封装通信接口

    1.PHP 生成 XML 数据 ① 拼接字符串 ② 使用系统类(DomDocument,XMLWriter,SimpleXML) 例1 使用 PHP 系统类中的 DomDocument 类: < ...

  9. mybatis sql in 查询(mybatis sql语句传入参数是list)mybatis中使用in查询时in怎么接收值

    1.in查询条件是list时 <select id="getMultiMomentsCommentsCounts" resultType="int"> ...

  10. spring对dao层的支持(datasource的作用)

    本文大多数内容转自“http://www.cnblogs.com/liunanjava/p/4412408.html”感谢原作者 在做一个项目时,持久层并没有使用spring jpa和hibernat ...