2013-07-30 4 views
17

touchendイベントでタッチ座標をキャプチャしようとしていますが、未定義です。 touchstartイベントは正常に機能しますが、同じコンセプトはtouchendで失敗します。私はこのコードをmousedownmouseupthatで作成しました。どのようにtouchend座標をキャプチャするのですか?

私には何が欠けていますか?

div.addEvent("touchstart", function (event) { 
    event.preventDefault(); // to avoid scrolling 
    span.innerHTML = event.page.x; 
}); 
div.addEvent("touchend", function (event) { 
    span.innerHTML = event.page.x; 
}); 

FIDDLE

答えて

23

あなたはtouchmoveに値を格納し、touchendでそれを読む必要があります。

var lastMove = null; 

// Save the touchstart to always have a position 
div.addEvent('touchstart', function(event) { 
    lastMove = event; 
}); 

// Override with touchmove, which is triggered only on move 
div.addEvent('touchmove', function(event) { 
    lastMove = event; 
}); 
+0

それは簡単でしたか?ありがとう! 'mouseup'に' mousemove'がなければどうしてうまくいくのですか? – Rikard

+1

私はそれを知らない。そして、私はtouchendイベントが終わった位置を含むだろうと推測しただろうが、タッチがそのエリアを出るときのように、可能でない角の場合があるかもしれない(**の明白な価値を与えることは不可能である現在の**がわかっていても)。 'mouseup'はエリア内で* always *であり、エリアが終了すると' mouseout'が使用されます。 – adrenalin

+0

意味があります。ありがとうございました! – Rikard

19

私はspecificationで見てきた、4タッチイベントは時に全てのタッチ(画面上のすべての指)に関する情報を含む3リストatributesを持つtouchEventオブジェクト、継承各リストは、次の基準に基づいてタッチを保存します。

changedTouches:ターゲット要素サーフェスから外れている接触を保存します。

touches:現在のすべてのタッチを保存します。

targetTouch:ターゲット要素の表面内にある現在のタッチをすべて保存します。

指が離された位置がchangedTouchesに保存され、何も他のリストに保存されないため、これにアクセスする必要がある場合はevent.changedTouches[event.changedTouches.length-1]を使用する必要があります。これはpageXで座標のpageY属性。
行全体は次のようになります。

​​

何があなたがtouchstartとtouchmoveイベントでそれらを使用して取得する理由touchEventオブジェクトにatributes座標、およびいない場合は私がまだ理解できていないことはありませんtouchendと。実装でこのショートカットが追加されたか、または私が間違っています。

+0

これは私が必要としていたものです。一部のデバイスでは、動きがタップのようなものであれば、touchmoveはトリガされません。タッチモーブ内からのイベントの保存に失敗しました。この方法は毎回有効です。 :) –

+0

e.originalEvent.changedTouches [...] – rttmax

+0

touchendのハンドラにあるイベントオブジェクトのoriginalEventは未定義です。 –

2

あなたは質問がjQueryのを要求しませんでしたけどあなたはjQueryの代替が必要な場合は、このコードを試してみてくださいchangedTouches代わりtouches

div.addEvent("touchstart", function (event) { 
    event.preventDefault(); // to avoid scrolling 
    span.innerHTML = event.pageX; 
}); 
div.addEvent("touchend", function (event) { 
    span.innerHTML = event.changedTouches[0].pageX; 
}); 
0
touchStart(event) { 
    this.startX = event.touches[0].pageX; 
}, 
touchEnd(event) { 
    this.endX = event.changedTouches[0].pageX; 
}, 
+1

追加情報を提供して回答を拡大してください。あなたのコードを説明するのに1つか2つの文章で十分です。 – Frits

1

touchendで使用する必要があります。 jQueryのすべての最新バージョンで動作します。

$(document).on('touchstart', '.className', function (e) { 
    console.log(e.originalEvent.touches[0].pageX); 
}); 
$(document).on('touchend', '.className', function (e) { 
    console.log(e.originalEvent.changedTouches[0].pageX); 
}); 

あなたは、必要に応じて「originalEvent」を省略し、JSのための「changedTouches」はスクリプトとサポートしていませんjQueryの/ブラウザを使用することができます。