七月
16

JavaScript: 让拖动支持iphone/ipad触摸

一般的通过mousedown、mousemove、mouseup等打造的拖动,仅仅在普通的键盘+鼠标的电脑设备上可以工作。而到了ios设备上(iphone itouch ipad),则不能工作了。最近因为做个东西,需要支持ios设备,所以只好看了下webkit浏览器的触摸事件。

其实也很简单,对应mousedown、mousemove、mouseup的触摸事件分别是touchstart、touchmove、touchend。为了写个demo,花了不少的时间,所以为了节省时间,我文章里就不多说了,仅贴一下相关代码。

DEMO可以在此查看。

var getDragClass=(function(){
var SupportsTouches = ("createTouch" in document),//判断是否支持触摸
    StartEvent = SupportsTouches ? "touchstart" : "mousedown",//支持触摸式使用相应的事件替代
    MoveEvent = SupportsTouches ? "touchmove" : "mousemove",
    EndEvent = SupportsTouches ? "touchend" : "mouseup",
    $=function(id){
        return document.getElementById(id);
    },
    preventDefault=function(ev){
        if(ev)ev.preventDefault();
        else window.event.returnValue = false;
    },
    getMousePoint=function(ev){
        var x = y = 0,
            doc = document.documentElement,
            body = document.body;
            if(!ev) ev=window.event;
            if (window.pageYoffset) {
                x = window.pageXOffset;
                y = window.pageYOffset;
            }else{
                x = (doc && doc.scrollLeft || body && body.scrollLeft || 0) - (doc && doc.clientLeft || body && body.clientLeft || 0);
                y = (doc && doc.scrollTop  || body && body.scrollTop  || 0) - (doc && doc.clientTop  || body && body.clientTop  || 0);
            }
            if(SupportsTouches){
                var evt = ev.touches.item(0);//仅支持单点触摸,第一个触摸点
                x=evt.pageX;
                y=evt.pageY;
            }else{
                x += ev.clientX;
                y += ev.clientY;
            }
            return {'x' : x, 'y' : y};
    };
    function _drag(opt){
        this.el=typeof opt.el=='string'?$(opt.el):opt.el;//被拖动节点
        this.onstart=opt.start || new Function();//
        this.onmove=opt.move || new Function();
        this.onend=opt.end || new Function();
        this.action=false;
        this.init();
    }
    _drag.prototype={
        init:function(){
            this.el.style.position='relative';
            this.el['on'+StartEvent]=this.bind(function(e){//绑定节点的 [鼠标按下/触摸开始] 事件
                preventDefault(e);
                if(this.action)return false;
                else this.action=true;
                this.startPoint=getMousePoint(e);
                this.onstart();
                document['on'+MoveEvent]=this.bind(function(e){
                    preventDefault(e);//取消文档的默认行为[鼠标移动、触摸移动]
                    this.nowPoint=getMousePoint(e);
                    this.el.style.left=this.nowPoint.x-this.startPoint.x+'px';
                    this.el.style.top=this.nowPoint.y-this.startPoint.y+'px';
                    this.onmove();
                },this);
                document['on'+EndEvent]=document['ontouchcancel']=this.bind(function(){
                    document['on'+EndEvent]=document['ontouchcancel']=document['on'+MoveEvent]=null;
                    this.action=false;
                    this.onend();
                },this);
            },this);
        },
        bind:function(fn,obj){
            return function(){
                fn.apply(obj,arguments);
            }
        }
    }
    return function(opt){
        return new _drag(opt);
    }
})();

其实就是很简单的了,需要注意跌其实就是获取鼠标坐(getMousePoint)标的那里了,touches.item(0)表示第一个生效触摸点。

DEMO可以在此查看。(触摸效果请使用ios相关设备)

也可以查看http://www.qiqiboy.com/demo/2008/09/layout-test.html 的那个评分拖动长条。810CI55J_0

本文标签: , , , ,

分享

本文短网址: http://qiqi.boy.im/ey

这篇文章已经有 20 条评论

Comments (18) Trackbacks (2)
You can leave a response or Trackback this entry .
  1. liuqiqi -#1

    美美的沙发。。。 :oops:

  2. A.shun -#2

    orz
    来晚了阻止不了自沙

  3. WayJam -#3

    IOS的用户越来越多了。

  4. 刘印 -#4

    触摸时代来了哦、。
    越来越多的新款手机都是触摸屏。

  5. Maplews -#5

    好玩好玩~很牛b的~

  6. 奚少 -#6

    很有感觉啊~~

  7. 小邪 -#7

    来晚了-m-,twitter上面的发布真慢 ╮(╯▽╰)╭。

  8. IM路人 -#8

    高级技术文哟~~~~

  9. 无冷 -#9

    这个东西比ui插件好用多了

  10. 心随雨下 -#10

    你好,这个效果确实不错。但是,我想问一下,如果是地图怎样可以实现这样的拖动效果呢?

  11. windboy -#11

    我在我的android 4.0上不能拖动示例

  12. sp42 -#12

    感谢该文!首先学习了如何判断是否支持触控:”createTouch” in document

  13. uuus007 -#13

    你好, 我看了您写的这篇文章。但是我知不知道thisl.onstart(); 是做什么的? 在网上没有查到很好的资料,能不能帮解释一下。 谢谢

  14. uuus007 -#14

    我想知道 this.onstart() 做了一件什么事情?

  15. uuus007 -#15

    (⊙o⊙)… 刚才没有看清楚。。。。原来这个this.onstart() 是预留的一个函数在初始化的时候执行的。、。。。 现在明白了 打扰了

Leave a Reply

Hi , say something.

  • :?:
  • :razz:
  • :sad:
  • :evil:
  • :!:
  • :smile:
  • :oops:
  • :grin:
  • :eek:
  • :shock:
  • :???:
  • :cool:
  • :lol:
  • :mad:
  • :twisted:
  • :roll:
  • :wink:
  • :idea:
  • :arrow:
  • :neutral:
  • :cry:
  • :mrgreen: