JavaScriptを使用したタッチスクリーンデバイスの検出


129

Javascript / jQueryでは、クライアントデバイスにマウスがあるかどうかをどのように検出できますか?

ユーザーがアイテムの上にマウスを置いたときに小さな情報パネルを上にスライドするサイトがあります。ホバーを検出するためにjQuery.hoverIntentを使用していますが、これは明らかにiPhone、iPad、Androidなどのタッチスクリーンデバイスでは機能しません。これらのデバイスでは、タップして情報パネルを表示するように戻します。


6
なぜ両方できないのですか?タッチスクリーン以外のデバイスではタップ機能は望ましくありませんか?
EMPraptor 2010

1
一部の新しいデバイスはをサポートしていないため:hover:hover純粋に表面的な目的で使用することをお勧めします(1つのスタイルシートを複数のデバイスにコーディングする場合)。
2010

@empraptor:良い点-はい、私はそれを行うことができました。ただし...タッチスクリーンデバイスに常にパネルを表示することも考えていました。その場合、サポートを検出できる必要があります。
ブラッド・ロビンソン

パネルを常にタッチスクリーンデバイスで表示できるのであれば、他のデバイスでも表示できないでしょうか。パネルはどのくらいの大きさで、ホバー/タップでのみ表示することが望ましいのですか?
EMPraptor 2010

回答:


12

+1 hoverclickその両方。もう1つの方法は、CSSメディアクエリを使用して、タッチ/タップ機能を備えている可能性が最も高い、より小さな画面/モバイルデバイスに対してのみいくつかのスタイルを使用することです。したがって、CSSを介して特定のスタイルがあり、jQueryからそれらの要素をチェックしてモバイルデバイスのスタイルプロパティを確認すると、それらに接続してモバイル固有のコードを記述できます。

こちらをご覧くださいhttp : //www.forabeautifulweb.com/blog/about/hardboiled_css3_media_queries/


1
良い解決策は、おそらくone()バインドを使用してホバーチェックのようなものを実行できるため、初回のみ起動することです。
ティモシーペレス、

問題は、画面の幅でターゲットを設定した後、デバイスを回転させた場合(iPhone 6+ 736x414を取り上げましょう)、同じスタイルにならないことです。したがって、最善の解決策ではありません:/
antoni

266
var isTouchDevice = 'ontouchstart' in document.documentElement;

:デバイスがタッチイベントをサポートしているからといって、必ずしもタッチスクリーンデバイスのみであるとは限りません。多くのデバイス(私のAsus Zenbookなど)は、実際のタッチ入力メカニズムがない場合でも、クリックイベントとタッチイベントの両方をサポートしています。タッチサポート用に設計する場合は、常にクリックイベントサポートを含め、デバイスがどちらか一方だけであると想定しないでください。


33
Modernizrのドキュメントで説明されているように、これはデバイスの機能ではなくブラウザの機能のみを検出します...タッチ対応のブラウザを実行しているタッチ入力のないデバイスでは、誤検知の結果が表示されます。タッチイベントが発生するのを待つだけで、デバイスのタッチ機能をネイティブに検出する方法がわかりません。
Stu Cox

12
私が使用しているIE 10タッチも検出するには、次のようにします。(window.navigator.msMaxTouchPoints ||(document.documentElementの 'ontouchstart'));
Alexander Kellett 2013年

2
'ontouchstart' in document.documentElement BlackBerry 9300で誤ってtrueを返す
2013年

10
@typhon ソフトウェア(Win 8、最新のブラウザ)がタッチをサポートしている場合、これは常に当てはまります。タッチをサポートしていないハードウェア(デスクトップ、標準モニタ、マウス、キーボード)を使用している場合でも同様です。したがって、このソリューションは古くなっています。
Barney

1
funnyItsNotCamelCaseAsJsIsThroughout。つまり、コードをコピー、貼り付け、編集する必要があるということです。:)
Ross

20

window.TouchのテストはAndroidでは機能しませんでしたが、これは機能します。

function is_touch_device() {
  return !!('ontouchstart' in window);
}

記事を参照してください:JavaScriptを使用して「タッチスクリーン」デバイスを検出する最良の方法は何ですか?


これはタッチスクリーンを検出しますが、タッチスクリーンを備えたラップトップでもTRUEを返すため、注意が必要です。ユーザーが電話/タブレットまたはコンピューター/ラップトップのどちらからのものかを区別しようとしている場合、これは問題になる可能性があります。タッチスクリーンを備えたラップトップの場合、TRUEが返されるためです。
2017

8
return (('ontouchstart' in window)
      || (navigator.maxTouchPoints > 0)
      || (navigator.msMaxTouchPoints > 0));

msTouchPointsと一緒にmaxTouchPointsを使用する理由:

