mata utama
Tetapi ketika saya mula -mula menyertai industri, perlumbaan senjata telah bermula! Vendor menambah nilai tambahan kepada rentetan ejen pengguna, jadi mereka kelihatan seperti pelayar pesaing mereka, dan mereka sendiri. Sebagai contoh, ini adalah Safari 5 untuk Mac:
if (navigator.userAgent.indexOf('MSIE 5') != -1) { // 我们认为此浏览器是 IE5 }
Ini akan sesuai dengan ujian untuk "Safari", "WebKit", dan "KHTML" (asas kod Konqueror yang berasaskan WebKit); Mozilla "" (atas sebab -sebab sejarah, hampir setiap pelayar mendakwa sebagai Mozilla).
<code>Mozilla/5.0 (Macintosh; Intel Mac OS X 10_6_8) AppleWebKit/534.59.10 (KHTML, like Gecko) Version/5.1.9 Safari/534.59.10</code>
Tujuan menambahkan semua nilai ini adalah untuk mengelakkan pengesanan pelayar. Jika skrip mengandaikan bahawa hanya Firefox boleh mengendalikan ciri -ciri tertentu, Safari boleh dikecualikan, walaupun ia mungkin berfungsi. Jangan lupa bahawa pengguna boleh menukar ejen pengguna mereka sendiri - saya digunakan untuk menetapkan penyemak imbas saya untuk mengenali "Googlebot/1.0" supaya saya dapat mengakses apa yang difikirkan oleh pemilik tapak hanya untuk merangkak!
Jadi, dari masa ke masa, pengesanan penyemak imbas semacam ini telah menjadi kekacauan yang mustahil dan sebahagian besarnya tidak digunakan, digantikan oleh pengesanan ciri yang lebih baik.
Pengesanan ciri hanya untuk menguji ciri -ciri yang ingin kami gunakan. Sebagai contoh, jika kita memerlukan
(dapatkan kedudukan elemen relatif kepada viewport), maka adalah penting sama ada penyemak imbas menyokongnya, bukan penyemak imbas itu; lebih buruk daripada ciri ujian itu sendiri: getBoundingClientRect
Pelayar yang tidak menyokong fungsi ini akan mengembalikan jenis "tidak ditentukan", jadi keadaan tidak akan diluluskan. Tanpa menguji skrip dalam mana -mana pelayar tertentu, kita tahu bahawa ia berfungsi dengan betul atau gagal dengan senyap.
Tetapi kebenarannya - pengesanan ciri tidak sepenuhnya boleh dipercayai - kadang -kadang ia gagal. Oleh itu mari kita lihat beberapa contoh sekarang dan lihat apa yang boleh kita lakukan untuk menyelesaikan setiap kes.
Mungkin contoh kegagalan pengesanan ciri yang paling terkenal ialah menguji ActiveXObject untuk permintaan Ajax di Internet Explorer.
ActiveX adalah contoh objek yang terikat, dan kepentingan praktikal ialah anda tidak dapat mengetahui sama ada ia disokong sehingga anda cuba menggunakannya . Oleh itu, jika pengguna melumpuhkan ActiveX, kod berikut akan membuang ralat:
if (navigator.userAgent.indexOf('MSIE 5') != -1) { // 我们认为此浏览器是 IE5 }
cuba instantiate objek, menangkap sebarang kegagalan dan mengendalikannya dengan sewajarnya:
<code>Mozilla/5.0 (Macintosh; Intel Mac OS X 10_6_8) AppleWebKit/534.59.10 (KHTML, like Gecko) Version/5.1.9 Safari/534.59.10</code>
menyokong API draggable dengan mencari sifat draggable: [draggable="true"]
if (typeof document.documentElement.getBoundingClientRect != "undefined") { // 浏览器支持此函数 }
begitu mengelirukan dalam versi lama ini, kerana ia tidak mengembalikan sifat sama sekali, tetapi sifat DOM.
ini bermakna jika kita menggunakan elemen yang sudah mempunyai atribut getAttribute
:
Kemudian walaupun mereka tidak disokong, IE8 atau lebih awal akan kembali untuk
.if (typeof window.ActiveXObject != "undefined") { var request = new ActiveXObject("Microsoft.XMLHTTP"); }
boleh jadi apa -apa: true
("draggable" in element)
untuk
.if (typeof window.ActiveXObject != "undefined") { try { var request = new ActiveXObject("Microsoft.XMLHTTP"); } catch (ex) { request = null; } if (request !== null) { //... 我们有一个请求对象 } }
Dalam kes ini, penyelesaiannya adalah menggunakan elemen yang tidak mempunyai atribut untuk ujian, cara paling selamat adalah menggunakan elemen yang dicipta: true
("nonsense" in element)
anda mungkin melihat menggunakan kod berikut untuk mengesan peranti sentuh:
if ("draggable" in element) { // 浏览器支持拖放 }
<div draggable="true"> ... </div>
- kerana peranti menyokong sentuhan, sentuhan akan digunakan. Tetapi bagaimana dengan komputer riba skrin sentuh? Pengguna mungkin menyentuh skrin atau menggunakan tetikus atau trackpad;
<div nonsense="true"> ... </div>
dua peristiwa pada masa yang sama, dan kemudian gunakan untuk mengelakkan sentuhan dari menghasilkan klik:
if (navigator.userAgent.indexOf('MSIE 5') != -1) { // 我们认为此浏览器是 IE5 }
Mengakui ini menyakitkan, tetapi kadang -kadang apa yang kita tidak perlu menguji bukan ciri - tetapi penyemak imbas - kerana pelayar tertentu mendakwa untuk menyokong sesuatu yang tidak berfungsi. Contoh baru -baru ini ialah setDragImage()
dalam Opera 12 (yang merupakan cara untuk menyeret dan menjatuhkan dataTransfer
objek).
Ujian ciri gagal di sini kerana Opera 12 mendakwa untuk menyokongnya; Ia tidak berfungsi:
<code>Mozilla/5.0 (Macintosh; Intel Mac OS X 10_6_8) AppleWebKit/534.59.10 (KHTML, like Gecko) Version/5.1.9 Safari/534.59.10</code>
Sekarang, jika anda hanya ingin mencuba untuk menambah imej seretan tersuai dan dengan senang hati menyimpan nilai lalai tanpa sokongan (yang akan berlaku), maka ini mungkin baik -baik saja. Tetapi bagaimana jika aplikasi anda perlu imej tersuai supaya penyemak imbas yang tidak menyokongnya harus menggunakan pelaksanaan yang sama sekali berbeza (iaitu, gunakan JavaScript tersuai untuk melaksanakan semua tingkah laku seret)?
atau bagaimana jika penyemak imbas melaksanakan ciri -ciri tertentu tetapi ada kesilapan rendering yang tidak dapat dielakkan? Kadang -kadang kita tidak mempunyai pilihan tetapi secara eksplisit mengesan pelayar yang bermasalah dan mengecualikannya dari ciri -ciri yang akan dicuba untuk menyokongnya.jadi masalahnya menjadi - apakah cara paling selamat untuk mencapai pengesanan penyemak imbas?
saya mempunyai dua cadangan:
window.opera
if (typeof document.documentElement.getBoundingClientRect != "undefined") { // 浏览器支持此函数 }
Ujian objek juga boleh digunakan bersempena dengan ujian ciri
if (typeof window.ActiveXObject != "undefined") { var request = new ActiveXObject("Microsoft.XMLHTTP"); }
Kami perhatikan bahawa rentetan ejen pengguna adalah kekacauan yang tidak boleh dipercayai, tetapi rentetan vendor sebenarnya boleh diramal dan boleh digunakan untuk menguji Chrome atau Safari:
if (typeof window.ActiveXObject != "undefined") { try { var request = new ActiveXObject("Microsoft.XMLHTTP"); } catch (ex) { request = null; } if (request !== null) { //... 我们有一个请求对象 } }
Peraturan Emas untuk semua ini adalah sangat berhati -hati. Pastikan anda menguji keadaan dalam seberapa banyak penyemak imbas yang mungkin dan berhati-hati mempertimbangkan keserasian mereka
ke hadapanif ("draggable" in element) { // 浏览器支持拖放 }
pelayar kerana sudah ada kesilapan yang diketahui, tidak memasukkannya kerana Ciri -ciri yang diketahui (ini adalah tujuan ujian ciri) Pada dasarnya, selalu menganggap bahawa ujian ciri sepenuhnya selaras dengan - melainkan jika anda tahu bahawa ini tidak berlaku, maka ciri itu akan berfungsi seperti yang diharapkan. Pilih sintaks ujian
Sebelum berakhir, saya ingin menyemak pelbagai jenis sintaks yang boleh kita gunakan untuk ujian objek dan harta. Sebagai contoh, dalam beberapa tahun kebelakangan ini, sintaks berikut telah menjadi biasa:
if (navigator.userAgent.indexOf('MSIE 5') != -1) { // 我们认为此浏览器是 IE5 }
Kami tidak dapat menggunakannya pada masa lalu kerana IE5 dan produk yang serupa akan membuang kesilapan kerana sintaks; tetapi sekarang kita tidak perlu menyokong pelayar ini, yang tidak lagi menjadi masalah.
Pada dasarnya, ia sama seperti yang berikut, tetapi lebih pendek untuk menulis:
<code>Mozilla/5.0 (Macintosh; Intel Mac OS X 10_6_8) AppleWebKit/534.59.10 (KHTML, like Gecko) Version/5.1.9 Safari/534.59.10</code>
if (typeof document.documentElement.getBoundingClientRect != "undefined") { // 浏览器支持此函数 }
window.opera
tetapi kita mungkin menguji sesuatu yang berkesan mengembalikan rentetan null atau kosong, yang kedua -duanya menilai kepada palsu. Sebagai contoh, atribut
style.maxWidth
if (typeof window.ActiveXObject != "undefined") { var request = new ActiveXObject("Microsoft.XMLHTTP"); }
disokong dan maxWidth
mempunyai nilai yang ditetapkan pengarang, jadi jika kita menulis ujian seperti ini, ia mungkin gagal:
if (typeof window.ActiveXObject != "undefined") { try { var request = new ActiveXObject("Microsoft.XMLHTTP"); } catch (ex) { request = null; } if (request !== null) { //... 我们有一个请求对象 } }
yang dikatakan - jika anda boleh menggunakannya dengan selamat, lakukan kerana ia biasanya lebih cepat dalam pelayar moden (mungkin kerana mereka dioptimumkan untuk jenis keadaan ini).
Untuk maklumat lanjut mengenai ini, lihat: Penukaran Jenis Automatik di Dunia Nyata.
soalan yang sering ditanya mengenai pengesanan ciri JavaScript
Bagaimana pengesanan ciri JavaScript gagal?
Apakah perbezaan antara pengesanan ciri dan pengesanan penyemak imbas?
Anda boleh menggunakan atribut navigator.userAgent
dalam JavaScript untuk mengesan peranti mudah alih. Harta ini mengembalikan rentetan yang mewakili tajuk ejen pengguna penyemak imbas. Dengan menyemak kata kunci tertentu dalam rentetan ini (seperti "Android", "iPhone", atau "iPad"), anda boleh menentukan sama ada pengguna berada pada peranti mudah alih.
Feature.js adalah utiliti JavaScript yang ringan, cepat dan mudah untuk pengesanan ciri. Ia menyediakan API yang mudah digunakan yang membolehkan pemaju menguji sama ada penyemak imbas menyokong ciri-ciri tertentu. Ini membantu menyediakan penyelesaian sandaran atau penyelesaian alternatif untuk ciri -ciri yang tidak disokong, dengan itu meningkatkan keserasian dan fungsi laman web atau aplikasi.
Modernizr adalah perpustakaan JavaScript yang membantu pemaju memanfaatkan ciri HTML5 dan CSS3 sambil mengekalkan keserasian dengan pelayar yang lebih tua. Ia menggunakan pengesanan ciri untuk memeriksa sama ada penyemak imbas menyokong ciri -ciri tertentu dan menambah kelas kepada elemen HTML, yang membolehkan anda mencari ciri penyemak imbas tertentu dalam stylesheets atau JavaScript.
adalah alat yang berkuasa untuk pengesanan peranti. Ia menghancurkan rentetan ejen pengguna dan mengesan telefon pintar, tablet, desktop, TV dan peranti lain. Ia juga mengesan penyemak imbas, enjin, sistem operasi, dan maklumat berguna yang lain. Anda boleh menggunakan pakej ini untuk menyesuaikan tingkah laku laman web atau aplikasi berdasarkan peranti yang dikesan.
Beberapa amalan terbaik untuk melaksanakan pengesanan ciri termasuk: Menggunakan perpustakaan yang boleh dipercayai dan diuji seperti modenizr atau feature.js, dengan teliti menguji kod pengesanan ciri anda pada pelayar dan peranti yang berbeza, seperti ciri yang tidak disokong memberikan penyelesaian alternatif atau kejatuhan dan mengelakkan menganggap sokongan ciri berdasarkan jenis atau versi penyemak imbas.
Ya, pengesanan ciri dapat membantu meningkatkan prestasi laman web. Dengan mengesan ciri -ciri yang tidak disokong dan menyediakan penyelesaian alternatif atau penyelesaian sandaran, anda boleh menghalang kod yang tidak perlu daripada berjalan di penyemak imbas. Ini mengurangkan masa beban dan meningkatkan prestasi keseluruhan laman web.
Sebagai hasil daripada perkembangan pesat pembangunan web, ia boleh mencabar untuk memahami ciri -ciri terkini yang disokong oleh pelayar yang berbeza. Walau bagaimanapun, sumber seperti Mozilla Developer Network (MDN), bolehkah saya menggunakan, dan dokumentasi JavaScript dapat memberikan maklumat terkini mengenai sokongan ciri dalam pelayar yang berbeza.
Atas ialah kandungan terperinci Apabila pengesanan ciri JavaScript gagal. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!