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 自动播放的实例代码
Nov 19 Javascript
用Javascript获取页面元素的具体位置
Dec 09 Javascript
jQuery解决input超多的表单提交
Aug 10 Javascript
Bootstrap入门书籍之(一)排版
Feb 17 Javascript
深入学习JavaScript的AngularJS框架中指令的使用方法
Mar 05 Javascript
jQuery使用siblings获取某元素所有同辈(兄弟姐妹)元素用法示例
Jan 30 Javascript
Javascript中的async awai的用法
May 17 Javascript
Node.js中环境变量process.env的一些事详解
Oct 26 Javascript
详解JavaScript 为什么要有 Symbol 类型?
Apr 03 Javascript
Vue 中使用 typescript的方法详解
Feb 17 Javascript
JavaScript Event Loop相关原理解析
Jun 10 Javascript
Vue实现穿梭框效果
Sep 30 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将网址字符串转换成超链接(网址或email)
2010/05/25 PHP
php使用GD实现颜色渐变实例
2015/06/02 PHP
ThinkPHP使用getlist方法实现数据搜索功能示例
2017/05/08 PHP
定位地理位置PHP判断员工打卡签到经纬度是否在打卡之内
2019/05/23 PHP
如何阻止复制剪切和粘贴事件为了表单内容的安全
2013/05/23 Javascript
JS控制表格实现一条光线流动分割行的方法
2015/03/09 Javascript
搭建Bootstrap离线文档的方法
2016/12/02 Javascript
利用angularjs1.4制作的简易滑动门效果
2017/02/28 Javascript
详解Node.js 命令行程序开发教程
2017/06/07 Javascript
AngularJS实用基础知识_入门必备篇(推荐)
2017/07/10 Javascript
nodejs之get/post请求的几种方式小结
2017/07/26 NodeJs
详解Vue中一种简易路由传参办法
2017/09/15 Javascript
JavaScript事件委托原理与用法实例分析
2018/06/07 Javascript
webpack5 联邦模块介绍详解
2020/07/08 Javascript
如何在selenium中使用js实现定位
2020/08/18 Javascript
一文秒懂nodejs中的异步编程
2021/01/28 NodeJs
Python获取服务器信息的最简单实现方法
2015/03/05 Python
python3中int(整型)的使用教程
2017/03/23 Python
浅谈Tensorflow模型的保存与恢复加载
2018/04/26 Python
对python3标准库httpclient的使用详解
2018/12/18 Python
使用python实现kNN分类算法
2019/10/16 Python
python多进程重复加载的解决方式
2019/12/13 Python
基于python图像处理API的使用示例
2020/04/03 Python
python中用ctypes模拟点击的实例讲解
2020/11/26 Python
澳大利亚办公室装修:JasonL Office Furniture
2019/06/25 全球购物
恶意软件的定义
2014/11/12 面试题
维德科技C#面试题笔试题
2015/12/09 面试题
四年级语文教学反思
2014/02/05 职场文书
2014年党课学习材料
2014/05/11 职场文书
技能比武方案
2014/05/21 职场文书
公司慰问信范文
2015/03/23 职场文书
导游词之河北邯郸
2019/09/12 职场文书
导游词之海南天涯海角
2019/12/05 职场文书
Angular性能优化之第三方组件和懒加载技术
2021/05/10 Javascript
Python 用户输入和while循环的操作
2021/05/23 Python
Python中第三方库Faker的使用详解
2022/04/02 Python