JavaScript-事件对象

本文深入解析了事件对象的属性和方法,包括bubbles、cancelable、currentTarget、defaultPrevented等,探讨了事件的冒泡与捕获机制,并提供了跨浏览器的事件处理策略。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

触发某个事件时会产生一个事件对象event,这个对象中包含着所有与事件有关的信息。

  • 事件的元素
  • 事件的类型
  • 其它与事件相关的信息

所有浏览器都支持event对象,但存在差异。

event对象在标准的现代浏览器中会作为参数传入到事件的事件处理函数。

DOM中的事件对象

属性/方法类型读写说明
bubblesBoolean只读表明事件是否支持冒泡
cancelableBoolean只读表明是否可以取消默认行为
currentTargetElement只读表明事件处理程序当前正在处理事件的那个元素
defaultPreventedBoolean只读为true表示已经调用了下面的preventDefault()
detailInt只读与事件相关的细节信息
eventPhaseInt只读触发事件处理程序的阶段:1表示捕获,2表示处于目标,3表示冒泡
preventDefault()Function——取消事件的默认行为,前提条件是cancelable属性为true
stopImmediatePropagation()Function——取消事件的进一步捕获或冒泡,同时阻止任何(其他的)事件处理程序被调用
stopPropagation()Function——立即停止事件在DOM中的传播,取消进一步的时间捕获或冒泡,前提条件是:bubbles属性为true
targetElement只读事件的目标元素
trustedBoolean只读为true表示是浏览器生成的,为false表示是开发人员自定义的事件
typeString只读被触发的事件类型
viewAbstractView只读与事件相关的抽象视图,等于发生事件的window对象
  1. 在HTML事件处理程序时:变量event(固定)中保存着event对象,无需主动声明,也无需以参数形式传入:
    <input type="button" value="click me" onclick="alert(event.type)">

     

  2. 在DOM 0 级和DOM 2 级事件处理程序中,event对象会以参数的形式传入事件处理函数中;

  3. event对象的基本属性和方法见上面的表格,各个不同类型的事件扩展的属性和方法各不相同;

  4. 在事件处理程序内部,对象this的值始终等于currentTarget的值;


     

    target属性是(同心圆)靶心,this和currentTarget是你击中的最大点数环(同心圆);


     

  5. target是事件在DOM同心圆蔓延的终点;

  6. stopPropagation()用法实例:

    var btn = document.getElementById('myBtn');
    
    btn.onclick = function(event){
        alert('clicked!');
        event.stopPropagation();
    }
    
    document.body.onclick = function(event){
        alert('body clicked');
    }

     

  7. 只有在eventPhase为2(目标阶段时)this=currentTarget和target才相等;

  8. 只有在事件处理程序执行期间,event对象才存在,一旦事件处理程序执行完毕,event对象就会被销毁。

IE中的事件对象

属性/方法类型读/写说明
cancelBubbleBoolean读/写表示是否(默认否)取消事件冒泡(类似DOM中的stopPropagation()方法)
returnValueBoolean读/写设为false表示取消事件的默认行为(类似DOM中的preventDefault)
srcElementElement只读事件的目标元素(类似DOM中的target属性)
typeString只读被触发的事件类型
  1. IE中访问event对象的方式与现代浏览器DOM中访问event对象的方式不同;
  2. IE下的DOM 0 级事件:event对象作为window对象的一个属性存在,而不用将event作为处理函数的参数传入:
    var btn = getElement('#myBtn');
    
    btn.onclick = function(){
        var event = window.event;
        alert(event.type);  // 'click'
    }
     
  3. HTML特性指定事件处理程序时,在处理函数中直接通过一个event变量访问event对象;
  4. attachEvent()指定事件处理程序时,访问event对象有两种方法:
    event对象作为window对象的属性被访问;
    event对象作为参数传入事件处理函数
  5. 低版本IE不支持事件捕获,只支持事件冒泡;使用cancelBubble = true可以阻止事件继续冒泡:
    var btn = document.getElementById('myBtn');
    
    btn.onclick = function(event){
        alert('clicked');
        window.event.cancelBubble = true;
    }
    
    document.body.onclick = function(event){
        alert('body clicked');
    }
    
    // DOM 0 级事件是冒泡阶段触发,所以此例中body上的绑定事件无法有btn上的click冒泡触发
     

跨浏览器的事件对象

var eventUtil = {
    addEventHandler: function(element, type, handler) {
        if (element.addEventListener) {
            element.addEventListener(type, handler, false);
        } else if (element.attachEvent) {
            element.attachEvent('on' + type, handler);
        } else {
            element['on' + type] = handler;
        }
    },

    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.returnValue = false;
        }
    },

    stopPropagation: function(event) {
        if (event.stopPropagation) {
            event.stopPropagation;
        } else {
            event.cancelBubble = true;
        }
    },

    removeEventHandler: 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;
        }
    }
};

由于IE不支持事件捕获,因此以上浏览器的事件对象中的preventDefault()只能阻止事件冒泡!

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

mannuandeyangguang

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值