diff --git a/swipe.js b/swipe.js index 73951cb..74afd4f 100644 --- a/swipe.js +++ b/swipe.js @@ -214,22 +214,33 @@ rcube_webmail.prototype.swipe_event = function(opts) { 'startevent': 'pointerdown', 'moveevent': 'pointermove', 'endevent': 'pointerup', + 'cancelevent': 'pointercancel', 'id': function(e) { return e.pointerId; }, 'type': function(e) { return e.pointerType; }, - 'pos': function(e, x) { return e.originalEvent[ x ? 'pageX' : 'pageY']; } + 'pos': function(e, x) { return e.originalEvent[ x ? 'pageX' : 'pageY']; }, + 'clearswipe': function(e) { + rcmail.swipe_position_target(opts[touchstart.axis].target_obj, 0, touchstart.axis == 'vertical'); + $('#swipe-action').removeClass().hide(); + opts[touchstart.axis].target_obj.removeClass('swipe-active'); + $(rcmail.gui_objects.messagelist).removeClass('swipe-block'); + touchstart = {}; + rcmail.env.swipe_active = null; + + if (opts.parent_obj) + opts.parent_obj.off(touchevents.moveevent, rcube_event.cancel); + } }; var touchstart = {}; // fallback to touch events if there is no pointer support if (!bw.pointer) { - touchevents = { - 'startevent': 'touchstart', - 'moveevent': 'touchmove', - 'endevent': 'touchend', - 'id': function(e) { return e.changedTouches.length == 1 ? e.changedTouches[0].identifier : -1; }, - 'type': function(e) { return 'touch'; }, - 'pos': function(e, x) { return e.originalEvent.targetTouches[0][ x ? 'pageX' : 'pageY']; } - }; + touchevents.startevent = 'touchstart'; + touchevents.moveevent = 'touchmove'; + touchevents.endevent = 'touchend'; + touchevents.cancelevent = 'touchcancel'; + touchevents.id = function(e) { return e.changedTouches.length == 1 ? e.changedTouches[0].identifier : -1; }; + touchevents.type = function(e) { return 'touch'; }; + touchevents.pos = function(e, x) { return e.originalEvent.targetTouches[0][ x ? 'pageX' : 'pageY']; }; } // swipe down on message list container @@ -276,22 +287,15 @@ rcube_webmail.prototype.swipe_event = function(opts) { if (!temp_axis || !opts[temp_axis] || (rcmail.env.swipe_active && rcmail.env.swipe_active != temp_axis)) return; - if (temp_axis == 'vertical') { - if (!bw.pointer && (changeY < 0 || (changeY > 0 && opts.vertical.target_obj.parent().scrollTop() > 0))) { - return; - } - else if (changeY < 0) { - $('#swipe-action').removeClass().hide(); + // do not interfere with normal message list scrolling + if (temp_axis == 'vertical' && (changeY < 0 || opts.vertical.target_obj.parent().scrollTop() != 0)) { + if (bw.pointer && touchstart.scrollable) + rcmail.env.swipe_parent.css('touch-action', 'pan-y'); - if (touchstart.scrollable) - rcmail.env.swipe_parent.css('touch-action', 'pan-y'); + if (touchstart.axis) + touchevents.clearswipe(e); - return; - } - else if (opts.vertical.target_obj.parent().scrollTop() != 0) { - // prevent accidental firing during overscroll (eg fast scroll to top) - return; - } + return; } // save the axis info @@ -344,21 +348,16 @@ rcube_webmail.prototype.swipe_event = function(opts) { .on(touchevents.endevent, function(e) { if (touchevents.type(e) == 'touch' && touchstart.id == touchevents.id(e) && rcmail.env.swipe_active && rcmail.env.swipe_active == touchstart.axis && opts[touchstart.axis].target_obj.hasClass('swipe-active')) { - rcmail.swipe_position_target(opts[touchstart.axis].target_obj, 0, touchstart.axis == 'vertical'); - var callback = null; if (callback = $('#swipe-action').data('callback')) callback({'uid': opts[touchstart.axis].uid, 'obj': opts[touchstart.axis].target_obj, 'originalEvent': e}); - $('#swipe-action').removeClass().hide(); - opts[touchstart.axis].target_obj.removeClass('swipe-active'); - $(rcmail.gui_objects.messagelist).removeClass('swipe-block'); - touchstart = {}; - rcmail.env.swipe_active = null; - - if (opts.parent_obj) - opts.parent_obj.off(touchevents.moveevent, rcube_event.cancel); + touchevents.clearswipe(e); } + }) + .on(touchevents.cancelevent, function(e) { + if (touchstart.axis) + touchevents.clearswipe(e); }); }