网页元素的滑动事件(三)
来源:互联网 发布:淘宝上的众筹是真的吗 编辑:程序博客网 时间:2024/06/17 13:08
除了触控手势支持,鼠标拖拽自然也不能少。
针对鼠标拖拽的支持,我们还需要做一些准备工作。我们需要有一套方案来获得当前鼠标的位置,具体方案如下。
- 先看看事件参数中是否包含了当前鼠标所处的坐标。如果有,那么好极了,我们直接用;否则继续下一步操作。
- 获取当前页面滚动的位置,以及鼠标相对于页面可视区域的位置,然后相加。
另外,作为一个与本文主题无关的改进,你也可以增加获得触控时的位置,可通过获取事件参数来获得。
最终代码如下,我们将其封装成一个函数。
/** * Gets the position of the mouse in document. */function getMousePosition() { // Resolve mouse position. var x = event.pageX || (event.clientX + (document.documentElement.scrollLeft || document.body.scrollLeft)); var y = event.pageY || (event.clientY + (document.documentElement.scrollTop || document.body.scrollTop)); // Resolve touch position. var evTouches = event.touches; if (!!evTouches && !!evTouches.length && evTouches.length > 0 && !!evTouches[0]) { if (isNaN(x) || x == null) x = evTouches[0].pageX; if (isNaN(y) || y == null) y = evTouches[0].pageX; } else { evTouches = event.changedTouches; if (!!evTouches && !!evTouches.length && evTouches.length > 0 && !!evTouches[0]) { if (isNaN(x) || x == null) x = evTouches[0].pageX; if (isNaN(y) || y == null) y = evTouches[0].pageX; } } // Return result as a coordinate. return { x: x, y: y };}
好了,让我们回到一开始写的添加滑动事件的函数。
function addSlide(element, options) { // Validate arguments... // Resolve element... // Touch supports... // ToDo: Implement it. return null;}
我们需要继续实现鼠标拖拽支持。
首先,还是让我们了解一下浏览器对鼠标拖拽的事件响应机制。
- 触发一个鼠标按下事件。
- 触发一系列的鼠标移动事件。
- 触发一个鼠标按键松开事件。
这整个流程会在最终用户按住鼠标直至松开时所触发的。因此,我们可以了解到,一切都是基于鼠标按下开始。所以,我们要实现的功能都在这里面。当然,这其中也包括,在按下鼠标按键时,要先记录下当前鼠标所在位置。
var mouseDown = function (ev) { var mStartP = getMousePosition(); // ToDo: Implement it.};ele.addEventListener("mousedown", mouseDown, false);
在获取位置后,我们要注册鼠标移动时的事件了。
var mouseMove = function (ev) { var mCurP = getMousePosition(); var x = mCurP.x - mStartP.x; var y = mCurP.y - mStartP.y; options.moving(ele, x, y);};document.body.addEventListener("mousemove", mouseMove, false);
在松开鼠标按键时,我们需要调用滑动结束和翻动的方法。同时,我们还需要注销这两个鼠标移动和鼠标按键松开的事件;否则,松开鼠标按键后依然还会触发这些事件,这就不是我们期待的了。为了能够实现这一点,我们需要一个事件列表,然后实现一个方法去执行这个列表,在执行前,把所有事件都放进去,包括注销。
var mouseUpHandlers = [];var mouseUp = function (ev) { mouseUpHandlers.forEach(function (h, hi, ha) { h(ev); });};mouseUpHandlers.push( function () { document.body.removeEventListener("mousemove", mouseMove, false); }, function () { document.body.removeEventListener("mouseup", mouseUp, false); }, function (ev) { var mCurP = getMousePosition(); var x = mCurP.x - mStartP.x; var y = mCurP.y - mStartP.y; moved(x, y); });document.body.addEventListener("mouseup", mouseUp, false);鼠标的拖拽也完成了,我们接下来还要完成注销滑动事件的功能。
【未完待续】
文章类型及复杂度:Web 前端开发进阶。
节选翻译自 MSDN 博文 Slide on web,内容有所调整。
http://blogs.msdn.com/b/kingcean/archive/2016/03/23/slide-on-web.aspx
0 0
- 网页元素的滑动事件(三)
- 网页元素的滑动事件(一)
- 网页元素的滑动事件(二)
- 网页元素的滑动事件(四)
- 《View的事件体系》(三)弹性滑动
- 监控网页中元素的事件
- 元素绑定事件的三种 方法
- Android——View的事件体系(三)View的滑动冲突
- 网页加载后动态改变HTML元素的onClick事件
- vc++访问javascript(5)--绑定网页元素的事件
- jquery事件对Html网页动态生成的元素失效
- jQuery元素的滑动
- js动态添加网页元素的三种方法
- 网页制作插入新的元素,并且为插入的元素添加事件
- (九)View的滑动事件
- js给dom元素绑定事件的三种方式
- View的事件体系(下)(事件分发,滑动冲突)
- JS循环网页元素,手动触发事件
- PVR图像文件格式初探
- 一元分成 一分,二分,五分的不同分法
- Day1
- 关于google文章分享
- 前端性能优化十四个规则:
- 网页元素的滑动事件(三)
- OpenJ_Bailian - 3421
- VS集成Qt环境搭建
- 用JS实现图片轮播
- 插入排序
- leetcode之Balanced Binary Tree
- java实现AVL树(一种自平衡二叉树)数据结构
- Jsp(1)jsp基础
- Spring MVC 拦截器的讲解