网页元素的滑动事件(四)
来源:互联网 发布:淘宝抢货神器 编辑:程序博客网 时间:2024/06/05 20:46
嗯,我们还需要完成一些事情,才能搞定这个方法。目前,我们已经实现了触控手势和鼠标拖拽。
function addSlide(element, options) { // Validate arguments... // Resolve element... // Touch supports... // Mouse supports... // ToDo: Implement it. return null;}
现在我们来处理返回值。这将是一个包含能够注销滑动事件的方法的对象。
return { dispose: function () { // Remove touch events. ele.removeEventListener("touchstart", touchStart, false); if (!!touchMove) ele.removeEventListener("touchmove", touchMove, false); ele.removeEventListener("touchend", touchEnd, false); // Remove mouse event. ele.removeEventListener("mousedown", mouseDown, false); }};
至此,大功告成!我们来看一下最终代码。
/** * Adds gesture handlers. * @param element the target element. * @param options the options. */function addSlide(element, options) { if (!options || !element) return { dispose: function () { } }; // Get the element. var ele = !!element && typeof element === "string" ? document.getElementById(element) : element; if (!ele) return { dispose: function () { } }; // Get the minimum moving distances. var minX = options.minX; var minY = options.minY; if (minX == null || minX < 0) minX = 1; minX = Math.abs(minX); if (minY == null || minY < 0) minY = 1; minY = Math.abs(minY); // The handler occured after moving. var moved = function (x, y) { var isX = !y || (Math.abs(x) / Math.abs(y) > (minX + 0.01) / (minY + 0.01)); if (isX) { if (x > minX && !!options.turnLeft) options.turnLeft(ele, x); else if (x < -minX && !!options.turnRight) options.turnRight(ele, -x); } else { if (y > minY && !!options.turnUp) options.turnUp(ele, y); else if (y < -minY && !!options.turnDown) options.turnDown(ele, -y); } if (!!options.moveEnd) options.moveEnd(ele, x, y); }; // Touch starting event handler. var start = null; var touchStart = function (ev) { start = { x: ev.targetTouches[0].pageX, y: ev.targetTouches[0].pageY }; if (!!options.moveStart) options.moveStart(ele); }; ele.addEventListener("touchstart", touchStart, false); // Touch moving event handler. var touchMove = !!options.moving ? function (ev) { var point = ev.touches ? ev.touches[0] : ev; if (!point) return; var coor = { x: point.pageX - start.x, y: point.pageY - start.y }; options.moving(ele, coor.x, coor.y); } : null; if (!!touchMove) ele.addEventListener("touchmove", touchMove, false); // Touch ending event handler. var touchEnd = function (ev) { if (start == null) return; var x = ev.changedTouches[0].pageX - start.x; var y = ev.changedTouches[0].pageY - start.y; start = null; moved(x, y); }; ele.addEventListener("touchend", touchEnd, false); // Mouse event handler. var mouseDown = function (ev) { // Record current mouse position // when mouse down. var mStartP = getMousePosition(); // Mouse moving event handler. 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); // Mouse up event handler. // Need remove all mouse event handlers. 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); }; ele.addEventListener("mousedown", mouseDown, false); // Return a disposable object // for removing all event handlers. return { dispose: function () { // Remove touch events. ele.removeEventListener("touchstart", touchStart, false); if (!!touchMove) ele.removeEventListener("touchmove", touchMove, false); ele.removeEventListener("touchend", touchEnd, false); // Remove mouse event. ele.removeEventListener("mousedown", mouseDown, false); } };}
现在我们来进行一个测试。假设有这样一个 DOM 元素。
<div id="demo_gesture"> <div id="demo_gesture_fore"> </div></div>
样式如下。
#demo_gesture { max-width: 800px; height: 20px; background-color: #EEE; border: 1px solid #CCC; border-radius: 10px; position: relative; overflow: hidden;}#demo_gesture > #demo_gesture_fore { color: #CCC; text-align: center; width: 20px; height: 20px; background-color: #CCC; border-radius: 10px; position: absolute; top: 0; left: 0; overflow: hidden; cursor: pointer;}
当文档元素加载完后,我们执行以下代码。
var adjustPosition = function (ele, x) { x = (ele.position || 0) + x; if (x < 0) x = 0; else if (x > ele.parentElement.offsetWidth - ele.offsetWidth) x = ele.parentElement.offsetWidth - ele.offsetWidth; ele.style.left = x + "px"; return x;};addSlide("demo_gesture_fore", { moving: function (ele, pos) { adjustPosition(ele, pos.x); }, moveEnd: function (ele, pos) { ele.position = adjustPosition(ele, pos.x); }});
这个测试页面创造一个水平的滑动模块。你也可以用这个创造更多滑动组件出来。
【完】
文章类型及复杂度:Web 前端开发进阶。
节选翻译自 MSDN 博文 Slide on web,内容有所调整。
http://blogs.msdn.com/b/kingcean/archive/2016/03/23/slide-on-web.aspx
0 0
- 网页元素的滑动事件(四)
- 网页元素的滑动事件(一)
- 网页元素的滑动事件(二)
- 网页元素的滑动事件(三)
- 【Android View事件(四)】View滑动与实现滑动的几种方法
- 监控网页中元素的事件
- 高品质的网页设计与技巧之四(元素的组织)
- 网页加载后动态改变HTML元素的onClick事件
- vc++访问javascript(5)--绑定网页元素的事件
- jquery事件对Html网页动态生成的元素失效
- jQuery元素的滑动
- 网页制作插入新的元素,并且为插入的元素添加事件
- (九)View的滑动事件
- View的事件体系(下)(事件分发,滑动冲突)
- JS循环网页元素,手动触发事件
- VC 监视网页中的元素事件
- 网页元素的应用
- HTML基础知识四( 内嵌入式框架、 滑动字幕、多媒体元素、CSS)
- Android React-Native系列之<二>零基础学习React-Native控件之View
- 安卓欢迎界面的编写
- java基础-内存分配
- 密码学应用(DES,AES, MD5, SHA1, RSA, Salt, Pkcs8)
- 求素数,给你一个n,输出n以内的素数
- 网页元素的滑动事件(四)
- 图的邻接矩阵表示
- 协方差
- UML中几种类间关系:继承、实现、依赖、关联、聚合、组合的联系与区别
- C++虚函数表详细解释及实例分析
- 通过 PCIE Inbound
- 8.cell重用
- “空”园三兄弟之nil和Nil及NUL
- 虚析构函数 和 纯虚析构函数