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代码
May 11 Javascript
jquery插件NProgress.js制作网页加载进度条
Jun 05 Javascript
基于JavaScript操作DOM常用的API小结
Dec 01 Javascript
浅谈js的url解析函数封装
Jun 28 Javascript
D3.js实现折线图的方法详解
Sep 21 Javascript
想学习javascript JS和jQuery哪个重要 先学哪个
Dec 11 Javascript
微信小程序 input输入框控件详解及实例(多种示例)
Dec 14 Javascript
JavaScript中无法通过div.style.left获取值的解决方法
Feb 19 Javascript
jquery实现手机端单店铺购物车结算删除功能
Feb 22 Javascript
koa+jwt实现token验证与刷新功能
May 30 Javascript
es6数组之扩展运算符操作实例分析
Apr 25 Javascript
在vue中动态修改css其中一个属性值操作
Dec 07 Vue.js
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脚本的10个技巧(2)
2006/10/09 PHP
Laravel 4 初级教程之Pages、表单验证
2014/10/30 PHP
php调用自己java程序的方法详解
2016/05/13 PHP
深入理解PHP中的count函数
2016/05/31 PHP
php断点续传之文件分割合并详解
2016/12/13 PHP
tp5实现微信小程序多图片上传到服务器功能
2018/07/16 PHP
Laravel框架实现简单的学生信息管理平台案例
2019/05/07 PHP
javascript下IE与FF兼容函数收集
2008/09/17 Javascript
使用JS进行目录上传(相当于批量上传)
2010/12/05 Javascript
jquery插件开发方法(初学者)
2012/02/03 Javascript
jquery右下角自动弹出可关闭的广告层
2015/05/08 Javascript
jquery实现初次打开有动画效果的网页TAB切换代码
2015/09/06 Javascript
jQuery循环遍历子节点并获取值的方法
2016/04/14 Javascript
举例讲解如何判断JavaScript中对象的类型
2016/04/22 Javascript
一种Javascript解释ajax返回的json的好方法(推荐)
2016/06/02 Javascript
Javascript基础_嵌入图像的简单实现
2016/06/14 Javascript
js中创建对象的几种方式
2017/02/05 Javascript
vue2 中如何实现动态表单增删改查实例
2017/06/09 Javascript
简易Vue评论框架的实现(父组件的实现)
2018/01/08 Javascript
浅谈VUE监听窗口变化事件的问题
2018/02/24 Javascript
微信小程序 轮播图实现原理及优化详解
2019/09/29 Javascript
在Chrome DevTools中调试JavaScript的实现
2020/04/07 Javascript
[48:12]Secret vs Optic Supermajor 胜者组 BO3 第三场 6.4
2018/06/05 DOTA
python两种遍历字典(dict)的方法比较
2014/05/29 Python
Python def函数的定义、使用及参数传递实现代码
2014/08/10 Python
Django Admin实现三级联动的示例代码(省市区)
2018/06/22 Python
jupyter 实现notebook中显示完整的行和列
2020/04/09 Python
Python numpy大矩阵运算内存不足如何解决
2020/11/19 Python
Python调用系统命令os.system()和os.popen()的实现
2020/12/31 Python
林清轩官方网站:山茶花润肤油开创者
2016/10/26 全球购物
英国绿色商店:Natural Collection
2019/05/03 全球购物
什么是动态端口(Dynamic Ports)?动态端口的范围是多少?
2014/12/12 面试题
求职推荐信
2013/10/28 职场文书
美德好少年事迹材料
2014/01/19 职场文书
八年级生物教学反思
2014/01/22 职场文书
汽车车尾标语大全
2015/08/11 职场文书