39

テーブルのクラスを変更するコードがあります。電話では、テーブルが画面に対して広すぎて、ユーザーがドラッグ/スクロールして内容を確認する場合があります。ただし、テーブルをタッチしてドラッグすると、ドラッグするたびにタッチエンドがトリガーされます。

タッチエンドがタッチドラッグの結果であるかどうかを確認するにはどうすればよいですか?ドラッグスタートとドラッグエンドを追跡しようとしましたが、それを機能させることができず、エレガントでないアプローチのようです。「このタッチエンドはドラッグの最後に来ましたか?」と本質的に判断するものを以下に追加できますか?

$("#resultTable").on("touchend","#resultTable td",function(){ 
        $(this).toggleClass('stay');
});

よろしくお願いします。

PS-最新のjqueryを使用しており、通常のクリックは機能しますが、タッチエンドと比較すると非常に低速です。

4

4 に答える 4

67

2 つのリスナーを使用します。

最初に変数を false に設定します。

var dragging = false;

次に、ontouchmove でドラッグを true に設定します

$("body").on("touchmove", function(){
      dragging = true;
});

次に、ドラッグが完了したら、ドラッグが true かどうかを確認し、そうであればドラッグされたタッチとしてカウントします。

$("body").on("touchend", function(){
      if (dragging)
          return;

      // wasn't a drag, just a tap
      // more code here
});

タッチ エンドは引き続き起動しますが、タップ スクリプトが実行される前に終了します。

次回タッチしたときにドラッグ済みとして設定されていないことを確認するには、タッチダウン時に false にリセットします。

$("body").on("touchstart", function(){
    dragging = false;
});
于 2012-10-17T21:15:58.360 に答える
1

私の問題に対する1つの解決策がここにあるようです:

http://alxgbsn.co.uk/2011/08/16/event-delegation-for-touch-events-in-javascript/

このコードは、tapend 後のタップ動作を中止するために、touchstart 後の動きを検出します。

var tapArea, moved, startX, startY;

tapArea = document.querySelector('#list'); //element to delegate
moved = false; //flags if the finger has moved
startX = 0; //starting x coordinate
startY = 0; //starting y coordinate

//touchstart           
tapArea.ontouchstart = function(e) {

    moved = false;
    startX = e.touches[0].clientX;
    startY = e.touches[0].clientY;
};

//touchmove    
tapArea.ontouchmove = function(e) {

    //if finger moves more than 10px flag to cancel
    //code.google.com/mobile/articles/fast_buttons.html
    if (Math.abs(e.touches[0].clientX - startX) > 10 ||
        Math.abs(e.touches[0].clientY - startY) > 10) {
            moved = true;
    }
};

//touchend
tapArea.ontouchend = function(e) {

    e.preventDefault();

    //get element from touch point
    var element = e.changedTouches[0].target;

    //if the element is a text node, get its parent.
    if (element.nodeType === 3) { 
        element = element.parentNode;
    }

    if (!moved) {
        //check for the element type you want to capture
        if (element.tagName.toLowerCase() === 'label') {
            alert('tap');
        }
    }
};

//don't forget about touchcancel!
tapArea.ontouchcancel = function(e) {

    //reset variables
    moved = false;
    startX = 0;
    startY = 0;
};

詳細はこちら: https://developers.google.com/mobile/articles/fast_buttons

于 2012-10-02T16:06:38.577 に答える
0

ユーザーがドラッグしてコンテンツを表示したり、要素をドラッグしたりしても、違いはわかりません。アプローチを変えるべきだと思います。モバイル デバイスであるかどうかを検出し、要素の移動を有効/無効にするスイッチを描画できます。

于 2012-10-02T15:22:54.260 に答える
0

@lededge のソリューションを短縮するには、これが役立つ場合があります。

$("body").on("touchmove", function(){
   dragging = true;
}).on("touchend", function(){
   if (dragging)
      return;
}).on("touchstart", function(){
   dragging = false;
});
于 2019-04-05T08:52:56.540 に答える