移动端拖拽排序 html,移动端拖拽排序

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

* transform: translate3d(20px,100%,10px)

* */

canMove = false;

}

}

else if (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还靠谱些..

笨死算逑!!!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/574800.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

pyqt5 qscrollarea到达_pyqt5 QScrollArea设置在自定义侧(任何位置)

本例设置为垂直左侧scroll主要思想是利用一个长度为0的mid_frame&#xff0c;高度为待设置qwidget的高度&#xff0c;用mid_frame的moveEvent事件驱动qwidget的move我项目的效果图&#xff1a;代码及注释from PyQt5.Qt import *from sys import argv# 主窗口class Main(QMainWi…

html页面判断是否登录,egg(103)--egg之定义公共的中间件判断用户是否登录以及去结算页面制作...

判断用户是否登录中间件app/middleware/userauth.jsmodule.exports (options, app) > {return async function init(ctx, next) {//判断前台用户是否登录 如果登录可以进入 ( 去结算 用户中心) 如果没有登录直接跳转到登录var userinfo ctx.service.cookies.get(userinfo)…

3月初的日记:网站工作记录

一直在备考。考一个关于自己本身工作的资格证。也一直在忙碌中&#xff0c;三个项目的并驾齐驱。 可以说&#xff0c;我也很忙。 东北今天下了很大雪&#xff0c;厚厚的&#xff0c;踩上去咯吱咯吱的响&#xff0c;这样的安逸更容易使得心静下来。 但是&#xff0c;其实我是焦虑…

电子科技大学研究生计算机与科学,2019年电子科技大学计算机科学与工程学院考研复试分数线...

据电子科技大学研究生院消息&#xff0c;2019年电子科技大学计算机科学与工程学院考研复试分数线及调剂信息已出&#xff0c;详情如下&#xff1a;专业第一单元第二单元第三单元第四单元总分调剂调剂开放时间调剂结束时间公开招考人数081200计算机科学与技术50458090340不接收2…

debian 重复执行sh_debian 脚本启动方式

同所有的Unix一样,Debian启动时要执行init程序.init的配置文件(/etc/inittab)中指定的第一个执行脚本应该是/etc/init.d/rcS.该脚本执行/etc/rcS.d/目录中各脚本的扩展名指定或衍生进程完成诸如检查并挂载文件系,装载内核模块,启动网络服务,设定时钟等系统初始化工作.接着,为了…

(None resource)-Binary system

Description 给定一个范围[a,b] (0<a<b<10^18) 求出该范围内二进制中1的个数最多的数&#xff0c;如果存在多个答案&#xff0c;输出最小的那个数 Input 输入数据有多组&#xff0c;每组数据输入两个整数a&#xff0c;b&#xff0c;表示区间[a, b]。 Output 输出该区…

计算机应用的时间地点意义,计算机应用在教学中的作用

计算机应用在教学中的作用微课已成为当前我国教育信息化发展的重点和热点。在如今的数字化“微”时代&#xff0c;微课将成为一种新的教学模式和学习方式。下面是小编搜集整理的相关内容的论文&#xff0c;欢迎大家阅读参考。摘要&#xff1a;随着我国科技和技术的不断发展&…

java输出一副扑克牌_JAVA编一副扑克牌

匿名用户7级2011-05-03 回答public static void main(String [] args){List li new ArrayList();List li2 new ArrayList();List li3 new ArrayList();li.add("黑桃");li.add("红心");li.add("梅花");li.add("方片");for(int i 2 …

qpython能使用json吗l_Python pyjsonq包_程序模块 - PyPI - Python中文网

py jsonqpy jsonq是一个简单、优雅的python包&#xff0c;可以查询任何类型的json数据。通过在json上提供类似orm的查询&#xff0c;这将使您的生活更轻松。安装pip install pyjsonq用法只需在开始使用前导入软件包即可。作为python包&#xff1a;frompyjsonqimportJsonQ通过从…

虚拟跳线软件干什么用的_跳线的作用

跳线就是主板上的一个个小开关&#xff0c;(其它板卡上也有)&#xff0c;用来手动完成一些软件不能实现的操作&#xff0c;比如手动清空BIOS&#xff0c;超频等。如果主板上的跳线跳接得不正确&#xff0c;大多情况下都可能引起没有显示的故障。有些情况下&#xff0c;虽然也显…

启继承父位在什么时候_为什么少儿口才现在越来越受到家长们的重视

情商口才是个人素养、能力和智慧的一种综合反映&#xff0c;随着社会的发展&#xff0c;少年儿童的早期教育越来越受到家长的重视&#xff0c;特别是在培养孩子的语言表达能力中&#xff0c;更多的家长开始寻求各种方法来锻炼孩子的语言表达能力。源自于美国教育演说家卡耐基的…

x光肺部分割数据集_吴恩达发布了大型X光数据集,斯坦福AI诊断部分超越人类 | AAAI 2019...

数栗子 发自 凹非寺量子位 报道 | 公众号 QbitAI最近&#xff0c;吴恩达的斯坦福团队发布了一个叫做CheXpert的大型数据集&#xff0c;论文中选了AAAI 2019。它包含了224,316张标注好的胸部X光片&#xff0c;以及放射科医师为每张胸片写的病理报告。虽然&#xff0c;像从前NIH发…

python rpc webservice_关于RPC、HTTP、WebService的区别

关于 REST 介绍的文章已经很多了&#xff0c;这里只对 RPC 部分做一个介绍&#xff1a;RPC(远程过程调用)是什么简单的说&#xff0c;RPC就是从一台机器(客户端)上通过参数传递的方式调用另一台机器(服务器)上的一个函数或方法(可以统称为服务)并得到返回的结果。RPC 会隐藏底层…

python程序发布 ubuntu_将Windows项目发布到Ubuntu服务器详细教程(Windows编程,Ubuntu服务器做解释器)...

前期准备(1)专业版Pycharm(社区版没有deployment功能)&#xff0c;学生&#xff0c;教师可申请免费专业版&#xff0c;详情可看我的博客。(2)可通过SSH连接Ubuntu服务器&#xff0c;并且服务器安装了Python解释器。部署本地Pycharm项目到Ubuntu服务器1.点击Tools - Deployment …

nios 双核 烧录_nios程序烧写到epcs方法

折腾了好久&#xff0c;才把nios程序烧写到epcs的方法弄明白。开始先在网上搜了下&#xff0c;这方面资料很多&#xff0c;看了半天也没怎么弄明白&#xff0c;无奈&#xff0c;只好去找官方文档&#xff0c;看完后&#xff0c;只想说&#xff0c;官方文档确实给力。下面列出参…

access百度翻译 get_Asp.NET调用百度翻译

Asp.NET调用百度翻译&#xff0c;图示&#xff1a;HTML:OA翻译TextMode"MultiLine">源语言&#xff1a;自动检测中文英文日文目标语言&#xff1a;自动检测中文英文日文runat"server" Text"翻译" οnclick"Translate_Click" />C…

angular js 默认选中_AngularJS Select(选择框)

下拉框默认的值为 key-value 对中的 value &#xff0c;也可以用 as 来修改下拉框的值。也就是 x for (x, y) 相当于是 y as x for (x, y)。as 前面的为下拉框的值&#xff0c;后面的为下拉框显示的内容。​也可以不使用key-value 对中的 value 作为下拉框的值, 直接使用对象的…

【Qt之Quick模块】6. QML语法详解_1 基础语法与三种导入语句

前言 通过以上1-5文档的介绍&#xff0c;Quick与QML的概念及QML语法、类型、文件作用等已叙述个大概&#xff0c;接下来是对QML语法进行展开来说。 其实&#xff0c;学习任何一门语言或者做任何一件事情&#xff0c;并不用一开始就要求尽善尽美&#xff0c;做个无懈可击&…

datagrip将一个数据库中的数据_跨平台数据库管理神器DataGrip,用上就爱不释手...

原文链接&#xff1a;https://www.ffeeii.com/2041.htmlDataGrip是Jetbrains旗下众多优秀的效率生产工具之一。下载地址&#xff1a;https://www.jetbrains.com/datagrip/DataGrip是多引擎数据库环境&#xff0c;支持几乎常见的数据库类型&#xff1a;PostgreSQL、MySQL、Oracl…

栅格单元值的选取方法_ArcGIS中栅格数据重采样方法

2.用ArcGIS中的Resampling工具进行栅格重采样操作在ArcToolbox中依次找到Data Management Tools—>Raster—>RasterProcessing—>Resample工具&#xff0c;工具界面如下图所示&#xff1a;其中各参数含义如下&#xff1a;Input raster: 输入栅格数据集Output raster d…