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 相关文章推荐
js常用排序实现代码
Dec 28 Javascript
以WordPress为例讲解jQuery美化页面Title的方法
May 23 Javascript
Node.js中的require.resolve方法使用简介
Apr 23 Javascript
Js实现中国公民身份证号码有效性验证实例代码
May 03 Javascript
在vue中获取dom元素内容的方法
Jul 10 Javascript
vue 实现 ios 原生picker 效果及实现思路解析
Dec 06 Javascript
Node.js使用cookie保持登录的方法
May 11 Javascript
layui实现点击按钮给table添加一行
Aug 10 Javascript
在Vue中使用axios请求拦截的实现方法
Oct 25 Javascript
微信小程序如何引用外部js,外部样式,公共页面模板
Jul 23 Javascript
vue实现移动端返回顶部
Oct 12 Javascript
echarts柱状图背景重叠组合而非并列的实现代码
Dec 10 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
php addslashes及其他清除空格的方法是不安全的
2012/01/25 PHP
PHP中使用Imagick读取pdf并生成png缩略图实例
2015/01/21 PHP
php正则表达式获取内容所有链接
2015/07/24 PHP
php搜索文件程序分享
2015/10/30 PHP
thinkphp jquery实现图片上传和预览效果
2020/07/22 PHP
php依赖注入知识点详解
2019/09/23 PHP
Laravel5.5 数据库迁移:创建表与修改表示例
2019/10/23 PHP
Aster vs Newbee BO5 第一场2.19
2021/03/10 DOTA
一个符号插入器 中用到的js代码
2007/09/04 Javascript
让你的博客飘雪花超出屏幕依然看得见
2013/01/04 Javascript
jQuery contains过滤器实现精确匹配使用方法
2013/04/12 Javascript
js实现四舍五入完全保留两位小数的方法
2016/08/02 Javascript
javascript 显示全局变量与隐式全局变量的区别
2017/02/09 Javascript
js浏览器滚动条卷去的高度scrolltop(实例讲解)
2017/07/07 Javascript
解决Nodejs全局安装模块后找不到命令的问题
2018/05/15 NodeJs
jQuery--遍历操作实例小结【后代、同胞及过滤】
2020/05/22 jQuery
vue-cli打包后本地运行dist文件中的index.html操作
2020/08/12 Javascript
python笔记(2)
2012/10/24 Python
用Python登录Gmail并发送Gmail邮件的教程
2015/04/17 Python
Python脚本文件打包成可执行文件的方法
2015/06/02 Python
python UNIX_TIMESTAMP时间处理方法分析
2016/04/18 Python
浅谈Python的垃圾回收机制
2016/12/17 Python
Django学习教程之静态文件的调用详解
2018/05/08 Python
python 两个一样的字符串用==结果为false问题的解决
2020/03/12 Python
离线状态下在jupyter notebook中使用plotly实例
2020/04/24 Python
澳大利亚天然护肤品、化妆品和健康产品一站式商店:Nourished Life
2018/12/02 全球购物
Android面试题附答案
2014/12/08 面试题
南京软件公司的.net程序员笔试题
2014/08/31 面试题
求职简历自荐信范文
2013/10/21 职场文书
初中毕业生的自我评价
2014/03/03 职场文书
八荣八耻演讲稿
2014/09/15 职场文书
地道战观后感500字
2015/06/04 职场文书
体育教师研修感悟
2015/11/18 职场文书
2019年作为一名实习生的述职报告
2019/09/29 职场文书
JavaScript实现简单图片切换
2021/04/29 Javascript
MongoDB数据库之添删改查
2022/04/26 MongoDB