私は同じ必要性を持ち、touchwipeプラグインを拡張してイベントをwipeLeft、wipeRight、wipeUp、wipeDownコールバックに渡しました。それで私は設定でpreventDefaultEvents: false
を設定し、必要に応じて私の具体的なコールバックで、最初に行うことができます:e.preventDefault();
。
私はプラグインの著者に変更を送った。
修正プラグイン:
(function($) {
$.fn.touchwipe = function(settings) {
var config = {
min_move_x: 20,
min_move_y: 20,
wipeLeft: function(e) { },
wipeRight: function(e) { },
wipeUp: function(e) { },
wipeDown: function(e) { },
preventDefaultEvents: true
};
if (settings) $.extend(config, settings);
this.each(function() {
var startX;
var startY;
var isMoving = false;
function cancelTouch() {
this.removeEventListener('touchmove', onTouchMove);
startX = null;
isMoving = false;
}
function onTouchMove(e) {
if(config.preventDefaultEvents) {
e.preventDefault();
}
if(isMoving) {
var x = e.touches[0].pageX;
var y = e.touches[0].pageY;
var dx = startX - x;
var dy = startY - y;
if(Math.abs(dx) >= config.min_move_x) {
cancelTouch();
if(dx > 0) {
config.wipeLeft(e);
}
else {
config.wipeRight(e);
}
}
else if(Math.abs(dy) >= config.min_move_y) {
cancelTouch();
if(dy > 0) {
config.wipeDown(e);
}
else {
config.wipeUp(e);
}
}
}
}
function onTouchStart(e)
{
if (e.touches.length == 1) {
startX = e.touches[0].pageX;
startY = e.touches[0].pageY;
isMoving = true;
this.addEventListener('touchmove', onTouchMove, false);
}
}
if ('ontouchstart' in document.documentElement) {
this.addEventListener('touchstart', onTouchStart, false);
}
});
return this;
};
})(jQuery);
完璧です、本当にありがとうございました! – felixthehat
私はこれを試しましたが、左右にドラッグすると画面が引き続き動き、e.preventDefault()が完全に動作していないか、あまりにも遅く呼び出されます。私はシミュレータでテストしました...それは実際の電話では違うのですか? – Huangism
Huangism:ワイプ関数は、 'wipeLeft:function(e){...} 'のようにattrとしてイベントを受け取る必要があり、最初に' e.preventDafult(); 'を呼び出します。 –