本⽂实例讲述了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
本站由北京市万商天勤律师事务所王兴未律师提供法律服务