Saya telah menulis plug-in jQuery yang digunakan pada desktop dan perangkat seluler. Saya bertanya-tanya apakah ada cara dengan JavaScript untuk mendeteksi apakah perangkat memiliki kemampuan layar sentuh. Saya menggunakan jquery-mobile.js untuk mendeteksi acara layar sentuh dan berfungsi di iOS, Android, dll., Tetapi saya juga ingin menulis pernyataan bersyarat berdasarkan apakah perangkat pengguna memiliki layar sentuh.
Apakah itu mungkin?
javascript
jquery
touch
screenm0nkey
sumber
sumber
Jawaban:
Pembaruan: Silakan baca jawaban blmstr di bawah ini sebelum menarik seluruh pustaka pendeteksian fitur ke proyek Anda. Mendeteksi dukungan sentuh yang sebenarnya lebih kompleks, dan Modernizr hanya mencakup kasus penggunaan dasar.
Modernizr adalah cara yang hebat dan ringan untuk melakukan semua jenis deteksi fitur di situs mana pun.
Itu hanya menambahkan kelas ke elemen html untuk setiap fitur.
Anda kemudian dapat menargetkan fitur-fitur tersebut dengan mudah di CSS dan JS. Sebagai contoh:
Dan Javascript (contoh jQuery):
sumber
Modernizr.touch
tiba-tiba kembaliundefined
, Anda mungkin memiliki Modernizr khusus (Anda bisa memilih dan memilih) tanpa dukungan untuk deteksi Acara Sentuh.Sudahkah Anda mencoba menggunakan fungsi ini? (Ini sama dengan yang digunakan Modernizr.)
PEMBARUAN 1
document.createEvent("TouchEvent")
sudah mulai kembalitrue
di chrome terbaru (ay. 17). Modernizr memperbarui ini beberapa waktu yang lalu. Periksa tes Modernizr di sini .Perbarui fungsi Anda seperti ini untuk membuatnya berfungsi:
PEMBARUAN 2
Saya menemukan bahwa di atas tidak berfungsi pada IE10 (mengembalikan false pada MS Surface). Inilah solusinya:
PEMBARUAN 3
'onmsgesturechange' in window
akan mengembalikan true di beberapa versi desktop IE jadi itu tidak dapat diandalkan. Ini bekerja sedikit lebih andal:PEMBARUAN 2018
Waktu berlalu dan ada cara-cara baru dan lebih baik untuk menguji ini. Saya pada dasarnya telah mengekstraksi dan menyederhanakan cara Modernizr untuk memeriksanya:
Di sini mereka menggunakan
touch-enabled
fitur permintaan media non-standar , yang menurut saya agak aneh dan praktik buruk. Tapi hei, di dunia nyata kurasa itu berhasil. Di masa depan (ketika mereka didukung oleh semua) fitur-fitur permintaan media tersebut dapat memberi Anda hasil yang sama:pointer
danhover
.Lihatlah sumber bagaimana Modernizr melakukannya .
Untuk artikel bagus yang menjelaskan masalah dengan deteksi sentuh, lihat: Stu Cox: Anda Tidak Dapat Mendeteksi Layar Sentuh .
sumber
true
ataufalse
. Anda dapat membaca lebih lanjut tentang hal ini di sini: stackoverflow.com/questions/4686583/…in
operator sudah mengevaluasi ke boolean.'onmsgesturechange'
sedang mengevaluasi true bahkan dalam perangkat non-sentuh (PC).window.navigator.msMaxTouchPoints
tampaknya lebih akurat. Ditemukan di sini .Karena Modernizr tidak mendeteksi IE10 pada Windows Phone 8 / WinRT, solusi lintas-browser yang sederhana adalah:
Anda hanya perlu memeriksa sekali karena perangkat tidak akan tiba-tiba mendukung atau tidak mendukung sentuhan, jadi simpan saja dalam variabel sehingga Anda dapat menggunakannya beberapa kali lebih efisien.
sumber
return !!('ontouchstart' in window) || !!('msmaxtouchpoints' in window.navigator);
(untuk menggabungkan kedua jawaban) Bekerja dengan baik di IE10 juga!'onmsgesturechange' in window
mengembalikan true pada desktop IE10 bahkan ketika sentuhan dimungkinkanfunction isTouchDevice() { return 'ontouchstart' in window || !!(navigator.msMaxTouchPoints);}
Dengan menggunakan semua komentar di atas, saya telah mengumpulkan kode berikut yang berfungsi untuk kebutuhan saya:
Saya telah menguji ini di iPad, Android (Browser dan Chrome), Blackberry Playbook, iPhone 4s, Windows Phone 8, IE 10, IE 8, IE 10 (Windows 8 dengan Touchscreen), Opera, Chrome dan Firefox.
Saat ini gagal pada Windows Phone 7 dan saya belum dapat menemukan solusi untuk browser itu.
Semoga seseorang menemukan ini berguna.
sumber
true
pada Firefox 32 saya di windows 7 :(Karena pengenalan fitur media interaksi, Anda dapat melakukannya:
https://www.w3.org/TR/mediaqueries-4/#descdef-media-any-pointer
Pembaruan (karena komentar): Solusi di atas adalah untuk mendeteksi apakah "pointer kasar" - biasanya layar sentuh - adalah perangkat input utama. Jika Anda ingin mendeteksi jika perangkat dengan mouse misalnya juga memiliki layar sentuh yang dapat Anda gunakan
any-pointer: coarse
.Untuk informasi lebih lanjut lihat di sini: Mendeteksi bahwa browser tidak memiliki mouse dan hanya sentuhan
sumber
(pointer: coarse)
karena Anda kemungkinan besar hanya menargetkan input utama. Dapat digunakan dalam produksi, karena beberapa browser yang tidak mendukung adalah desktop saja. Ada artikel bagus tentang ini pada trik-css .Saya suka yang ini:
sumber
function isTouchDevice(){ return (window.ontouchstart !== undefined); }
var isTouch = 'ontouchstart' in window;
:, namun ini tidak berfungsi dengan Chrome terbaru (v31),var isTouch = 'createTouch' in window.document;
masih berfungsi.touchstart
akan gagal mengenali Permukaan sebagai perangkat sentuh karena IE menggunakanpointer
peristiwa.Jika Anda menggunakan Modernizr , sangat mudah digunakan
Modernizr.touch
seperti yang disebutkan sebelumnya.Namun, saya lebih suka menggunakan kombinasi
Modernizr.touch
dan pengujian agen pengguna, hanya agar aman.Jika Anda tidak menggunakan Modernizr, Anda cukup mengganti
Modernizr.touch
fungsi di atas dengan('ontouchstart' in document.documentElement)
Perhatikan juga bahwa pengujian agen pengguna
iemobile
akan memberi Anda jangkauan yang lebih luas dari perangkat seluler Microsoft yang terdeteksi daripadaWindows Phone
.Lihat juga pertanyaan SO ini
sumber
/(iphone|ipod|ipad|android|iemobile|blackberry|bada)/.test(window.navigator.userAgent.toLowerCase())
Kami mencoba implementasi modernizr, tetapi mendeteksi acara sentuh tidak konsisten lagi (IE 10 memiliki acara sentuh di desktop windows, IE 11 berfungsi, karena acara sentuh yang sudah dijatuhkan dan ditambahkan pointer api).
Jadi kami memutuskan untuk mengoptimalkan situs web sebagai situs sentuh selama kami tidak tahu jenis input apa yang dimiliki pengguna. Ini lebih dapat diandalkan daripada solusi lainnya.
Penelitian kami mengatakan, bahwa sebagian besar pengguna desktop bergerak dengan mouse mereka di atas layar sebelum mereka mengklik, sehingga kami dapat mendeteksi mereka dan mengubah perilaku sebelum mereka dapat mengklik atau mengarahkan apa pun.
Ini adalah versi sederhana dari kode kami:
sumber
Biola yang Bekerja
Saya telah mencapainya seperti ini;
sumber
Ada sesuatu yang lebih baik daripada memeriksa apakah mereka memiliki layar sentuh, adalah memeriksa apakah mereka menggunakannya, plus itu lebih mudah untuk diperiksa.
sumber
Yang ini berfungsi dengan baik bahkan di tablet Windows Surface !!!
sumber
Saya menggunakan potongan-potongan kode di atas untuk mendeteksi apakah ada sentuhan, jadi iframe fancybox saya akan muncul di komputer desktop dan tidak di sentuh. Saya perhatikan bahwa Opera Mini untuk Android 4.0 masih mendaftar sebagai perangkat non-sentuh saat menggunakan kode blmstr saja. (Apakah ada yang tahu kenapa?)
Saya akhirnya menggunakan:
sumber
/iPhone|iPod|iPad|Android|BlackBerry/
?"Gotcha" terbesar dengan mencoba mendeteksi sentuhan ada pada perangkat hybrid yang mendukung sentuhan dan trackpad / mouse. Bahkan jika Anda dapat mendeteksi dengan benar apakah perangkat pengguna mendukung sentuhan, apa yang benar-benar perlu Anda lakukan adalah mendeteksi perangkat input apa yang saat ini digunakan pengguna. Ada tulisan rinci tentang tantangan ini dan kemungkinan solusi di sini .
Pada dasarnya pendekatan untuk mencari tahu apakah pengguna hanya menyentuh layar atau menggunakan mouse / trackpad sebagai gantinya adalah untuk mendaftarkan a
touchstart
danmouseover
acara di halaman:Tindakan sentuh akan memicu kedua peristiwa ini, meskipun yang pertama (
touchstart
) selalu menjadi yang pertama di sebagian besar perangkat. Jadi mengandalkan urutan diprediksi peristiwa ini, Anda dapat membuat sebuah mekanisme yang secara dinamis menambahkan atau menghilangkancan-touch
kelas ke akar dokumen untuk mencerminkan arus input type dari pengguna saat ini pada dokumen:Lebih detail di sini .
sumber
Lihat pos ini , ia memberikan potongan kode yang sangat bagus untuk apa yang harus dilakukan ketika perangkat sentuh terdeteksi atau apa yang harus dilakukan jika acara touchstart dipanggil:
sumber
Saya akan menghindari menggunakan lebar layar untuk menentukan apakah suatu perangkat adalah perangkat sentuh. Ada layar sentuh yang jauh lebih besar dari 699px, pikirkan Windows 8. Navigatior.userAgent mungkin bagus untuk mengesampingkan postur palsu.
Saya akan merekomendasikan untuk memeriksa masalah ini di Modernizr.
Apakah Anda ingin menguji apakah perangkat mendukung acara sentuh atau perangkat sentuh. Sayangnya, itu bukan hal yang sama.
sumber
Tidak, itu tidak mungkin. Jawaban luar biasa yang diberikan hanya bersifat parsial, karena setiap metode yang diberikan akan menghasilkan positif palsu dan negatif palsu. Bahkan browser tidak selalu tahu apakah ada layar sentuh, karena API OS, dan fakta dapat berubah selama sesi browser, terutama dengan pengaturan tipe KVM.
Lihat detail lebih lanjut dalam artikel yang luar biasa ini:
http://www.stucox.com/blog/you-cant-detect-a-touchscreen/
Artikel tersebut menyarankan Anda untuk mempertimbangkan kembali asumsi yang membuat Anda ingin mendeteksi layar sentuh, mereka mungkin salah. (Saya memeriksa aplikasi saya sendiri, dan asumsi saya memang salah!)
Artikel itu menyimpulkan:
sumber
Banyak dari ini bekerja tetapi membutuhkan jQuery, atau javascript linters mengeluh tentang sintaks. Mempertimbangkan pertanyaan awal Anda meminta cara "JavaScript" (bukan jQuery, bukan Modernizr) untuk menyelesaikan masalah ini, inilah fungsi sederhana yang berfungsi setiap saat. Ini juga seminimal mungkin.
Satu manfaat terakhir yang akan saya sebutkan adalah bahwa kode ini adalah framework dan perangkat agnostik. Nikmati!
sumber
function isTouchScreen() { return window.matchMedia('(hover: none)').matches;}
Ini bekerja untuk saya, jadi saya di sini menambahkan kontribusi untuk jawaban ini, karena saya juga mengharapkan thread JS vanilla ketika Google membawa saya ke sini.Sepertinya Chrome 24 sekarang mendukung acara sentuh, mungkin untuk Windows 8. Jadi kode yang diposting di sini tidak lagi berfungsi. Alih-alih mencoba mendeteksi apakah sentuhan didukung oleh browser, saya sekarang mengikat acara sentuh dan klik dan memastikan hanya satu yang disebut:
Dan kemudian menyebutnya:
Semoga ini membantu !
sumber
Semua browser yang didukung kecuali Firefox untuk desktop selalu BENAR karena Firefox untuk desktop mendukung desain responsif untuk pengembang bahkan Anda mengklik Tombol Sentuh atau tidak!
Saya harap Mozilla akan memperbaiki ini di versi berikutnya.
Saya menggunakan desktop Firefox 28.
sumber
true
:(jQuery v1.11.3
Ada banyak informasi bagus dalam jawaban yang diberikan. Tapi, baru-baru ini saya menghabiskan banyak waktu mencoba untuk benar-benar mengikat semuanya menjadi solusi untuk dua hal:
Selain posting ini dan Mendeteksi perangkat layar sentuh dengan Javascript , saya menemukan posting ini oleh Patrick Lauke sangat membantu: https://hacks.mozilla.org/2013/04/detecting-touch-its-the-why-not-the-how /
Ini kodenya ...
Penting! Itu
*.on( events [, selector ] [, data ], handler )
Metode kebutuhan untuk memiliki pemilih, biasanya unsur, yang dapat menangani "touchstart" acara, atau lainnya seperti acara berhubungan dengan sentuhan. Dalam hal ini, itu adalah elemen hyperlink "a".Sekarang, Anda tidak perlu menangani mengklik mouse biasa dalam JavaScript, karena Anda dapat menggunakan CSS untuk menangani peristiwa ini menggunakan penyeleksi untuk hyperlink "a" elemen seperti:
Catatan: Ada juga penyeleksi lainnya ...
sumber
atau
akan menjadi pemeriksaan yang lebih menyeluruh kurasa.
sumber
ua
mengacu padanavigator.userAgent
. Juga deteksi dengan lebar layar dapat memberikan hasil yang salah jika seseorang membuka browser dalam mode tidak layar penuh.Saya menggunakan:
di jQuery mobile 1.0.1
sumber
Saya juga banyak kesulitan dengan berbagai opsi tentang cara mendeteksi dalam Javascript apakah halaman ditampilkan pada perangkat layar sentuh atau tidak. IMO, sampai sekarang, tidak ada opsi nyata untuk mendeteksi opsi dengan benar. Peramban melaporkan acara sentuh pada mesin desktop (karena OS mungkin siap sentuh), atau beberapa solusi tidak berfungsi pada semua perangkat seluler.
Pada akhirnya, saya menyadari bahwa saya mengikuti pendekatan yang salah sejak awal: Jika halaman saya terlihat serupa pada perangkat sentuh dan non-sentuh, saya mungkin tidak perlu khawatir tentang mendeteksi properti sama sekali: Skenario saya adalah untuk menonaktifkan tooltips di atas tombol pada perangkat sentuh saat mereka mengarah ke ketukan ganda di mana saya ingin satu ketukan untuk mengaktifkan tombol.
Solusi saya adalah untuk refactor pandangan sehingga tidak ada keterangan alat yang dibutuhkan lebih tombol, dan pada akhirnya saya tidak perlu mendeteksi perangkat sentuh dari Javascript dengan metode yang semua memiliki kelemahan mereka .
sumber
Anda dapat menginstal modernizer dan menggunakan acara sentuh sederhana. Ini sangat efektif dan berfungsi pada setiap perangkat yang telah saya uji termasuk pada permukaan windows!
Saya telah membuat jsFiddle
sumber
Jawaban praktisnya tampaknya adalah yang mempertimbangkan konteks:
1) Situs publik (tanpa login)
Kode UI untuk bekerja dengan kedua opsi bersama-sama.
2) Situs login
Tangkap apakah mouse-move terjadi pada formulir login, dan simpan ini ke input tersembunyi. Nilai dilewatkan dengan kredensial masuk dan ditambahkan ke sesi pengguna , sehingga dapat digunakan selama durasi sesi.
Jquery untuk ditambahkan ke halaman login saja:
(+1 ke @Dave Burt dan +1 ke @Martin Lantzsch pada jawaban mereka)
sumber
Masalah
Karena perangkat hybrid yang menggunakan kombinasi input sentuhan dan mouse, Anda harus dapat secara dinamis mengubah status / variabel yang mengontrol apakah sepotong kode harus dijalankan jika pengguna adalah pengguna sentuh atau tidak.
Perangkat sentuh juga mengaktifkan
mousemove
ketukan.Larutan
touchstart
acara dipecat, lalu setel ke true.Diuji pada Safari iOS dan Chrome untuk Android.
Catatan: tidak 100% yakin pada pointer-events untuk MS Surface, dll.
Demo codepen
sumber
Sebenarnya, saya meneliti pertanyaan ini dan mempertimbangkan semua situasi. karena itu adalah masalah besar pada proyek saya juga. Jadi saya mencapai fungsi di bawah ini, ini berfungsi untuk semua versi dari semua browser di semua perangkat:
Petunjuk : Jelas,
isTouchDevice
just mengembalikanboolean
nilai.sumber
support
Objek jQuery yang diperluas :Dan sekarang Anda dapat memeriksanya di mana saja, seperti ini:
sumber
Sejauh ini ini sepertinya bekerja dengan baik untuk saya:
sumber
Ketika mouse terpasang, dapat diasumsikan dengan hitrate cukup tinggi (saya akan mengatakan hampir 100%) bahwa pengguna menggerakkan mouse setidaknya jarak kecil setelah halaman siap - tanpa mengklik. Mekanisme di bawah mendeteksi ini. Jika terdeteksi, saya menganggap ini sebagai tanda dukungan sentuh yang hilang atau, jika didukung, kurang penting ketika mouse sedang digunakan. Perangkat sentuh diasumsikan jika tidak terdeteksi.
EDIT Pendekatan ini mungkin tidak cocok untuk semua tujuan. Ini dapat digunakan untuk mengontrol fungsionalitas yang diaktifkan berdasarkan interaksi pengguna pada halaman yang dimuat, misalnya penampil gambar. Kode di bawah ini juga akan membuat acara mousemove terikat pada perangkat tanpa mouse seperti yang terlihat sekarang. Pendekatan lain mungkin lebih baik.
Secara kasar, bunyinya seperti ini (maaf untuk jQuery, tetapi serupa dengan Javascript murni):
sumber