您好,欢迎来到帮我找美食网。
搜索
您的当前位置:首页JavaScript实现为事件句柄绑定监听函数的方法分析

JavaScript实现为事件句柄绑定监听函数的方法分析

来源:帮我找美食网
JavaScript实现为事件句柄绑定监听函数的⽅法分析

本⽂实例讲述了JavaScript实现为事件句柄绑定监听函数的⽅法。分享给⼤家供⼤家参考,具体如下:

在JavaScript中为Dom元素绑定事件监听函数是⼀件⾮常常见的事情,但这⾥也有许多的Bug。各种浏览器对于事件绑定都提供了很多⽅法,但可靠的只有3中:1、传统的绑定⽅法:

elem.onclick = function( event ){

alert(event.type + 'this.innerHTML');};

a、传统的绑定⽅法,⾮常简单稳定,函数体内的this指向的也是指向正在处理事件的节点(如当前正在运⾏事件句柄的节点)。

b、⼀个元素的⼀个事件句柄只能注册⼀个函数,如果重复注册,会产⽣覆盖;⽽且,传统绑定⽅法只会在事件冒泡中运⾏。2、W3C标准绑定⽅法:

var elem = document.getElementById('ID');elem.addEventListener('click' , function( event ){

alert(event.type + ' ' + this.innerHTML + 1); } ,

false //冒泡阶段执⾏);

elem.addEventListener('click' , function( event ){

alert(event.type + ' ' + this.innerHTML + 2); } , false);

a、这种绑定⽅法同时⽀持时间处理的捕获和冒泡两个阶段;同⼀元素的同⼀事件句柄可以注册多个监听函数;⽽且,监听函数内部this指向当前元素。

b、但是流⾏的IE浏览器不⽀持这种注册⽅法。3、IE事件句柄注册⽅法:

var elem = document.getElementById('a');elem.attachEvent('onclick' , function(){

alert(window.event.srcElement.innerHTML + ' ' + this.innerHTML + 1); });

elem.attachEvent('onclick' , function(){

alert(window.event.srcElement.innerHTML + ' ' + this.innerHTML + 2); });

a、这种绑定⽅法,可以为同⼀事件句柄注册多次。

b、IE的事件模型不⽀持事件捕获;监听函数体内的this指向的不是当前于元素,⽽且window.event.srcElement指向的是发⽣事件的节点,⽽不是当前节点,并且在IE的事件对象中也没有等价的DOM currentTarget属性。4、跨浏览器的⽅法⼀:

function addEvent(element, type, handler) {

if (!handler.guid)handler.guid = addEvent.guid++; if (!element.events) element.events = {}; var handlers = element.events[type]; if (!handlers) {

handlers = element.events[type] = {}; if (element[\"on\" + type]) {

handlers[0] = element[\"on\" + type]; }

}

handlers[handler.$$guid] = handler; element[\"on\" + type] = handleEvent;};

addEvent.guid = 1;

function removeEvent(element, type, handler) { if (element.events && element.events[type]) { delete element.events[type][handler.$$guid]; }};

function handleEvent(event) { var returnValue = true;

event = event || fixEvent(window.event); var handlers = this.events[event.type]; for (var i in handlers) {

this.$$handleEvent = handlers[i];

if (this.$$handleEvent(event) === false) { returnValue = false; } }

return returnValue;};

function fixEvent(event) {

event.preventDefault = fixEvent.preventDefault; event.stopPropagation = fixEvent.stopPropagation; return event;};

fixEvent.preventDefault = function() { this.returnValue = false;};

fixEvent.stopPropagation = function() { this.cancelBubble = true;};

以上代码由是有 Dean EdwardsaddEvent/removeEven5、跨浏览器的⽅法⼆:

function addEvent( obj, type, fn ) { if ( obj.attachEvent ) { obj['e'+type+fn] = fn;

obj[type+fn] = function(){obj['e'+type+fn]( window.event );} obj.attachEvent( 'on'+type, obj[type+fn] ); } else

obj.addEventListener( type, fn, false );}

function removeEvent( obj, type, fn ) { if ( obj.detachEvent ) {

obj.detachEvent( 'on'+type, obj[type+fn] ); obj[type+fn] = null; } else

obj.removeEventListener( type, fn, false );}

另外,事件流可分为冒泡型事件和捕获型事件,HTML元素⼤都包含了⾃⼰的默认⾏为,例如:超链接、提交按钮等。我们可以通过在绑定事件中加上\"return false\"来阻⽌它的默认⾏为。感兴趣的拼⾳可参考本站上的相关介绍。PS:这⾥再为⼤家附上javascript系统⾃带事件参考表供⼤家参考查询:

更多关于JavaScript相关内容可查看本站专题:《》、《》、《》、《》、《》及《》希望本⽂所述对⼤家JavaScript程序设计有所帮助。

因篇幅问题不能全部显示,请点此查看更多更全内容

Copyright © 2019- banwoyixia.com 版权所有 湘ICP备2023022004号-1

违法及侵权请联系:TEL:199 1889 7713 E-MAIL:2724546146@qq.com

本站由北京市万商天勤律师事务所王兴未律师提供法律服务