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 相关文章推荐
根据分辩率调用不同的CSS.
Jan 08 Javascript
JavaScript版DateAdd和DateDiff函数代码
Mar 01 Javascript
javascript/jquery获取地址栏url参数的方法
Mar 05 Javascript
node.js中的socket.io入门实例
Apr 26 Javascript
JavaScript中switch判断容易犯错的一个细节
Aug 27 Javascript
javascript引用类型指针的工作方式
Apr 13 Javascript
贴近用户体验的Jquery日期、时间选择插件
Aug 19 Javascript
深入浅析JavaScript的API设计原则
Jun 14 Javascript
关于JavaScript数组你所不知道的3件事
Aug 24 Javascript
Vue.Draggable实现拖拽效果
Jul 29 Javascript
vue params、query传参使用详解
Sep 12 Javascript
vue.js input框之间赋值方法
Aug 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自带的服务器来查看正则匹配结果的方法
2015/12/24 PHP
php依赖注入知识点详解
2019/09/23 PHP
PHP使用PDO实现mysql防注入功能详解
2019/12/20 PHP
javascript学习笔记(二十) 获得和设置元素的特性(属性)
2012/06/20 Javascript
Bootstrap每天必学之级联下拉菜单
2016/03/27 Javascript
Angular懒加载机制刷新后无法回退的快速解决方法
2016/08/30 Javascript
详解如何在Angular中快速定位DOM元素
2017/05/17 Javascript
详解vue嵌套路由-params传递参数
2017/05/23 Javascript
canvas绘制爱心的几种方法总结(推荐)
2017/10/31 Javascript
微信小程序之判断页面滚动方向的示例代码
2018/08/30 Javascript
Vue动态组件与异步组件实例详解
2019/02/23 Javascript
JS将时间秒转换成天小时分钟秒的字符串
2019/07/10 Javascript
微信h5静默和非静默授权获取用户openId的方法和步骤
2020/06/08 Javascript
解决echarts中横坐标值显示不全(自动隐藏)问题
2020/07/20 Javascript
让Vue响应Map或Set的变化操作
2020/11/11 Javascript
Vue仿Bibibili首页的问题
2021/01/21 Vue.js
在GitHub Pages上使用Pelican搭建博客的教程
2015/04/25 Python
Python文本特征抽取与向量化算法学习
2017/12/22 Python
基于python3实现socket文件传输和校验
2018/07/28 Python
Python开发最牛逼的IDE——pycharm
2018/08/01 Python
python opencv摄像头的简单应用
2019/06/06 Python
Python插件机制实现详解
2020/05/04 Python
Python astype(np.float)函数使用方法解析
2020/06/08 Python
基于django2.2连oracle11g解决版本冲突的问题
2020/07/02 Python
Python数据可视化实现多种图例代码详解
2020/07/14 Python
英国景点门票网站:attractiontix
2019/08/27 全球购物
自动化工程专业个人应聘自荐信
2013/09/26 职场文书
学习委员自我鉴定
2014/01/13 职场文书
加工操作管理制度
2014/01/19 职场文书
老公保证书怎么写
2015/02/26 职场文书
五星级酒店前台接待岗位职责
2015/04/02 职场文书
罗马假日观后感
2015/06/08 职场文书
2016新党章学习心得体会
2016/01/15 职场文书
《曾国藩家书》读后感——读家书,立家风
2019/08/21 职场文书
Matlab求解数组中的最大值及它所在的具体位置
2021/04/16 Python
go select编译期的优化处理逻辑使用场景分析
2021/06/28 Golang