Apabila pengesanan ciri JavaScript gagal
mata utama
- pengesanan ciri JavaScript (ciri ujian yang ingin digunakan oleh pengaturcara) tidak selalu boleh dipercayai. Sebagai contoh, ujian ActiveXObject di Internet Explorer untuk permintaan AJAX, atribut HTML dipetakan ke sifat DOM, andaian mengenai tingkah laku pengguna (seperti mengesan peranti sentuhan), dan lain -lain.
- Apabila pengesanan ciri gagal, pengesanan penyemak imbas kadang -kadang diperlukan. Walau bagaimanapun, adalah disyorkan untuk menggunakan ujian objek proprietari dan bukannya maklumat navigator dan menggunakannya untuk mengecualikan pelayar dan bukannya memasukkannya.
- Berhati -hati apabila melaksanakan pengesanan penyemak imbas. Sentiasa menganggap bahawa ia konsisten sepenuhnya dengan ujian ciri dan hanya dapatkan pengesanan pelayar jika anda tahu bahawa ciri tidak berfungsi seperti yang diharapkan. Selain itu, sintaks yang digunakan untuk ujian objek dan ciri boleh menjejaskan kadar kejayaan pengesanan, jadi memilih sintaks yang betul adalah penting.
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.
atau kita ...?
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.
Objek ActiveX
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>
Pemetaan atribut sering digunakan untuk menguji sokongan API yang digunakan dengan sifat HTML5. Sebagai contoh, periksa sama ada elemen dengan
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) { // 浏览器支持拖放 }
kebanyakan peranti sentuh melaksanakan kelewatan manual sebelum mencetuskan acara klik (biasanya sekitar 300 milisaat), yang harus mengelakkan mengklik elemen sambil mengkliknya. Tetapi ini menjadikan aplikasi itu berasa lembap dan tidak bertindak balas, jadi pemaju kadang -kadang menggunakan ujian ciri ini untuk menjalin acara:
<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 }
perkara yang tidak berfungsi sama sekali
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:
- lebih suka ujian objek proprietari ke atas maklumat navigator.
- Gunakan ini untuk mengecualikan pelayar dan bukannya memasukkannya.
- Contohnya, anda boleh menggunakan
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
Apakah pengesanan ciri JavaScript dan mengapa penting?
Pengesanan ciri JavaScript adalah teknologi yang digunakan oleh pemaju untuk menentukan sama ada pelayar pengguna menyokong ciri atau API tertentu. Ini penting kerana tidak semua pelayar menyokong semua ciri JavaScript. Dengan menggunakan pengesanan ciri, pemaju boleh menyediakan penyelesaian alternatif atau sandaran untuk ciri -ciri yang tidak disokong, memastikan laman web atau aplikasi berjalan dengan betul pada pelayar yang berbeza. Ini meningkatkan pengalaman pengguna dan memastikan keserasian.
Bagaimana pengesanan ciri JavaScript gagal?
Pengesanan ciri JavaScript mungkin gagal kerana beberapa sebab. Sebab yang sama adalah bahawa kod pengesanan ciri dilaksanakan dengan salah. Sebagai contoh, jika kod cek untuk sifat yang tidak wujud dalam objek, ia akan kembali tidak ditentukan, mengakibatkan negatif palsu. Sebab lain boleh menjadi penyemak imbas atau kesilapan, yang boleh menyebabkan pengesanan ciri untuk memberikan hasil yang tidak tepat.
Apakah perbezaan antara pengesanan ciri dan pengesanan penyemak imbas?
Pengesanan ciri melibatkan memeriksa sama ada penyemak imbas pengguna menyokong ciri atau API tertentu, manakala pengesanan penyemak imbas mengiktiraf pelayar dan versi pengguna. Walaupun kedua -dua teknik ini direka untuk memastikan keserasian dan fungsi, pengesanan ciri sering dianggap sebagai amalan yang lebih baik kerana ia memeriksa ciri -ciri secara langsung, dan bukannya menganggap sokongannya berdasarkan jenis atau versi penyemak imbas.
Bagaimana menggunakan JavaScript untuk mengesan peranti mudah alih?
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.
Apa itu Feature.js dan bagaimana ia membantu dengan pengesanan ciri?
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.
Apa itu Modernizr dan bagaimana ia membantu dengan pengesanan ciri?
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.
Bagaimana menggunakan pakej peranti pengesan-js untuk pengesanan ciri?
Pakej Device-Detector-JSadalah 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.
Apakah beberapa amalan terbaik untuk melaksanakan pengesanan ciri?
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.
boleh membantu pengesanan membantu meningkatkan prestasi laman web?
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.
Bagaimana memahami ciri terkini yang disokong oleh pelayar yang berbeza?
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!

Alat AI Hot

Undresser.AI Undress
Apl berkuasa AI untuk mencipta foto bogel yang realistik

AI Clothes Remover
Alat AI dalam talian untuk mengeluarkan pakaian daripada foto.

Undress AI Tool
Gambar buka pakaian secara percuma

