touchstart
には、必要になる可能性のあるすべての値(x、y、targetなど)を格納できます。タッチごとに一意である必要があるtouchend
値のおかげで、保存されているすべての値を取得できます。Touch.identifier
ここで概念実証を作成しました:http:
//jsbin.com/adifit/3/
以下のコードは、位置x
とy
位置のみを追跡しますが、必要に応じて任意のプロパティを追跡できます。
コードの背後にある考え方は次のとおりです。
- オブジェクトを
touchstart
作成し、その中にすべてのデータ(タッチIDを含む)を保存する
- このオブジェクトを配列に格納します
- タッチのIDを
touchend
確認し、配列内の対応するオブジェクトを見つけてください
- 見つかった場合は、完了しました。
そしてコード:
var touches = [];
var cons;
$(init);
function init()
{
cons = $("#console");
document.getElementById("area").addEventListener("touchstart", onTouchStart);
document.addEventListener("touchend", onTouchEnd);
document.addEventListener("touchcancel", onTouchEnd);
}
function onTouchStart(e)
{
e.preventDefault();
var touchList = e.changedTouches;
var touch;
for(var i = 0; i < touchList.length; i++)
{
cons.html(cons.html() + "startX: " + touchList[i].screenX + ", id: " + touchList[i].identifier + "<br/>");
touch = {x: touchList[i].screenX, y: touchList[i].screenY, id: touchList[i].identifier};
touches.push(touch);
}
}
function onTouchEnd(e)
{
cons.html(cons.html() + "<strong>TouchEnd:</strong><br/>");
var touchList = e.changedTouches;
var touch;
for(var i = 0; i < touchList.length; i++)
{
touch = {x: touchList[i].screenX, y: touchList[i].screenY, id: touchList[i].identifier};
for (var j = touches.length - 1; j >= 0 ; j--)
{
if (touches[j].id == touch.id)
{
cons.html(cons.html() + "<strong>startX: "+ touches[j].x+ ", id: " + touchList[i].identifier + "</strong><br/>");
touches.splice(j, 1);
}
}
}
}
上記のコードはjQueryを使用していますが、結果を画面に表示するためにのみ使用されており、jQueryは他の目的には使用されていません。