Javascript iPhone上的触摸事件
我正在尝试制作一个可以在触摸事件中系统地打开的非画布菜单。当我点击主体并拖动它打开菜单时,它在我的浏览器上运行良好 然而,它在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
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