jQuery手机浏览器中拖拽动作的艰难性分析


Posted in Javascript onFebruary 04, 2015

本文实例分析了jQuery手机浏览器中拖拽动作的艰难性。分享给大家供大家参考。具体如下:

本想在手机网页中实现一个如iphone可以随意拖动的控制按钮的,但是最后发现竹篮打水一场空,

虽然拖拽动作在手机浏览器中司空见惯,但是在手机浏览器中,要想实现可以被拖拽的组件,却是一件不可能的事情。

先来看看在PC网页中,拖拽动作是怎么做的,

首先,我们有一个按钮,点击有动作,一直按着不放,可以随意拖动,就像iphone可以随意拖动的控制按钮一样,

jQuery手机浏览器中拖拽动作的艰难性分析

如上图的灰色图层,写出来也不甚容易,

首先,要把灰色图层的position属性变为abosulte,之后在jquery脚本要实现的工作要点,是区分click与mousedown+mouseup这一对动作,因为click本来就等于mousedown+mouseup,但是还好,mousedown一段时间时候,马上unbind清空图层对cilck动作的绑定,告诉系统,mousedown之后的动作与click无关,见如下现实代码:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">  

<html xmlns="http://www.w3.org/1999/xhtml">  

<head>  

<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />  

<title>jqdrag</title>  

<meta name="viewport" content="width=device-width,initial-scale=1.0,user-scalable=no">  

<script type="text/javascript" src="js/jquery-1.11.1.js"></script>  

</head>  

  

<body>  

<div id="mydiv" style="width:100px; height:100px; background:#999; position:absolute;">out</div>  

</body>  

</html>  

<script type="text/javascript">  

$(document).ready(function() {  

var timeout ;  

      

    $("#mydiv").mousedown(function(e) {  

        /*相当于mousedown之后立即进行判断,到底用户有没有按下超过1秒,有则判定为长按*/  

        $("#mydiv").click(function() {  

            $("#mydiv").text("被点击");  

        });  

        timeout = setTimeout(function() {  

            $("#mydiv").text("长按");  

            /*以下的语句之后,用户鼠标左键放起,则不会判定为click动作*/  

            $("#mydiv").unbind("click");  

            $("#mydiv").mousemove(function (e) {  

                /*这里是为了鼠标拖拽图层移动的时候,鼠标刚好在图层中间*/  

                document .getElementById("mydiv").style.left = e.pageX-50 + "px";  

                document .getElementById("mydiv").style.top = e.pageY-50 + "px";  

            });   

        }, 1000)          

    });  

          

    $("#mydiv").mouseup(function() {  

        clearTimeout(timeout);  

        /*这里必须清空mousemove动作,否则图层会永远绑定mousemove动作,随着鼠标移动而移动*/  

        $("#mydiv").unbind("mousemove");  

        $("#mydiv").text("out");      

    });   

          

    $("#mydiv").mouseout(function() {  

        clearTimeout(timeout);  

        $("#mydiv").unbind("mousemove");  

        $("#mydiv").text("out");  

    });  

});  

</script>

之所以还要编写mouseout事件,与之前的【jQuery实现长按按钮触发事件的方法】一文一样,防止浏览器中,涂黑躲过mouseup判定的bug。
以上看起来非常地完美,因为在PC各大浏览器测试通过,还完美兼容IE8,实在是美如画,

但是,一到手机中就问题大了,

仅仅在google浏览器中手机调试模式中,还没有到真机上了,就无法使用了!

jquery的点击事件在手机浏览器中是没有任何问题的,但是,长按事件却与手机上系统自带的右键功能发生了冲突,即使换成jquery mobile中的.on("taphold",function (){});事件或者是在上面的mousedown中加入e.preventDefault();IE则用window.event.preventDefault();I禁用手机浏览器的自带的菜单,也只能使长按的功能留存,拖拽是不用想了,因为拖拽最主要的函数就是mousemove动作,手机浏览器上根本就不支持mousemove()动作。

于是,有人提出抗议了,可以用jquery ui中的.draggable()与jquerymobile中的swipe事件,实在html5中的拖拽事件啊!

然而,上述所有的解决方案都是徒劳无功,

对于jquery ui中的.draggable(),jquerymobile中的swipe事件,html5中的拖拽事件可以用浏览器的手机调试模式,发现根本就没法拖。

