浏览器中5种常用的事件解析


当前第2页 返回上一页

当Element节点或选中的文本被拖拽时,就会持续触发拖拽事件,包括以下一些事件:

  1. drag事件: 拖拽过程中,在被拖拽的节点上持续触发。

  2. dragstart事件: 拖拽开始时在被拖拽的节点上触发,该事件的target属性是被拖拽的节点。通常应该在这个事件的监听函数中,指定拖拽的数据。

  3. dragend事件: 拖拽结束时(释放鼠标键或按下escape键)在被拖拽的节点上触发,该事件的target属性是被拖拽的节点。它与dragStart事件,在同一个节点上触发。不管拖拽是否跨窗口,或者中途被取消,dragend事件总是会触发的。

  4. dragenter事件: 拖拽进入当前节点时,在当前节点上触发,该事件的target属性是当前节点。通常应该在这个事件的监听函数中,指定是否允许在当前节点放下(drop)拖拽的数据。如果当前节点没有该事件的监听函数,或者监听函数不执行任何操作,就意味着不允许在当前节点放下数据。在视觉上显示拖拽进入当前节点,也是在这个事件的监听函数中设置。

  5. dragover事件: 拖拽到当前节点上方时,在当前节点上持续触发,该事件的target属性是当前节点。该事件与dragenter事件基本类似,默认会重置当前的拖拽事件的效果(DataTransfer对象的dropEffect属性)为none,即不允许放下被拖拽的节点,所以如果允许在当前节点drop数据,通常会使用preventDefault方法,取消重置拖拽效果为none。

  6. dragleave事件: 拖拽离开当前节点范围时,在当前节点上触发,该事件的target属性是当前节点。在视觉上显示拖拽离开当前节点,就在这个事件的监听函数中设置。

  7. drop事件: 被拖拽的节点或选中的文本,释放到目标节点时,在目标节点上触发。注意,如果当前节点不允许drop,即使在该节点上方松开鼠标键,也不会触发该事件。如果用户按下Escape键,取消这个操作,也不会触发该事件。该事件的监听函数负责取出拖拽数据,并进行相关处理。

关于拖拽事件,有以下几点注意事项:

  1. 拖拽过程只触发以上这些拖拽事件,尽管鼠标在移动,但是鼠标事件不会触发。

  2. 将文件从操作系统拖拽进浏览器,不会触发 dragStart 和 dragend 事件。

  3. dragenter 和 dragover 事件的监听函数,用来指定可以放下(drop)拖拽的数据。由于网页的大部分区域不适合作为 drop 的目标节点,所以这两个事件的默认设置为当前节点不允许 drop。如果想要在目标节点上 drop 拖拽的数据,首先必须阻止这两个事件的默认行为,或者取消这两个事件。

1

2

3

<p ondragover="return false">

//或

<p ondragover="event.preventDefault()">

  1. 拖拽事件用一个 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

event.dataTransfer.setData("text/plain", "Text to drag");

  • getData() 方法接受一个字符串(表示数据类型)作为参数,返回事件所带的指定类型的数据(通常是用 setData 方法添加的数据)。如果指定类型的数据不存在,则返回空字符串。

1

event.dataTransfer.getData(types[0]);

  • clearData() 方法接受一个字符串(表示数据类型)作为参数,删除事件所带的指定类型的数据。如果没有指定类型,则删除所有数据。如果指定类型不存在,则原数据不受影响。

1

event.dataTransfer.clearData("text/uri-list");

  • setDragImage() 可以用来自定义这张图片,它接受三个参数,第一个是img图片元素或者canvas元素,如果省略或为null则使用被拖动的节点的外观,第二个和第三个参数为鼠标相对于该图片左上角的横坐标和右坐标。

1

event.dataTransfer.setDragImage(img, 0, 0);

触摸事件

1

new Touch(touchInit);

