JavaScript 浏览器中的Event

一、Event对象

  1. type:发生事件的类型,JS支持的事件类型非常多,大致可以分为以下几类:

    • 设备无关输入事件:这类事件和特定输入设备相关;例如mousemove、keydown、touchmove等;

    • 设备相关输入事件:这类事件并不与特定输入设备相关,它可以由多种设备触发;例如:click既可以由鼠标触发也可以由触屏触发;

    • 用户界面事件:通常定义在应用界面的表单元素上触发,这类事件包括:focus、change和submit

    • 状态变化事件:有些事件并不直接由用户活动触发,而是由网络或者浏览器触发;例如:window的onload、online、popstate等事件

    • API特定事件:有一些HTML及相关规范定义的WebAPI包含自己的事件类型;例如:video和audio元素定义了一系列事件(waiting、playing、seeking等)

  2. target:发生事件的对象

  3. currentTarget:对于传播的事件,这个属性是注册当前事件处理程序的对象

  4. timeStamp:表示事件发生时间的时间戳(毫秒),不是绝对时间

  5. isTrusted:表示这个事件是否是由浏览器自身触发,如是,则这个属性为true,如果是JS触发,这个属性为false

二、事件处理函数注册

事件处理函数注册可以通过两种方式:

  • 第一种是直接设置事件处理程序,按照惯例所有的事件处理程序属性都是由on加事件名组成,并全部为小写,例如:onclick、onchange

  • 第二种是使用addEventListener注册目标对象(EventTarget)的事件处理程序

    target. addEventListener(type, listener, options)

    • type(String):事件类型

    • listener(Function):事件处理函数

    • options(Object,可选):可选参数对象

      • capture: Boolean,默认为false,表示 listener 会在该类型的事件捕获阶段传播到该 EventTarget 时触发。

      • once: Boolean,默认为false,表示 listener 在添加之后最多只调用一次。如果是 true, listener 会在其被调用之后自动移除。

      • passive:Boolean,默认为false,设置为true时,表示 listener 永远不会调用 preventDefault()

    addEventListener还有一种简写方式,可以使用capture直接作为options传入,即addEventListener(target, listener, true)

    注意:使用onclick只能注册一个事件处理函数,而使用addEventListener可以注册多个事件处理函数,并且onclick注册的事件处理函数与addEventListener注册的事件处理函数互不影响,没有直接的关联,并按照注册的顺序执行

    三、移除事件处理函数

    移除事件处理函数与注册相对应,有两种对应方式:

    • 对于直接设置的处理函数,可以用null覆盖处理函数,例如可以直接设置target.onclick = null,来移除原本traget上的click的处理函数;

    • 对于addEventListener注册的处理函数,使用使用removeEventListener来移除,同样的,removeEventListener也接收三个参数,typelisteneroptions,不同的是options只有capture一个选项,值得注意的是,若注册时capture设置为true,那么在remove是也需要设置为true。

    四、事件处理上下文

    事件触发时调用事件处理程序的方式:

    target.handler()

    其中,target为事件目标,handler为事件处理程序,熟悉this自然就能判断这里的上下文了,这里就不再做过多解释。

    五、事件传播

    如果事件的目标是window或者其它独立对象,浏览器对这个事件的响应就是简单的调用该对象上对应的事件处理函数(也就是前面说的第一种添加事件的方式添加的处理函数,后续用onevent代替,例如:onclick),如果事件目标是Document或者其它文档元素,那么事件会经历以下三个阶段(可以参考这个例子结合理解):

    1. 捕获阶段,在onevent触发之前,事件会从上(根元素,window对象)至下(子元素)传递,此过程中,通过addEventListener注册的并且capture设置为true的处理函数将会被调用;

    2. 调用onevent

    3. 冒泡阶段,多数事件都会“冒泡”,冒泡阶段事件会从子元素向上传播,一直到document对象,最后到window对象(除了focus、blur和scroll事件,document的load事件会冒泡,但到Document就会停止冒泡,不会到达window对象),在冒泡的过程中父元素的onevent和通过addEventListener注册的并且capture设置为false的处理函数会先后被调用。

    六、事件取消

    浏览器会对很多用户事件作出响应,无论你是否有在代码中指定,比如,用户在一个链接上单击鼠标,浏览器就会打开这个链接。

    对于某些场景,如果想阻止这些默认动作,可以在使用addEventListener添加事件处理函数时,将options中的passive设置为true,也可以重新注册一个事件处理函数,在其中调用preventDefault()函数。

    亦或者,你想取消事件的传播,可以使用stopPropagation,取消事件出波,但是,这个对象上其它的处理函数依然会被调用,如果不想触发这些函数,可以使用stopImmediatePropagation。

    七、派发自定义事件

    在某些情况下我们可能需要手动触发某个事件或者自定义一个事件,这时我们就可以自己创建一个Event或者CustomEvent,然后调用dispatchEvent方法派发这个事件,可以看下面的例子

    <input />
    <script>
    const event = new Event('input');
    const element = document.querySelector('input');
    element.addEventListener('input', () => {
      console.log('input');
    })
    element.value = '123'; // 此语句不会触发input事件
    element.dispatchEvent(event);

     const customEvent = new CustomEvent('ohhh', {
       detail: { msg: '野炊2要出了!' }
    })
     element.addEventListener('ohhh', (e) => {
       console.log('ohhh');
       console.log(e.detail.msg);
    });
     element.dispatchEvent(customEvent);
    </script>

在创建CustomEvent时,可以设置detail属性,传递事件相关的信息,具体的使用方法可以参见CustomEvent()-MDN

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 218,546评论 6 507
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,224评论 3 395
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 164,911评论 0 354
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,737评论 1 294
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,753评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,598评论 1 305
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,338评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,249评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,696评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,888评论 3 336
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,013评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,731评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,348评论 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,929评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,048评论 1 270
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,203评论 3 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,960评论 2 355

推荐阅读更多精彩内容