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 相关文章推荐
jQuery 扩展对input的一些操作方法
Oct 30 Javascript
jQuery学习笔记 操作jQuery对象 CSS处理
Sep 19 Javascript
关于jquery的多个选择器的使用示例
Oct 18 Javascript
浏览器兼容console对象的简要解决方案分享
Oct 24 Javascript
运用js教你轻松制作html音乐播放器
Apr 17 Javascript
js实现定时进度条完成后切换图片
Jan 04 Javascript
JS对象深度克隆实例分析
Mar 16 Javascript
详解vue-cli开发环境跨域问题解决方案
Jun 06 Javascript
详解如何使用webpack打包多页jquery项目
Feb 01 jQuery
vue 验证两次输入的密码是否一致的方法示例
Sep 29 Javascript
在vue中使用jsonp进行跨域请求接口操作
Oct 29 Javascript
什么是SOLID
Mar 24 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 5昨天隆重推出--PHP 5/Zend Engine 2.0新特性
2006/10/09 PHP
php循环输出数据库内容的代码
2008/05/24 PHP
谨慎使用PHP的引用原因分析
2012/09/06 PHP
php使用NumberFormatter格式化货币的方法
2015/03/21 PHP
Zend Framework入门教程之Zend_Db数据库操作详解
2016/12/08 PHP
TP3.2框架分页相关实现方法分析
2020/06/03 PHP
添加到收藏夹代码(兼容几乎所有的浏览器)
2007/01/09 Javascript
javascript级联下拉列表实例代码(自写)
2013/05/10 Javascript
js获取窗口相对于屏幕左边和上边的位置坐标
2014/05/15 Javascript
js文字横向滚动特效
2015/11/11 Javascript
KnockoutJs快速入门教程
2016/05/16 Javascript
Angularjs 创建可复用组件实例代码
2016/10/09 Javascript
使用BootStrap实现标签切换原理解析
2017/03/14 Javascript
JS实现移动端按首字母检索城市列表附源码下载
2017/07/05 Javascript
vuejs使用FormData实现ajax上传图片文件
2017/08/08 Javascript
浅谈Vue.js中如何实现自定义下拉菜单指令
2019/01/06 Javascript
小程序云函数调用API接口的方法
2019/05/17 Javascript
[03:47]2015国际邀请赛第三日现场精彩回顾
2015/08/08 DOTA
Python自动登录126邮箱的方法
2015/07/10 Python
Python实现动态添加属性和方法操作示例
2018/07/25 Python
python opencv旋转图像(保持图像不被裁减)
2018/07/26 Python
如何通过python画loss曲线的方法
2019/06/26 Python
Pytorch训练过程出现nan的解决方式
2020/01/02 Python
TensorFlow命名空间和TensorBoard图节点实例
2020/01/23 Python
python中常用的数据结构介绍
2021/01/12 Python
AmazeUI 按钮交互的实现示例
2020/08/24 HTML / CSS
银行学习十八大感想
2014/01/11 职场文书
宾馆总经理岗位职责
2014/02/14 职场文书
公安四风对照检查材料思想汇报
2014/10/11 职场文书
优秀教师个人总结
2015/02/11 职场文书
结婚典礼主持词
2015/06/29 职场文书
教育教学工作反思
2016/02/24 职场文书
送给小学生的暑假礼物!小学生必背99首古诗
2019/07/02 职场文书
餐厅营销的秘密:为什么老顾客会流水?
2019/08/08 职场文书
用Python制作灯光秀短视频的思路详解
2021/04/13 Python
docker-compose部署Yapi的方法
2022/04/08 Servers