Microsoftは、Internet Explorer 11以降、このプロパティのプレフィックスバージョン(msMaxTouchPoints)のMicrosoftベンダーを削除する可能性があると述べており、代わりにmaxTouchPointsを使用することを推奨しています。

ソース:http : //ctrlq.org/code/19616-detect-touch-screen-javascript


これは機能し、Google Chromeデベロッパーツールで機能しました。デバイスのシミュレーションに感謝します
Behnam Mohammadi 2016

7
if ("ontouchstart" in window || navigator.msMaxTouchPoints) {
    isTouch = true;
} else {
    isTouch = false;
}

どこでも動作します!!


そして、それはマウスと何の関係があるのでしょうか?(実際の質問)
hexalys 2014

それはもっと簡単でしょうisTouch = "ontouchstart" in window || navigator.msMaxTouchPoints;
Andrew


4

Google Chromeはこれについて誤検知を返すようです:

var isTouch = 'ontouchstart' in document.documentElement;

「タッチイベントをエミュレート」する機能(F12->右下の設定->「オーバーライド」タブ->最後のチェックボックス)に何らかの関係があると思います。デフォルトで無効になっていることはわかっていますが、結果の変更と関連付けます(Chromeで使用される「in」メソッド)。しかし、私がテストした限り、これは機能しているようです:

var isTouch = !!("undefined" != typeof document.documentElement.ontouchstart);

typeofが「オブジェクト」である状態でそのコードを実行したすべてのブラウザーですが、未定義以外のすべてであることを知っていると、私はより確信します:-)

IE7、IE8、IE9、IE10、Chrome 23.0.1271.64、Chrome for iPad 21.0.1180.80およびiPad Safariでテスト済み。誰かがさらにいくつかのテストを行い、結果を共有するのは素晴らしいことです。


どちらの方法でも、FF 23とChrome 28を搭載したWin 8 PCで誤検知が返されます。これは常に当てはまるのですか、それとも、FFとChromeをインストールする前に、このコンピューターにタッチスクリーンを接続したことがあるからでしょうか。「タッチイベントのエミュレート」オプションを設定していません。
タイフォン2013

ええと、それは常に新しいハードウェアとの戦いです。ブラウザはOSのアブストラクションレイヤで動作する必要があります...これは常にすべてを実装するわけではありません...つまり、JSではブラウザに依存する必要があります:)普遍的な方法は決してありません。
Ash

どちらも非タッチラップトップ上のUbuntu Firefoxでtrueを返します。
NoBugs 2015

4

私のサイトの1つにこれを書いて、おそらく最も確実なソリューションです。特に、Modernizrでもタッチ検出で誤検知が発生する可能性があるためです。

jQueryを使用している場合

$(window).one({
  mouseover : function(){
    Modernizr.touch = false; // Add this line if you have Modernizr
    $('html').removeClass('touch').addClass('mouse');
  } 
});

または単に純粋なJS ...

window.onmouseover = function(){ 
    window.onmouseover = null;
    document.getElementsByTagName("html")[0].className += " mouse";
}

4
ただし注意してください:少なくともiPadは
マウスオーバーで

14
くそーりんご!
ティモシーペレス2013年

また、WindowsタブレットでIEを使用している人は、タッチとマウスの両方を使用したい場合があります。
Sebazzz 2013年

この投稿は、Windowsタブレットが登場する前に作成されました。
ティモシーペレス

@ s427-Fecking IE ... IE8のチェックを行います。IE8以下のモバイルデバイスはないと思います。
ティモシーペレス

4

私の最初の投稿/コメント:「タッチスタート」がクリックの前にトリガーされることは誰もが知っています。また、ユーザーがページを開いたときに、1)マウスを動かす2)クリックする3)画面をタッチする(スクロールする、または... :))

何か試してみましょう:

//->開始:jQuery

var hasTouchCapabilities = 'ontouchstart' in window && (navigator.maxTouchPoints || navigator.msMaxTouchPoints);
var isTouchDevice = hasTouchCapabilities ? 'maybe':'nope';

//attach a once called event handler to window

$(window).one('touchstart mousemove click',function(e){

    if ( isTouchDevice === 'maybe' && e.type === 'touchstart' )
        isTouchDevice = 'yes';
});

// <-終了:jQuery

ごきげんよう!


3

ディスカッションで上記のコードをテストしました

 function is_touch_device() {
    return !!('ontouchstart' in window);
 }

Android Mozilla、Chrome、Opera、Androidのデフォルトブラウザー、iPhoneのSafariで動作します。

私にはしっかりしているようです:)


とてもシンプルで私にとってはうまくいきます。Android(旧Galaxy Note)、エミュレーター(Chrome)、iPadでテスト済み。
ラルフ

Chromeで私に対して誤検知を返します。
James


2

これは私にとってはうまくいきます:

