Javascript iPhone上的触摸事件

Javascript iPhone上的触摸事件,javascript,jquery,ios,Javascript,Jquery,Ios,我正在尝试制作一个可以在触摸事件中系统地打开的非画布菜单。当我点击主体并拖动它打开菜单时,它在我的浏览器上运行良好 然而,它在iPhone上失败了。我的控制台上显示的错误是 TypeError: 'undefined' is not an object (evaluating 'event.touches[0]') 此函数上的: getTouchCoordinates: function(event) { if ( s.touchSupported ) { var t

我正在尝试制作一个可以在触摸事件中系统地打开的非画布菜单。当我点击主体并拖动它打开菜单时,它在我的浏览器上运行良好

然而,它在iPhone上失败了。我的控制台上显示的错误是

TypeError: 'undefined' is not an object (evaluating 'event.touches[0]')
此函数上的:

  getTouchCoordinates: function(event) {

    if ( s.touchSupported ) {
      var touchEvent = event.touches[0];
      return { x:touchEvent.pageX, y:touchEvent.pageY }
    }
    else {
      return { x:event.screenX, y:event.screenY };
    }

  },
菜单的完整代码如下所示:

document.addEventListener('touchmove', function (e) { e.preventDefault(); }, false);

var s,
app = {

  settings: {

    touchSupported: ('ontouchstart' in window), 
    start_event: "", 
    move_event: "",
    end_event: "",
    main: $("#body"),
    sidebar: $("#sidebar"),
    gestureStarted: false,
    bodyOffset: 0,
    sidebarWidth: 250,
    gestureStartPosition: "",
    gestureS: "",
    target: ""

  },

  init: function() {

    s = this.settings;
    this.touchHandlers();
    this.bindUIActions();

  },

  bindUIActions: function() {

    s.main.bind(s.start_event, function(e){

          s.gestureStartPosition = app.getTouchCoordinates(e);
          s.gestureS = app.getTouchCoordinates(e);

          s.main.bind(s.move_event, function(e){

              var pos = app.getTouchCoordinates(e);

              var currentPosition = app.getTouchCoordinates( event );

              if ( s.gestureStarted ) {

                event.preventDefault();
                event.stopPropagation();
                app.updateBasedOnTouchPoints( currentPosition.x );
                return;

              }

              else {

                if ( Math.abs( currentPosition.y - s.gestureStartPosition.y ) > 50 ) {

                  //unbind events here
                  s.main.unbind(s.end_event); 
                  s.main.unbind(s.move_event); 
                  return;

                }

                else if ( Math.abs( currentPosition.x - s.gestureStartPosition.x ) > 0 ) {

                  s.gestureStarted = true;

                  event.preventDefault();
                  event.stopPropagation();
                  app.updateBasedOnTouchPoints( currentPosition.x );
                  return;
                }

              }

          });

          s.main.bind(s.end_event, function(e){

              var currentPosition = app.getTouchCoordinates( event );

              if ( s.gestureStarted ) {

                  s.main.css("left", "0px" );
                  //console.log(s.gestureS.x+" "+currentPosition.x);

                  var c = s.bodyOffset ; 
                  var t; 

                  // check if open or close 
                  if ( (s.gestureS.x - currentPosition.x) < 0 ) {

                      //console.log("open"); 
                      t = s.sidebarWidth; 

                  } else {

                      //console.log("close"); 
                      t = 0 ; 

                  }

                  if ( c != t ) {

                      s.main.stop(true, false).animate({
                          left:t,
                          avoidTransforms:false,
                          useTranslate3d: true
                      }, 100);

                      s.sidebar.trigger( "slidingViewProgress", { current:t, max:s.sidebarWidth } );

                  }


              }

              s.gestureStarted = false;


              //unbind events here
              s.main.unbind(s.end_event); 
              s.main.unbind(s.move_event); 

          });

    });

  }, 

  touchHandlers: function() {

    s.start_event = s.touchSupported ? 'touchstart' : 'mousedown';
    s.move_event = s.touchSupported ? 'touchmove' : 'mousemove';
    s.end_event = s.touchSupported ? 'touchend' : 'mouseup';


  },

  getTouchCoordinates: function(event) {

    if ( s.touchSupported ) {
      var touchEvent = event.touches[0];
      return { x:touchEvent.pageX, y:touchEvent.pageY }
    }
    else {
      return { x:event.screenX, y:event.screenY };
    }

  },

  updateBasedOnTouchPoints: function( currentPosition ) {


    var deltaX = (currentPosition - s.gestureStartPosition.x) ; 
    var targetX = (s.bodyOffset + deltaX);

    targetX = Math.max( targetX, 0 );
    targetX = Math.min( targetX, s.sidebarWidth );

    s.bodyOffset = targetX;

    s.target = targetX; 

    if ( s.main.css("left") != "0px" ) {
      s.main.css("left", "0px" );
    }

    s.main.css("-webkit-transform", "translate3d(" + targetX + "px,0,0)" );
    s.main.css("-moz-transform", "translate3d(" + targetX + "px,0,0)" );
    s.main.css("transform", "translate3d(" + targetX + "px,0,0)" );


    s.sidebar.trigger( "slidingViewProgress", { current: targetX, max:s.sidebarWidth } );
    s.gestureStartPosition.x = currentPosition;

  }

};

(function() {

    app.init();

})();
document.addEventListener('touchmove',函数(e){e.preventDefault();},false);
var s,
应用={
设置:{
支持触摸屏:(“窗口中的“ontouchstart”),
启动事件:“”,
移动事件:“”,
结束事件:“”,
正文:$(“#正文”),
边栏:$(“#边栏”),
手势开始:假,
车身偏移量:0,
边栏宽度:250,
手势开始位置:“”,
手势:“,
目标:“
},
init:function(){
s=此参数设置;
this.touchHandlers();
这个.bindUIActions();
},
bindUIActions:function(){
s、 main.bind(s.start_事件,函数(e){
s、 gestureStartPosition=app.getTouch坐标(e);
s、 手势=app.getTouchCoordinates(e);
s、 main.bind(s.move_事件,函数(e){
var pos=应用程序GetTouch坐标(e);
var currentPosition=app.getTouchCoordinates(事件);
如果(s.GestureStart){
event.preventDefault();
event.stopPropagation();
应用程序UpdateBaedOnTouchPoints(currentPosition.x);
返回;
}
否则{
如果(数学绝对值(currentPosition.y-s.gestureStartPosition.y)>50){
//在此处取消绑定事件
s、 主。解除绑定(s.end_事件);
s、 main.unbind(s.move_事件);
返回;
}
else if(Math.abs(currentPosition.x-s.gestureStartPosition.x)>0){
s、 gestureStarted=true;
event.preventDefault();
event.stopPropagation();
应用程序UpdateBaedOnTouchPoints(currentPosition.x);
返回;
}
}
});
s、 main.bind(s.end_事件,函数(e){
var currentPosition=app.getTouchCoordinates(事件);
如果(s.GestureStart){
s、 main.css(“左”、“0px”);
//console.log(s.signatures.x+“”+currentPosition.x);
var c=s.bodyOffset;
变量t;
//检查是否打开或关闭
如果((s.signatures.x-currentPosition.x)<0){
//控制台日志(“打开”);
t=侧边栏宽度;
}否则{
//控制台日志(“关闭”);
t=0;
}
如果(c!=t){
s、 main.stop(真、假)。设置动画({
左:t,,
避免:错误,
useTranslate3d:正确
}, 100);
s、 触发器(“slidingViewProgress”,{current:t,max:s.sidebarWidth});
}
}
s、 手势开始=假;
//在此处取消绑定事件
s、 主。解除绑定(s.end_事件);
s、 main.unbind(s.move_事件);
});
});
}, 
touchHandlers:function(){
s、 start_event=s.touchSupported?'touchstart':'mousedown';
s、 move_event=s.touchSupported?'touchmove':'mousemove';
s、 end_event=s.touchSupported?'touchend':'mouseup';
},
getTouchCoordinates:函数(事件){
如果(支持触摸屏){
var touchEvent=event.touch[0];
返回{x:touchEvent.pageX,y:touchEvent.pageY}
}
否则{
返回{x:event.screenX,y:event.screenY};
}
},
updateBasedOnTouchPoints:函数(currentPosition){
var deltaX=(当前位置-s.gestureStartPosition.x);
var targetX=(s.bodyOffset+deltaX);
targetX=数学最大值(targetX,0);
targetX=数学最小值(targetX,s.sidebarWidth);
s、 bodyOffset=targetX;
s、 target=targetX;
如果(s.main.css(“左”)!=“0px”){
s、 main.css(“左”、“0px”);
}
s、 css(“-webkit transform”,“translate3d”(+targetX+“px,0,0)”);
s、 css(“-moz-transform”,“translate3d”(+targetX+“px,0,0)”);
s、 css(“transform”,“translate3d”(+targetX+“px,0,0)”);
s、 触发器(“slidingViewProgress”,{current:targetX,max:s.sidebarWidth});
s、 gestureStartPosition.x=当前位置;
}
};
(功能(){
app.init();
})();
您可以试试:

 event.originalEvent.touches