博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
移动端拖拽排序
阅读量:5943 次
发布时间:2019-06-19

本文共 4030 字,大约阅读时间需要 13 分钟。

hot3.png

 

var drag = {        bindDragEvent: function (isF) {            var father = document.getElementById("public_theme_list");//父容器            var btns = father.getElementsByClassName("public-drag-btn");//事件源对象            var items = father.getElementsByClassName("item");//拖拽目标            for (var i = 0; i < items.length; i++) {                items[i].index = i;//给拖拽目标加index属性                if (isF) {//是否是第一次绑定                    drag.bindTouchEvent(btns[i], items[i], items);                }else{                    if (items[i].getAttribute("data-isBind") == "yes") {//如果是需要绑定的再绑定事件                        items[i].removeAttribute("data-isBind");                        drag.bindTouchEvent(btns[i], items[i], items);                    }                }            }            /*            * 1.循环绑定事件            * 2.用分支绑定是为了避免重复绑定事件 造成重复调用的BUG            * */        },        bindTouchEvent: function (ele, target, items) {            var dragObj = target;//拖拽目标            var btn = ele;//事件源对象            var canMove = true;            var startY, direction;            btn.addEventListener("touchstart", touchStart, false);            function touchStart(event) {                dragObj.className = "item draging";                /*                 * .draging                * 当手指触摸时给个 拖拽中的效果                * transform:scale(0.8,0.8);                * z-index: 999;                * transition: all 1s;                * */                startY = event.touches[0].clientY;//记录初次触摸位置 用以判断移动方向                dragObj.addEventListener("touchmove", touchMove, false);//给拖拽目标绑定touchmove 因为要操作拖拽目标            }            function touchMove(event) {                var i = dragObj.index;//用到index                if (event.touches[0].clientY < startY && canMove) {                    /*移动
<开始 就是向上移动 *canmove是在完成效果后禁止再向下移动 * 也就是说用户移动一次就确定方向了 禁止先 拖到上方,在拖到下方 if (i !="0)" { 如果不是第一个项 direction="1;//有效1" up dragobj.classname="item draging up" ; .up transform: translate3d(20px,-100%,10px) 给一个自身向上移动百分百 items[i - 1].classname="item draging down" *当前被拖拽目标的上一个项 给一个向下移动的动效 .down translate3d(20px,100%,10px) canmove="false;" } else (event.touches[0].clienty>
startY && canMove) { direction = 0;//向下移动 dragObj.className = "item draging down"; items[i + 1].className = "item draging up"; canMove = false; } dragObj.addEventListener("touchend", touchEnd, false); } function touchEnd() { var father = document.getElementById("public_theme_list"); var clone = null;//克隆空对象 var i = dragObj.index; var newItems; dragObj.className = "item";//清除拖拽目标移动效果 clone = dragObj.cloneNode(true);//克隆移动目标 if (direction) { //向上 items[i - 1].className = "item";//当前被拖拽目标的上一个项 给一个向下移动的动效 clone.index = i - 1;//给克隆对象index 为当前上一个项index items[i - 1].index = i + 1;//拖拽对象前上一个项index+1 clone.setAttribute("data-isBind","yes");//dom 不能克隆事件 所以在递归的时候要给克隆绑定事件 father.insertBefore(clone,items[i - 1]); /*将克隆对象插入当前拖拽目标 前一项之前*/ newItems = father.getElementsByClassName("item"); /*因为新增了项 所以获取新项数组*/ father.removeChild(newItems[i + 1]); /*删除当前拖拽项*/ } else { items[i + 1].className = "item"; clone.index = i + 1; clone.setAttribute("data-index", i + 1); items[i + 1].index = i; items[i + 1].setAttribute("data-index", i); clone.setAttribute("data-isBind","yes"); father.insertBefore(clone, items[i + 2]); newItems = father.getElementsByClassName("item"); father.removeChild(newItems[i]); } drag.bindDragEvent(false);//递归调用 } } }; drag.bindDragEvent(true);

 

其实应该还有一段AJAX代码,是将排序后的顺序index  POST给服务器记录下来,用户再次进入之后会根据token区分用户,显示不同的顺序。

 

一开始没有思路,其实最怕写的就是多媒体和触摸拖拽相关的代码了。

但是没办法,项目驱动学习啊~

自己死笨死笨的。。。这点代码从想思路,到写,到试错,整整6个小时。。。笨死我算了

不过学习了很多东西,没有用h5拖拽,是因为考虑兼容问题,主要是在webView 里跑,js还靠谱些..

 

笨死算逑!!!

转载于:https://my.oschina.net/swmhxhs/blog/796931

你可能感兴趣的文章
多款C系列手机亮相三星中国论坛,更加注重中国用户体验
查看>>
云南中医学院更名为云南中医药大学
查看>>
人社部:突出就业优先政策主线 全力确保就业局势稳定
查看>>
关键时刻还是要看阿里,达摩院发布自主研发AI芯片
查看>>
「百年育才」计划启动港股IPO,新高考改革下的“志愿填报辅导”市场迎来窗口期?...
查看>>
浅谈高性能数据库集群——读写分离
查看>>
HenCoder Android 开发进阶:自定义 View 1-4 Canvas 对绘制的辅助
查看>>
angular ui-router:简单的单页面嵌套路由的实现过程
查看>>
Poi导出产生OOM解决方案
查看>>
YYImage源码剖析与学习
查看>>
闭包和一部电影的关系
查看>>
小程序【二】
查看>>
使用Intellij创建springboot项目Spring Initializr Error 403
查看>>
0617 - 只做核心业务
查看>>
使用MVVM尝试开发Github客户端及对编程的一些思考
查看>>
算法-基础(一)数组基本操作 和 静态方法(后面编写算法的时候会用到)
查看>>
浏览器安全之同源策略
查看>>
把vue-cli build的结果放到服务器上
查看>>
JSON入门看这一篇就够了
查看>>
vue + vuex + koa2开发环境搭建及示例开发
查看>>