function isTouchDevice(){
    return true == ("ontouchstart" in window || window.DocumentTouch && document instanceof DocumentTouch);
}

1
テストしたプラットフォーム、ブラウザ、OS、デバイスの数はいくつですか?
BerggreenDK 2013年

1
FF、Chrome、Safari(AndroidおよびiOS(iPad))
Turtletrail 2013

1
いいね。デスクトップでテストしたところ、多くの「未定義」があり、IF構造が少しハックになっています。次のように、戻り値を少しだけ調整した場合:return true ==( "ontouchstart" in window || window.DocumentTouch && document instanceof DocumentTouch); 次に、真または偽があります:-)
BerggreenDK 2013

2
Chromeでは、ウィンドウの "ontouchstart"はタッチスクリーンなしのPCでtrueなので、これは機能しません。前に述べたように、これはブラウザがタッチ対応かどうかをテストします。また、true ==は何もしないので省略してください。
rakensi 2014年

1
エミュレーターが組み込まれているChromeでこれを試してみると、エミュレーターでスイッチをオンにするとタッチが検出され、スイッチをオフにするとタッチが検出されません。だから私にとってはうまくいきます。ただし:||を使用しないPrasad(下記)の短いバージョンを使用しています。Turtletrailのコードで。そして:私はそれが100%のデバイスで動作するかどうか気にしません。99%は私のために行います。
ラルフ

1

あなたが使用している場合はModernizrを、それは非常に使いやすいですModernizr.touch先に述べたように。

ただし、Modernizr.touch安全のために、とユーザーエージェントのテストを組み合わせて使用​​することを好みます。

var deviceAgent = navigator.userAgent.toLowerCase();

var isTouchDevice = Modernizr.touch || 
(deviceAgent.match(/(iphone|ipod|ipad)/) ||
deviceAgent.match(/(android)/)  || 
deviceAgent.match(/(iemobile)/) || 
deviceAgent.match(/iphone/i) || 
deviceAgent.match(/ipad/i) || 
deviceAgent.match(/ipod/i) || 
deviceAgent.match(/blackberry/i) || 
deviceAgent.match(/bada/i));

if (isTouchDevice) {
        //Do something touchy
    } else {
        //Can't touch this
    }

Modernizrを使用しない場合は、Modernizr.touch上記の関数を次のように置き換えるだけです。('ontouchstart' in document.documentElement)

また、ユーザーエージェントをテストするiemobileと、検出されたMicrosoftモバイルデバイスの範囲がより広くなることに注意してくださいWindows Phone

このSOの質問も見てください


2
現在、4つの質問に対する回答は同じです...これは、彼が求めている質問に対する解決策ではありません。
jycr753 2013

1
私はそれがここで質問に答えると信じています
Peter-Pan

それは答えではありませんが、ユーザーがタッチする前にデバイスがタッチ可能かどうかを検出したい人のためのヒントです
Shahadat Hossain Khan

1

jQuery Mobileでは、簡単に次のことができます。

$.support.touch

なぜこれが文書化されていないのかわかりませんが、クロスブラウザに対して安全です(現在のブラウザの最新2バージョン)。


0

すでに述べたように、デバイスはマウスとタッチ入力の両方をサポートする場合があります。多くの場合、質問は「サポートされているもの」ではなく「現在使用されているもの」です。

この場合、マウスイベント(ホバーリスナーを含む)とタッチイベントを同様に登録するだけです。

element.addEventListener('touchstart',onTouchStartCallback,false);

element.addEventListener('onmousedown',onMouseDownCallback,false);

...

JavaScriptは、ユーザー入力に基づいて適切なリスナーを自動的に呼び出す必要があります。したがって、タッチイベントの場合は、onTouchStartCallbackホバーコードをエミュレートして発生します。

タッチは、タッチとマウスの両方のリスナーを起動する可能性があることに注意してください。ただし、タッチリスナーが最初に表示され、を呼び出すことにより、後続のマウスリスナーが起動しないようにすることができevent.preventDefault()ます。

function onTouchStartCallback(ev) {
    // Call preventDefault() to prevent any further handling
    ev.preventDefault();
    your code...
}

さらに読むにはここ


-3

私が使用しているiPad開発では:

  if (window.Touch)
  {
    alert("touchy touchy");
  }
  else
  {
    alert("no touchy touchy");
  }

次に、タッチベースのイベント(例:ontouchstart)またはマウスベースのイベント(例:onmousedown)に選択的にバインドできます。私はまだアンドロイドでテストしていません。


1
これはOpera Mobile 10またはInternet Explorer Mobile 6(Windows Mobile 6.5)では機能しません。
doubleJ 2012年

4
不適切なクロスブラウザ/クロスOS /クロスプラットフォームのアドバイス。
BerggreenDK 2013年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.