当Element节点或选中的文本被拖拽时,就会持续触发拖拽事件,包括以下一些事件:
drag事件: 拖拽过程中,在被拖拽的节点上持续触发。
dragstart事件: 拖拽开始时在被拖拽的节点上触发,该事件的target属性是被拖拽的节点。通常应该在这个事件的监听函数中,指定拖拽的数据。
dragend事件: 拖拽结束时(释放鼠标键或按下escape键)在被拖拽的节点上触发,该事件的target属性是被拖拽的节点。它与dragStart事件,在同一个节点上触发。不管拖拽是否跨窗口,或者中途被取消,dragend事件总是会触发的。
dragenter事件: 拖拽进入当前节点时,在当前节点上触发,该事件的target属性是当前节点。通常应该在这个事件的监听函数中,指定是否允许在当前节点放下(drop)拖拽的数据。如果当前节点没有该事件的监听函数,或者监听函数不执行任何操作,就意味着不允许在当前节点放下数据。在视觉上显示拖拽进入当前节点,也是在这个事件的监听函数中设置。
dragover事件: 拖拽到当前节点上方时,在当前节点上持续触发,该事件的target属性是当前节点。该事件与dragenter事件基本类似,默认会重置当前的拖拽事件的效果(DataTransfer对象的dropEffect属性)为none,即不允许放下被拖拽的节点,所以如果允许在当前节点drop数据,通常会使用preventDefault方法,取消重置拖拽效果为none。
dragleave事件: 拖拽离开当前节点范围时,在当前节点上触发,该事件的target属性是当前节点。在视觉上显示拖拽离开当前节点,就在这个事件的监听函数中设置。
drop事件: 被拖拽的节点或选中的文本,释放到目标节点时,在目标节点上触发。注意,如果当前节点不允许drop,即使在该节点上方松开鼠标键,也不会触发该事件。如果用户按下Escape键,取消这个操作,也不会触发该事件。该事件的监听函数负责取出拖拽数据,并进行相关处理。
关于拖拽事件,有以下几点注意事项:
拖拽过程只触发以上这些拖拽事件,尽管鼠标在移动,但是鼠标事件不会触发。
将文件从操作系统拖拽进浏览器,不会触发 dragStart 和 dragend 事件。
dragenter 和 dragover 事件的监听函数,用来指定可以放下(drop)拖拽的数据。由于网页的大部分区域不适合作为 drop 的目标节点,所以这两个事件的默认设置为当前节点不允许 drop。如果想要在目标节点上 drop 拖拽的数据,首先必须阻止这两个事件的默认行为,或者取消这两个事件。
1 2 3 |
|
拖拽事件用一个 DragEvent 对象表示,该对象继承 MouseEvent 对象,DragEvent 对象只有一个独有的属性 dataTransfer,其他都是继承的属性。dataTransfer 属性用来读写拖拽事件中传输的数据,所有的拖拽事件都有一个 dataTransfer 属性,用来保存需要传递的数据,这个属性的值是一个 DataTransfer 对象。拖拽的数据保存两方面的数据: 数据的种类(又称格式)和数据的值。数据的种类是一个MIME字符串,比如 text/plain 或者 image/jpg,数据的值是一个字符串;
dataTransfer 对象的属性的值是一个对象,其中包括以下属性:
dropEffect 属性: 设置放下(drop)被拖拽节点时的效果,可能的值包括 copy(复制被拖拽的节点), move(移动被拖拽的节点), link(创建指向被拖拽的节点的链接), none(无法放下被拖拽的节点)。设置除此以外的值,都是无效的。
effectAllowed 属性: 设置本次拖拽中允许的效果,可能的值包括 copy, move, link, copyLink, copyMove, linkMove, all, none, uninitialized(默认值,等同于 all)。如果某种效果是不允许的,用户就无法在目标节点中达成这种效果。
files 属性: 是一个 FileList 对象,包含一组本地文件,可以用来在拖拽操作中传送。如果本次拖拽不涉及文件,则属性为空的 FileList 对象。通过files属性读取拖拽文件的信息。如果想要读取文件内容,就要使用 FileReader 对象。
types 属性: 是一个数组,保存每一次拖拽的数据格式,如'text/uri-list'
setData() 方法: 用来设置事件所带有的指定类型的数据。它接受两个参数,第一个是数据类型,第二个是具体数据。如果指定的类型在现有数据中不存在,则该类型将写入types属性;如果已经存在,在该类型的现有数据将被替换。
1 |
|
getData() 方法接受一个字符串(表示数据类型)作为参数,返回事件所带的指定类型的数据(通常是用 setData 方法添加的数据)。如果指定类型的数据不存在,则返回空字符串。
1 |
|
clearData() 方法接受一个字符串(表示数据类型)作为参数,删除事件所带的指定类型的数据。如果没有指定类型,则删除所有数据。如果指定类型不存在,则原数据不受影响。
1 |
|
setDragImage() 可以用来自定义这张图片,它接受三个参数,第一个是img图片元素或者canvas元素,如果省略或为null则使用被拖动的节点的外观,第二个和第三个参数为鼠标相对于该图片左上角的横坐标和右坐标。
1 |
|
触摸事件
1 |
|
触摸事件包括以下5种:
touchstart: 用户接触触摸屏时触发,它的 target 属性返回发生触摸的 Element 节点(IE10+中使用 mspointerdown 事件);
touchend: 用户不再接触触摸屏时(或者移出屏幕边缘时)触发,它的 target 属性与 touchstart 事件的 target 属性是一致的,它的 changedTouches 属性返回一个TouchList对象,包含所有不再触摸的触摸点(Touch对象)(IE10+中使用 mspointerup 事件);
touchmove: 用户移动触摸点时触发,它的 target 属性与 touchstart 事件的 target 属性一致。如果触摸的半径, 角度, 力度发生变化,也会触发该事件。(IE10+中使用 mspointermove 事件);
touchenter: 当触点进入某个 element 时触发。此事件没有冒泡过程。(IE10+中使用 mspointerover 事件);
touchleave: 当触点离开某个 element 时触发。此事件没有冒泡过程。(IE10+中使用 mspointerout 事件);
touchcancel: 当触点由于某些原因被中断时触发。有几种可能的原因如下(具体的原因根据不同的设备和浏览器有所不同):(IE10+中没有对应事件);
由于某个事件取消了触摸: 例如触摸过程被一个模态的弹出框或电话打断;
触点离开了文档窗口,而进入了浏览器的界面元素, 插件或者其他外部内容区域;
当用户产生的触点个数超过了设备支持的个数,从而导致 TouchList 中最早的 Touch 对象被取消。
触摸 API 由三个对象组成。每个 Touch 对象代表一个触点; 每个触点都由其位置,大小,形状,压力大小,和目标 element 描述。 TouchList 对象代表多个触点的一个列表。具体包括以下属性:
identifier 属性: 表示touch实例的独一无二的识别符。它在整个触摸过程中保持不变(IE10+中使用 pointerId 属性);
screenX/screenY 属性: 分别表示触摸点相对于屏幕左上角的横坐标和纵坐标,与页面是否滚动无关;
clientX/clientY 属性: 分别表示触摸点相对于浏览器视口左上角的横坐标和纵坐标,与页面是否滚动无关;
pageX/pageY 属性: 分别表示触摸点相对于当前页面左上角的横坐标和纵坐标,包含了页面滚动带来的位移;
radiusX/radiusY 属性: 分别返回触摸点周围受到影响的椭圆范围的X轴和Y轴,单位为像素;
rotationAngle 属性: 表示触摸区域的椭圆的旋转角度,单位为度数,在0到90度之间。指尖接触屏幕,触摸范围会形成一个椭圆,这三个属性就用来描述这个椭圆区域(IE10+中使用 rotation 属性);
force 属性: 返回一个0到1之间的数值,表示触摸压力。0代表没有压力,1代表硬件所能识别的最大压力(IE10+中使用 pressure 属性,取值0 - 255);
target 属性: 返回一个Element节点,代表触摸发生的那个节点。当这个触点最开始被跟踪时(在 touchstart 事件中), 触点位于的HTML元素.哪怕在触点移动过程中, 触点的位置已经离开了这个元素的有效交互区域, 或者这个元素已经被从文档中移除. 需要注意的是, 如果这个元素在触摸过程中被移除, 这个事件仍然会指向它, 但是不会再冒泡这个事件到 window 或 document 对象. 因此, 如果有元素在触摸过程中可能被移除, 最佳实践是将触摸事件的监听器绑定到这个元素本身, 防止元素被移除后, 无法再从它的上一级元素上侦测到从该元素冒泡的事件. 只读属性.
altKey/ctrlKey/metaKey/shiftKey 都为只读属性: 返回一个布尔值,表示触摸的同时,是否按下某个键
changedTouches 属性: 返回一个 TouchList 对象,包含了由当前触摸事件引发的所有Touch对象(即相关的触摸点)。它包含了代表所有从上一次触摸事件到此次事件过程中,状态发生了改变的触点的 Touch 对象。只读属性。
targetTouches属性: 返回一个 TouchList 对象,包含了触摸的目标 Element 节点内部,所有仍然处于活动状态的触摸点。
touches 属性返回一个 TouchList 对象(类数组的对象),包含了所有当前接触触摸平面的触点的 Touch 对象,无论它们的起始于哪个 element 上,也无论它们状态是否发生了变化。只读属性
type 属性: 指此次触摸事件的类型。
target属性: 此次触摸事件的目标 element 。这个目标元素对应 TouchEvent.changedTouches 中的触点的起始元素(在之后的事件类型中有说明),但是请注意: 此次事件中其他的触点的起始元素可能有所不同。以防万一,应使用和每一个单独触点相关联的目标 。
以下是 IE10+ 中的其他属性:
hwTimestamp: 创建事件时间(毫秒);
isPrimary: 表示该时间是否是主事件;
pointerType: 取值自 event.MSPOINTER_TYPE_TOUCH, event.MAPOINTER_TYPE_PEN, event.MSPOINTER_TYPE_MOUSE, 表示触摸设备;
tilt[X|Y]: 笔的倾斜程度;
举一个简单例子:
1 2 3 4 5 6 7 8 9 |
|
对于跨平台交互,我封装了一个 tap相关事件如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
|
当然本文仅仅列举了一些常用事件,其实事件还有很多,本文会在必要的时候继续更新,但即便如此也不可能穷尽所有的事件,比如还有动画事件: animationstart, animation, animationend 等等。
相关推荐:
解析javascript 浏览器关闭事件_javascript技巧
JavaScript中的跨浏览器事件(图文教程)
以上就是浏览器中5种常用的事件解析的详细内容,更多文章请关注木庄网络博客!
相关阅读 >>
深入浅析 promise 比 settimeout() 快的原因
HTML5 navigator.geolocation基于浏览器获取地理位置代码案例
更多相关阅读请进入《HTML5》频道 >>

Vue.js 设计与实现 基于Vue.js 3 深入解析Vue.js 设计细节
本书对 Vue.js 3 技术细节的分析非常可靠,对于需要深入理解 Vue.js 3 的用户会有很大的帮助。——尤雨溪,Vue.js作者