以下のコードを使用して、「クリック」または「タッチスタート」イベントをバインドしています(jQueryの on(eventType, function() { ... })
を使用)。
var what = (navigator.userAgent.match(/iPad/i)) ? 'touchstart' : 'click';
後で:
$foo.on(what, function() { ... });
...これはiPadおよび「その他すべて」でうまく機能しますが、上記のコードに「iPadトンネルビジョン」があるのではないかと心配しています...
私の質問:
他のすべてのデバイス(たとえば、Android tablet)には同様の名前の「タッチスタート」イベントがありますか?その場合、これらのイベントタイプを説明できるように上記のコードを改善するにはどうすればよいですか?
言い換えると、上記のコード(iPadだけでなく)でより広範なタッチデバイスをどのように説明できますか?
あなたはこれについてどう思いますか:
var foo = ('ontouchstart' in window) ? 'touchstart' : ((window.DocumentTouch && document instanceof DocumentTouch) ? 'tap' : 'click');
注:上記のロジックのほとんどは Modernizrから です。
上記はFirefox/iPadで動作するようです...現時点でテストするものは他にありません。
上記について私が気に入っているのは、私がUAスニッフィングではないということです。 :)
tap
は他のすべてのタッチデバイスに適したデフォルトですか?
いくつかの ここに興味深い情報 、これにリンクします:
直接的な答えではありませんが、複数のプラットフォームやデバイスのクリック関連のイベントに直面したときに開発者が直面する状況の詳細を提供します。
いくつか ここで良い情報 も:
AndroidおよびiPhoneのタッチイベント
AndroidおよびiPhoneバージョンのWebKitには、いくつかの共通のタッチイベントがあります。
touchstart - triggered when a touch is initiated. Mouse equivalent - mouseDown touchmove - triggered when a touch moves. Mouse equivalent - mouseMove touchend - triggered when a touch ends. Mouse equivalent - mouseUp. This one is a bit special on the iPhone - see below touchcancel - bit of a mystery
それを読んだ後、上記のコードをこれに変更すると思います。
var foo = (('ontouchstart' in window) || (window.DocumentTouch && document instanceof DocumentTouch)) ? 'touchstart' : 'click';
IPad/iPhone以外にアクセスできないという質問を最初に聞いたとき、touchstart
はiOS固有のイベントであると想定しました。 touchstart
とclick
がタッチデバイスのベースのすべてではないにしてもほとんどをカバーするようになりました。
何か助けがあれば、ここにいくつかのユーティリティクラスを投稿しました。
[no-js] [no-touch] CSSおよび/またはJSで使用する
js
またはtouch
クラスを追加するHTMLテンプレートを組み込むJavaScriptユーティリティ。
IOSとAndroidにはタッチイベントがありますが、WindowsはIEでMSPointerイベントを使用します。クロスデバイスソリューションが必要な場合は、pointer.jsを試すか、学習します。
タッチ環境下にあるかどうかを判断するために、UAを使用しないことを強くお勧めします。
代わりにModernizrを使用してください: http://modernizr.com/ 以下のコードは、Windows Phone 7は通常のブラウザのタッチイベント。ただし、WP8はおそらく正しく認識されるでしょう。
if (Modernizr.touch){
// bind to touchstart, touchmove, etc and watch `event.streamId`
} else {
// bind to normal click, mousemove, etc
}
これはあなたのために働くかもしれません:
var clickEvent = ((document.ontouchstart!==null)?'click':'touchstart');
$("#mylink").on(clickEvent, myClickHandler);