希望本文所述对大家的jquery程序设计有所帮助。

Javascript 相关文章推荐
javascript css float属性的特殊写法
Nov 13 Javascript
jquery 将disabled的元素置为enabled的三种方法
Jul 25 Javascript
javascript中字符串拼接需注意的问题
Jul 13 Javascript
菜鸟javascript基础资料整理2
Dec 06 Javascript
JavaScript 创建运动框架的实现代码
May 08 Javascript
学习JavaScript设计模式之责任链模式
Jan 18 Javascript
郁闷!ionic中获取ng-model绑定的值为undefined如何解决
Aug 27 Javascript
js 定位到某个锚点的方法
Nov 19 Javascript
如何提高数据访问速度
Dec 26 Javascript
vue分类筛选filter方法简单实例
Mar 30 Javascript
JS块级作用域和私有变量实例分析
May 11 Javascript
Nuxt项目支持eslint+pritter+typescript的实现
May 20 Javascript
JavaScript检测实例属性, 原型属性
Feb 04 #Javascript
Jquery Ajax xmlhttp请求成功问题
Feb 04 #Javascript
js对字符的验证方法汇总
Feb 04 #Javascript
AngularJS内置指令
Feb 04 #Javascript
javascript内置对象操作详解
Feb 04 #Javascript
js判断文本框剩余可输入字数的方法
Feb 04 #Javascript
javascript 兼容各个浏览器的事件
Feb 04 #Javascript
You might like
IIS+PHP+MySQL+Zend配置 (视频教程)
2006/12/13 PHP
php操作sqlserver关于时间日期读取的小小见解
2009/11/29 PHP
解析thinkphp基本配置 convention.php
2013/06/18 PHP
php利用单例模式实现日志处理类库
2014/02/10 PHP
smarty高级特性之对象的使用方法
2015/12/25 PHP
PHP里的$_GET数组介绍
2019/03/22 PHP
基于JavaScript代码实现兼容各浏览器的设为首页和加入收藏
2016/01/07 Javascript
记录vue做微信自定义分享的一些问题
2019/09/12 Javascript
node.js基于dgram数据报模块创建UDP服务器和客户端操作示例
2020/02/12 Javascript
javascript解析json格式的数据方法详解
2020/08/07 Javascript
Vue使用Ref跨层级获取组件的步骤
2021/01/25 Vue.js
[39:32]2014 DOTA2国际邀请赛中国区预选赛 TongFu VS DT 第二场
2014/05/23 DOTA
[48:41]VP vs VG Supermajor小组赛 B组胜者组决赛 BO3 第二场 6.2
2018/06/03 DOTA
Python编写检测数据库SA用户的方法
2014/07/11 Python
给Python初学者的一些编程技巧
2015/04/03 Python
python通过socket查询whois的方法
2015/07/18 Python
Python的Django应用程序解决AJAX跨域访问问题的方法
2016/05/31 Python
12步入门Python中的decorator装饰器使用方法
2016/06/20 Python
用 Python 连接 MySQL 的几种方式详解
2018/04/04 Python
python 判断矩阵中每行非零个数的方法
2019/01/26 Python
python 阶乘累加和的实例
2019/02/01 Python
简单了解python的内存管理机制
2019/07/08 Python
python设计微型小说网站(基于Django+Bootstrap框架)
2019/07/08 Python
如何用Python来理一理红楼梦里的那些关系
2019/08/14 Python
Python爬虫如何应对Cloudflare邮箱加密
2020/06/24 Python
python装饰器实现对异常代码出现进行自动监控的实现方法
2020/09/15 Python
美国在线家装零售商:Build.com
2016/09/02 全球购物
英国床垫在线:Mattress Online
2016/12/07 全球购物
世界领先的在线地板和建筑材料批发商:BuildDirect
2017/02/26 全球购物
vue+django实现下载文件的示例
2021/03/24 Vue.js
大学生专科毕业生自我评价
2013/11/17 职场文书
应届大学毕业生找工作的求职信范文
2013/11/29 职场文书
单位未婚证明范本
2014/01/18 职场文书
机电一体化专业毕业生自荐信
2014/06/19 职场文书
解放思想演讲稿
2014/09/11 职场文书
见习报告的格式
2014/10/31 职场文书