事件

作者: 李霖弢 | 来源:发表于2019-08-12 16:05 被阅读0次

当dom元素被删除时,其绑定的事件也会消失

addEventListener

目前第三个参数可以为布尔值或对象

addEventListener(type, listener[, useCapture ])
addEventListener(type, listener[, options ])

为对象时默认配置如下

  1. capture: false
  2. passive: false
  3. once: false

其中 capture 属性等价于以前的 useCapture 参数;once 属性就是表明该监听器是一次性的,执行一次后就被自动 removeEventListener 掉。
passive是因为浏览器无法预先知道一个监听器会不会调用 preventDefault(),只有等监听器执行完后再去执行默认行为,因此就会导致页面卡顿。而一旦passive为true,浏览器就可以直接执行默认行为而不等待。此时即使调用了 preventDefault() 也不会生效。

阻止冒泡

function myfn(e){//前者为IE,后者为W3C
  window.event? window.event.cancelBubble = true : e.stopPropagation();
}

在JQ中也可以直接使用return false;

阻止默认行为

function myfn(e){//前者为IE,后者为W3C
  window.event? window.event.returnValue = false : e.preventDefault();
}

或直接用return false;

mouseover 和 mouseenter 区别

不论鼠标指针穿过事件绑定元素或其子元素,都会触发 mouseover 事件。mouseout同理。
只有在鼠标指针穿过事件绑定元素时,才会触发 mouseenter 事件。mouseleave同理。

移动端 touch 和 click 区别

移动端点击后依次触发:touchstart => touchmove => touchend => click
其中触碰后未移动或移动距离很小,则会在触碰结束后触发click事件,但click事件会有300ms延迟(为了等待用户手势操作)。可以引入Fastclick.js来解决这个问题。它会在检测到touchend事件时通过 DOM 自定义事件立即触发一个模拟click事件,并把浏览器在 300 毫秒之后真正触发的click事件阻止掉(touchstart事件回调中使用preventDefault可以避免触发click)。

点击穿透问题

由于click事件延迟300ms触发,在该期间内如果页面发生变化,原本触发touch事件的元素所在位置已被其他元素代替,则由该新元素触发click事件。

Event对象中,target和currentTarget的区别

e.currentTarget指向事件直接绑定的元素(如事件委托时的父元素),而target指向当前事件真正被触发的位置(如事件委托时的子元素)

该特性可用于事件委托时,只对父元素添加事件监听,而通过target的不同确定到底是哪一个子元素触发的事件。

onfocus 与 onblur

form类标签本身支持onfocus与onblur
其他标签可以添加tabindex属性,以支持onfocus与onblur
页面也可以通过window.onblurwindow.onfocus监听是否失去焦点

自定义事件

创建事件

普通的事件使用new Event即可创建,并可通过initEvent方法编辑事件

let event = new Event("ev");
//event.initEvent('ev', true, true);

但如果需要为事件传入detail信息,则需要使用new CustomEvent,并可通过initCustomEvent方法编辑事件

let event = new CustomEvent("newMessage", {
    detail: {// 数据将会在EventListener的event.detail中得到
        message: 1,
    },
    bubbles: true,
    cancelable: true
});
//event.initCustomEvent('ev', true, true, {message: 2});

还可以通过createEvent方法创建事件,通过此方法创建的事件必须经过initEventinitCustomEvent初始化后才能发布

let event = document.createEvent('CustomEvent');
//event.initCustomEvent('ev', true, true, {message: 2});
//event.initEvent('ev', true, true);
触发事件
element.dispatchEvent(event);
监听事件

当一个事件触发的时候,如果相应的element及其上级元素没有对应的EventListener,就不会有任何回调操作。

document.addEventListener("newMessage",  function(e) {
  ...
})

相关文章

  • JavaScript事件01——事件流

    大纲:概念(事件、事件流)事件流模型(事件冒泡、事件捕获、DOM事件流) 一、概念: 1、事件:事件就是用户或浏览...

  • 事件对象,事件监听,事件冒泡,事件代理

    一、事件对象 二、冒泡事件:(事件从子元素往父级元素向上触发事件)处理兼容问题:主流浏览器:e.stopPropa...

  • 事件总结

    DOM事件主要内容 事件流 事件注册 事件对象 事件分类 事件代理 什么是DOM事件? 事件是某个行为或者触发,比...

  • Javascript事件系统

    本文内容 事件基础 事件监听方式 事件默认行为 事件冒泡与事件捕获 事件绑定与事件委托 事件基础 注意:本文不会深...

  • Javascript事件-事件冒泡,事件捕获,事件监听和事件委托

    事件处理机制 (一)DOM事件流 DOM模型是一个树形结构,在DOM模型中,HTML元素是有层次的。当一个HTML...

  • 【事件】事件流

    1、JavaScript和HTML之间的交互通过事件实现的。2、事件流描述的是从页面中接收事件的顺序。3、IE 和...

  • 【事件】事件对象

    触发DOM上的某个事件时,会产生一个事件对象event,这个对象中包含着所有与事件有关的额信息。(包括导致事件的元...

  • 【事件】事件类型

    DOM3 级事件规定了以下几类事件: UI(User Interface,用户界面)事件,当用户与页面上的元素交互...

  • 2018-09-10JQuery高级应用

    JQuery事件 window事件 鼠标事件 键盘事件 表单事件 事件注册语法$(对象).type(fn)type...

  • JS事件

    ?事件的相关术语 事件类型: 鼠标事件、键盘事件事件名称: click、dbclick等事件目标: 表示与发生事件...

网友评论

      本文标题:事件

      本文链接:https://www.haomeiwen.com/subject/lrmujctx.html