Clothoff.io
Penyingkiran pakaian AI

Video Face Swap
Tukar muka dalam mana-mana video dengan mudah menggunakan alat tukar muka AI percuma kami!

Artikel Panas

Alat panas

Notepad++7.3.1
Editor kod yang mudah digunakan dan percuma

SublimeText3 versi Cina
Versi Cina, sangat mudah digunakan

Hantar Studio 13.0.1
Persekitaran pembangunan bersepadu PHP yang berkuasa

Dreamweaver CS6
Alat pembangunan web visual

SublimeText3 versi Mac
Perisian penyuntingan kod peringkat Tuhan (SublimeText3)

Topik panas











JavaScript adalah asas kepada pembangunan web moden, dan fungsi utamanya termasuk pengaturcaraan yang didorong oleh peristiwa, penjanaan kandungan dinamik dan pengaturcaraan tak segerak. 1) Pengaturcaraan yang didorong oleh peristiwa membolehkan laman web berubah secara dinamik mengikut operasi pengguna. 2) Penjanaan kandungan dinamik membolehkan kandungan halaman diselaraskan mengikut syarat. 3) Pengaturcaraan Asynchronous memastikan bahawa antara muka pengguna tidak disekat. JavaScript digunakan secara meluas dalam interaksi web, aplikasi satu halaman dan pembangunan sisi pelayan, sangat meningkatkan fleksibiliti pengalaman pengguna dan pembangunan silang platform.

Trend terkini dalam JavaScript termasuk kebangkitan TypeScript, populariti kerangka dan perpustakaan moden, dan penerapan webassembly. Prospek masa depan meliputi sistem jenis yang lebih berkuasa, pembangunan JavaScript, pengembangan kecerdasan buatan dan pembelajaran mesin, dan potensi pengkomputeran IoT dan kelebihan.

Enjin JavaScript yang berbeza mempunyai kesan yang berbeza apabila menguraikan dan melaksanakan kod JavaScript, kerana prinsip pelaksanaan dan strategi pengoptimuman setiap enjin berbeza. 1. Analisis leksikal: Menukar kod sumber ke dalam unit leksikal. 2. Analisis Tatabahasa: Menjana pokok sintaks abstrak. 3. Pengoptimuman dan Penyusunan: Menjana kod mesin melalui pengkompil JIT. 4. Jalankan: Jalankan kod mesin. Enjin V8 mengoptimumkan melalui kompilasi segera dan kelas tersembunyi, Spidermonkey menggunakan sistem kesimpulan jenis, menghasilkan prestasi prestasi yang berbeza pada kod yang sama.

JavaScript adalah bahasa utama pembangunan web moden dan digunakan secara meluas untuk kepelbagaian dan fleksibiliti. 1) Pembangunan front-end: Membina laman web dinamik dan aplikasi satu halaman melalui operasi DOM dan kerangka moden (seperti React, Vue.js, sudut). 2) Pembangunan sisi pelayan: Node.js menggunakan model I/O yang tidak menyekat untuk mengendalikan aplikasi konkurensi tinggi dan masa nyata. 3) Pembangunan aplikasi mudah alih dan desktop: Pembangunan silang platform direalisasikan melalui reaktnatif dan elektron untuk meningkatkan kecekapan pembangunan.

Python lebih sesuai untuk pemula, dengan lengkung pembelajaran yang lancar dan sintaks ringkas; JavaScript sesuai untuk pembangunan front-end, dengan lengkung pembelajaran yang curam dan sintaks yang fleksibel. 1. Sintaks Python adalah intuitif dan sesuai untuk sains data dan pembangunan back-end. 2. JavaScript adalah fleksibel dan digunakan secara meluas dalam pengaturcaraan depan dan pelayan.

Artikel ini menunjukkan integrasi frontend dengan backend yang dijamin oleh permit, membina aplikasi edtech SaaS yang berfungsi menggunakan Next.Js. Frontend mengambil kebenaran pengguna untuk mengawal penglihatan UI dan memastikan permintaan API mematuhi dasar peranan

Peralihan dari C/C ke JavaScript memerlukan menyesuaikan diri dengan menaip dinamik, pengumpulan sampah dan pengaturcaraan asynchronous. 1) C/C adalah bahasa yang ditaip secara statik yang memerlukan pengurusan memori manual, manakala JavaScript ditaip secara dinamik dan pengumpulan sampah diproses secara automatik. 2) C/C perlu dikumpulkan ke dalam kod mesin, manakala JavaScript adalah bahasa yang ditafsirkan. 3) JavaScript memperkenalkan konsep seperti penutupan, rantaian prototaip dan janji, yang meningkatkan keupayaan pengaturcaraan fleksibiliti dan asynchronous.

Saya membina aplikasi SaaS multi-penyewa berfungsi (aplikasi edTech) dengan alat teknologi harian anda dan anda boleh melakukan perkara yang sama. Pertama, apakah aplikasi SaaS multi-penyewa? Aplikasi SaaS Multi-penyewa membolehkan anda melayani beberapa pelanggan dari Sing
