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小数计算出现近似值的解决办法
Feb 06 Javascript
jquery的Theme和Theme Switcher使用小结
Sep 08 Javascript
js时间日期和毫秒的相互转换
Feb 22 Javascript
网页前端优化之滚动延时加载图片示例
Jul 13 Javascript
javascript读写XML实现广告轮换(兼容IE、FF)
Aug 09 Javascript
js网页实时倒计时精确到秒级
Feb 10 Javascript
jQuery中的$.ajax()方法应用
May 06 Javascript
node.js中的fs.mkdir方法使用说明
Dec 17 Javascript
javascript闭包概念简单解析(推荐)
Jun 03 Javascript
关于AngularJs数据的本地存储详解
Jan 20 Javascript
Bootstrap实现模态框效果
Sep 30 Javascript
jQuery实现的图片点击放大缩小功能案例
Jan 02 jQuery
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支持页面回退的两种方法
2008/01/10 PHP
php5数字型字符串加解密代码
2008/04/24 PHP
PHP 引用是个坏习惯
2010/03/12 PHP
开源php中文分词系统SCWS安装和使用实例
2014/04/11 PHP
ThinkPHP入库出现两次反斜线转义及数据库类转义的解决方法
2014/11/04 PHP
laravel 数据验证规则详解
2019/10/23 PHP
使用Git实现Laravel项目的自动化部署
2019/11/24 PHP
Aster vs KG BO3 第三场2.19
2021/03/10 DOTA
JavaScript入门教程 Cookies
2009/01/31 Javascript
ajax 文件上传应用简单实现
2009/03/03 Javascript
JavaScript获取页面上某个元素的代码
2011/03/13 Javascript
JQuery获取当前屏幕的高度宽度的实现代码
2011/07/12 Javascript
禁止选中文字兼容IE、Chrome、FF等
2013/09/04 Javascript
js确认删除对话框效果的示例代码
2014/02/20 Javascript
跟我学习javascript的this关键字
2020/05/28 Javascript
基于js实现微信发送好友如何分享到朋友圈、微博
2015/11/30 Javascript
JS实现title标题栏文字不间断滚动显示效果
2016/09/07 Javascript
JavaScript动态检验密码强度的实现方法
2016/11/09 Javascript
怎样判断jQuery当前元素是隐藏还是显示
2016/11/23 Javascript
Bootstarp基本模版学习教程
2017/02/01 Javascript
Web制作验证码功能实例代码
2017/06/19 Javascript
jQuery扇形定时器插件pietimer使用方法详解
2017/07/18 jQuery
关于jquery form表单序列化的注意事项详解
2017/08/01 jQuery
获取本机IP地址的实例(JavaScript / Node.js)
2017/11/24 Javascript
layui的layedit富文本赋值方法
2019/09/18 Javascript
基于vue中的scoped坑点解说
2020/09/04 Javascript
python批量图片处理简单示例
2019/08/06 Python
Tensorflow中批量读取数据的案列分析及TFRecord文件的打包与读取
2020/06/30 Python
英国二手物品交易网站:Preloved
2017/10/06 全球购物
校园招聘策划书
2014/01/09 职场文书
2014年学生工作总结
2014/11/20 职场文书
具结保证书
2015/01/17 职场文书
2015年妇产科工作总结
2015/05/18 职场文书
MySQL中distinct与group by之间的性能进行比较
2021/05/26 MySQL
JVM的类加载器和双亲委派模式你了解吗
2022/03/13 Java/Android
利用nginx搭建RTMP视频点播、直播、HLS服务器
2022/05/25 Servers