Bagaimana cara mengetahui apakah browser dalam mode "quirks"?

128

Misalkan Anda memiliki halaman dengan doctype yang relatif ketat dan markup HTML yang cukup dekat dengan kepatuhan, tetapi mungkin meleset dalam beberapa cara konyol, mungkin karena konten pengguna yang di luar kendali Anda ... katakanlah Anda sedang mengerjakan suatu konten sistem manajemen atau tema untuk sistem manajemen konten tempat Anda mengontrol beberapa struktur dasar dan memerlukan javascript, tetapi Anda tidak bertanggung jawab atas semua hal lain yang masuk ke halaman.

Bagaimana Anda bisa tahu (atau: apa yang akan menentukan) kapan browser memutuskan untuk masuk ke mode "quirks" daripada menggunakannya lebih sesuai dengan standar mesin?

Saya mencari jawaban untuk masing-masing browser utama, karena IE, Chrome, Safari, dan Firefox tentu saja semua akan menangani hal itu secara berbeda. Apakah satu kesalahan saja cukup untuk memaksanya atau apakah Anda memiliki beberapa kelonggaran?

Joel Coehoorn
sumber

Jawaban:

159

Di Firefox dan Opera Anda dapat menentukan apakah browser Anda berada dalam "mode quirks" dengan memeriksa info halaman.

Menggunakan document.compatMode, akan memberi tahu Anda mode yang Anda gunakan dengan sebagian besar browser.

Di Chrome, Safari, dan IE , jalankan javascript ini di bilah alamat:

 javascript:window.alert('You are in ' + (document.compatMode==='CSS1Compat'?'Standards':'Quirks') + ' mode.')

(perhatikan bahwa Anda harus mengetik ulang javascript:bagian setelah menempel ke bilah alamat Anda, karena perubahan keamanan baru-baru ini)

Chris Ballance
sumber
Ada nilai potensial lain di IE yang saya temui ketika memaksa halaman lama ke mode "EDGE". Nilainya adalah "BackCompat"
Greg Woods
Saya mendapat BackCompat di Chrome juga ketika mengatur DOCTYPE ke sesuatu yang sama sekali tidak valid. Menurut kode dalam jawaban ini, jika nilainya tidak lain dari CSS1Compat, itu dalam mode quirks. Benarkah itu benar? Apa semua nilai yang mungkin?
still_dreaming_1
Rupanya BackCompatible adalah nilai standar untuk mode "quirks" / "kompatibilitas". Hanya ada 2 nilai: developer.mozilla.org/en-US/docs/Web/API/Document/compatMode
still_dreaming_1
19

Karena Anda dapat meminta mode render dalam JavaScript, Anda dapat memiliki Bookmarklet yang akan memberi tahu Anda mode render mana yang digunakan halaman.

Saya menemukan bookmarklet mode render ini yang berfungsi dengan baik untuk saya:

javascript:m=(document.compatMode=='CSS1Compat')?'Standards':'Quirks';window.alert('You%20are%20in%20'%20+%20m%20+%20'%20mode.');
Dave Webb
sumber
11

Jawaban lengkap untuk pertanyaan spesifik aktual Anda tentang 'Apakah satu kesalahan tunggal cukup untuk memaksanya atau apakah Anda memiliki beberapa kelonggaran?' adalah bahwa itu benar-benar tergantung pada kesalahan. Sebagai contoh,

<!-- Comment -->
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">

akan memaksa mode quirks di IE 6 & 7 meskipun tidak benar-benar kesalahan (mereka hanya melempar goyangan total ketika baris pertama file bukan deklarasi). Daftar jenis / kebiasaan dapat ditemukan di sini

Coba pertahankan baris berikut dalam HTML Anda untuk pengujian (javascript yang sangat buruk sebelumnya saya sampaikan di sini - maaf ... pastikan ini tidak pernah berjalan :)

<a href="javascript:alert(document.compatMode);">What mode am I?</a>
Steerpike
sumber
Terima kasih untuk penguji javascript, karena dua pertama saya mencoba untuk keluar dari mode kebiasaan tidak berfungsi.
Noumenon
css1compat! = mode quirks?
Mike Cole
4

Menurut http://www.quirksmode.org/css/quirksmode.html : "Masalahnya adalah bahwa beberapa halaman yang ditulis dalam mode quirks memang memiliki DOCTYPE. Oleh karena itu setiap browser memiliki daftar sendiri dengan DOCTYPE yang memicu mode quirks. Lihat browser ini grafik perbandingan untuk tinjauan umum dari daftar ini: http://hsivonen.iki.fi/doctype/ "

Semoga ini membantu

Sébastien Nussbaumer
sumber
3

Jika Anda memberi tahu IE bahwa itu harus ketat (melalui DOCTYPE) ia tidak akan berubah pikiran setengah halaman.

i_am_jorf
sumber
2

Jika saya memahami mode quirks dengan benar, halaman yang tidak memvalidasi terhadap doctype yang dideklarasikan tidak cukup untuk memicu mode quirks. Itu tidak akan ditampilkan dengan benar.

Sumber daya terbaik yang saya temukan untuk menentukan bagaimana browser yang berbeda menangani setiap dokumen di sini .

Bill the Lizard
sumber
2

Untuk Firefox dengan menambahkan Web Developer Toolbar, Anda dapat melihat trio ikon di sebelah kanan bilah. Yang paling kiri memberi tahu Anda mode apa yang sedang Anda masuki.

Arieleo
sumber
2

Di IE Anda akan melihatnya di alat pengembang (menekan F12), ia mengatakannya di menu: Document Mode: ... Dan Anda juga dapat memaksa mode yang berbeda di sana.

Ronen Festinger
sumber
Ini melewatkan inti pertanyaan. Itu tidak membantu Anda menulis javascript yang mengeksekusi satu jalur untuk mode quirks dan jalur yang berbeda untuk mode standar.
Joel Coehoorn
Sebenarnya Anda tidak bertanya bagaimana melakukannya dalam Javascript tetapi bagaimana cara mengetahui mode apa yang digunakan browser. Bagaimanapun, bahkan jika Anda tidak bersungguh-sungguh, itu dapat membantu orang lain yang mencarinya, saya sendiri perlu tahu bagaimana mengetahuinya di Firefox dan sampai pada pertanyaan ini.
Ronen Festinger
@ JoelCoehoorn Masalah sebenarnya adalah Anda tidak pernah menjelaskan apa itu "DOCTYPE yang relatif ketat" itu!
Tn. Lister
0

di halaman html5, tulis " <!DOCTYPE html>" mulai dengan halaman dapat berubah ke document.compatMode = 'CSS1Compat'

Miro
sumber