2009-10-05 25 views
49

マウス移動イベントで動作するYUIスライダを使用しています。 touchmoveイベント(iPhoneとAndroid)に対応させたいtouchmoveイベントが発生した場合、どのようにマウス移動イベントを生成できますか? touchmoveのイベントがマウスの移動イベントにマップされ、スライダーで何も変更する必要がないことを、上部にいくつかのスクリプトを追加するだけでいいと思っています。マウスイベントへのタッチイベントのマッピングJavaScript

+0

これまでのコードは投稿できますか? –

+0

私はYUIライブラリのこれら2つのスライダを使用しています: http://developer.yahoo.com/yui/examples/slider/slider-ticks_clean.html http://developer.yahoo.com/yui/examples/ slider/slider_dual_with_highlight.html – Questioner

答えて

95

私は、これはあなたが望むものであると確信しています:

function touchHandler(event) 
{ 
    var touches = event.changedTouches, 
     first = touches[0], 
     type = ""; 
    switch(event.type) 
    { 
     case "touchstart": type = "mousedown"; break; 
     case "touchmove": type = "mousemove"; break;   
     case "touchend": type = "mouseup"; break; 
     default:   return; 
    } 

    // initMouseEvent(type, canBubble, cancelable, view, clickCount, 
    //    screenX, screenY, clientX, clientY, ctrlKey, 
    //    altKey, shiftKey, metaKey, button, relatedTarget); 

    var simulatedEvent = document.createEvent("MouseEvent"); 
    simulatedEvent.initMouseEvent(type, true, true, window, 1, 
            first.screenX, first.screenY, 
            first.clientX, first.clientY, false, 
            false, false, false, 0/*left*/, null); 

    first.target.dispatchEvent(simulatedEvent); 
    event.preventDefault(); 
} 

function init() 
{ 
    document.addEventListener("touchstart", touchHandler, true); 
    document.addEventListener("touchmove", touchHandler, true); 
    document.addEventListener("touchend", touchHandler, true); 
    document.addEventListener("touchcancel", touchHandler, true);  
} 

私はタッチイベントをキャプチャし、手動で一致するように、自分のマウスイベントを解雇しました。コードはそれほど一般的な目的ではありませんが、ほとんどの既存のドラッグアンドドロップライブラリ、おそらくほとんどの既存のマウスイベントコードに適応するのは簡単です。うまくいけば、このアイデアは、iPhone用のWebアプリケーションを開発している人々にとって便利なことでしょう。

アップデート:この投稿には

、私はすべてのタッチイベントにpreventDefaultを呼び出すと、正しく動作してからリンクを防ぐことができますことに気づきました。 preventDefaultに電話をかける主な理由は、電話機がスクロールしないようにすることで、コールはtouchmoveコールバックでのみ呼び出すことができます。このようにすることの唯一の欠点は、iPhoneがドラッグ元にホバーポップアップを表示することがあることです。それを防ぐ手段が見つかったら、私はこの記事を更新します。

2回目の更新:-webkit-touch-callout

私はコールアウトをオフにするCSSプロパティを見つけました。

+1

すべてのtouchmoveイベントがmousemoveイベントに変換されるわけではありません。例えば単に画面をスクロールダウンしたい場合は、touchmoveイベントも同様にトリガされますが、スクロールイベントに変換されます...! – nerdess

+0

キオスク用のタッチスクリーンモニターが、マウスが置かれている画面上に描画しない理由を理解しようとする一方で、 ChromeとFirefoxはこの点で違いがあるようです。 Firefoxでは、まだタッチスクリーンからマウス移動イベントが得られるが、Chromeではそうではないことがわかります。 –

+1

initMouseEventメソッドは現在廃止予定です(https://developer.mozilla.org/en/US/docs/Web/API/MouseEvent/initMouseEvent) –

5

@Mickey Shineの答えに沿って、Touch Punchは、クリックイベントへのタッチイベントのマッピングを提供します。このサポートはjQuery UIに組み込まれていますが、the codeは有益です。

1

私は最終的に、ミッキーのソリューションを使用して、彼のinit関数の代わりにこれを動作させる方法を見出しました。ここでinit関数を使用してください。

function init() { 
    document.getElementById('filter_div').addEventListener("touchstart", touchHandler, true); 
    document.getElementById('filter_div').addEventListener("touchmove", touchHandler, true); 
    document.getElementById('filter_div').addEventListener("touchend", touchHandler, true); 
    document.getElementById('filter_div').addEventListener("touchcancel", touchHandler, true); 
} 

ご覧の場合は「filter_divは、」我々は、チャートの範囲フィルタを持っており、その領域だけに私たちはタッチコントロールを書き換えたいのですチャート領域であります!

ありがとうミッキー。それは素晴らしい解決策でした。次のコードは、使用されるかもしれない、ここでカムバック将来のユーザーについては、

+2

あなたがdownvotingしている場合は、理由を追加してください! – Sana

3

var eventMap = {}; 

(function(){ 
var eventReplacement = { 
    "mousedown": ["touchstart mousedown", "mousedown"], 
    "mouseup": ["touchend mouseup", "mouseup"], 
    "click": ["touchstart click", "click"], 
    "mousemove": ["touchmove mousemove", "mousemove"] 
}; 


for (i in eventReplacement) { 
    if (typeof window["on" + eventReplacement[i][0]] == "object") { 
     eventMap[i] = eventReplacement[i][0]; 
    } 
    else { 
     eventMap[i] = eventReplacement[i][1]; 
    }; 
}; 
})(); 

そしてイベントでは、次のように使用します。

$(".yourDiv").on(eventMap.mouseup, function(event) { 
     //your code 
} 
0

エッジにミッキーのコードの作業@作りのためにとインターネットエクスプローラで、シミュレーションを実行する要素の.cssに次の行を追加します。

.areaWhereSimulationHappens { 
    overflow: hidden; 
    touch-action: none; 
    -ms-touch-action: none; 
} 

これらの行は、エッジとIEのデフォルトタッチを防止します。しかし、それを間違った要素に追加すると、スクロールも無効になります(タッチデバイスのエッジとIEではデフォルトで発生します)。

関連する問題