触摸事件包括以下5种:

  1. touchstart: 用户接触触摸屏时触发,它的 target 属性返回发生触摸的 Element 节点(IE10+中使用 mspointerdown 事件);

  2. touchend: 用户不再接触触摸屏时(或者移出屏幕边缘时)触发,它的 target 属性与 touchstart 事件的 target 属性是一致的,它的 changedTouches 属性返回一个TouchList对象,包含所有不再触摸的触摸点(Touch对象)(IE10+中使用 mspointerup 事件);

  3. touchmove: 用户移动触摸点时触发,它的 target 属性与 touchstart 事件的 target 属性一致。如果触摸的半径, 角度, 力度发生变化,也会触发该事件。(IE10+中使用 mspointermove 事件);

  4. touchenter: 当触点进入某个 element 时触发。此事件没有冒泡过程。(IE10+中使用 mspointerover 事件);

  5. touchleave: 当触点离开某个 element 时触发。此事件没有冒泡过程。(IE10+中使用 mspointerout 事件);

  6. touchcancel: 当触点由于某些原因被中断时触发。有几种可能的原因如下(具体的原因根据不同的设备和浏览器有所不同):(IE10+中没有对应事件);

    1. 由于某个事件取消了触摸: 例如触摸过程被一个模态的弹出框或电话打断;

    2. 触点离开了文档窗口,而进入了浏览器的界面元素, 插件或者其他外部内容区域;

    3. 当用户产生的触点个数超过了设备支持的个数,从而导致 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

function handleMove(evt) {

  evt.preventDefault(); // 阻止浏览器继续处理触摸事件,也阻止发出鼠标事件

  var touches = evt.changedTouches;

  for (var i = 0; i < touches.length; i++) {

    var id = touches[i].identifier;

    var touch = touches.identifiedTouch(id);

    console.log(touch.pageX, touch.pageY);

  }

}

对于跨平台交互,我封装了一个 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

//以下代码并未兼容低版本 IE

function addTapListener(node, callback){

  var startEvent = window.onmousedown ? window.onmspointerdown ? 'mspointerdow' : 'mousedown' : 'touchstart';

  var event = window.onclick ? 'click' : 'touch';

  var endEvent = window.onmouseup ? 'mouseup' : 'touchend';

 

  node.addEventListener(startEvent, function(e){

    var tap = document.createEvent('CustomEvent');

    tap.initCustomEvent('tapstart', true, true, null);

    node.dispatchEvent(tap);

  });

  node.addEventListener(event, function(e){

    var tap = document.createEvent('CustomEvent');

    tap.initCustomEvent('tap', true, true, null);

    node.dispatchEvent(tap);

  });

  node.addEventListener(endEvent, function(e){

    var tap = document.createEvent('CustomEvent');

    tap.initCustomEvent('tapend', true, true, null);

    node.dispatchEvent(tap);

  });

 

  node.addEventListener('tap', callback);

}

当然本文仅仅列举了一些常用事件,其实事件还有很多,本文会在必要的时候继续更新,但即便如此也不可能穷尽所有的事件,比如还有动画事件: animationstart, animation, animationend 等等。

相关推荐:

解析javascript 浏览器关闭事件_javascript技巧

JavaScript中的跨浏览器事件(图文教程)

以上就是浏览器中5种常用的事件解析的详细内容,更多文章请关注木庄网络博客

返回前面的内容

相关阅读 >>

javascript实现递归算法的方法介绍

HTML5 canvas实现瀑布流文字效果代码

用h5制作水滴特效教程

怎么学HTML5

javascript常见几种的内存泄漏

深入浅析 promise 比 settimeout() 快的原因

html中strong用法是什么

解决在HTML5中的video标签无法播放视频的方法

HTML5 navigator.geolocation基于浏览器获取地理位置代码案例

html 5之新增的特性该如何使用

更多相关阅读请进入《HTML5》频道 >>




打赏

取消

感谢您的支持,我会继续努力的!

扫码支持
扫码打赏,您说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦

分享从这里开始,精彩与您同在

评论

管理员已关闭评论功能...