Kapan harus menggunakan aplikasi JavaScript tipe MIME / javascript alih-alih teks / javascript?

157

Berdasarkan pertanyaan, kode jQuery tidak berfungsi di IE , text/javascriptdigunakan dalam dokumen HTML sehingga Internet Explorer dapat memahaminya.

Tapi saya bertanya-tanya, kapan Anda akan menggunakannya application/javascript, dan yang lebih penting, mengapa Anda menggunakannya text/javascript?

Mark Baijens
sumber

Jawaban:

243

Secara teori, menurut RFC 4329 , application/javascript.

Alasannya seharusnya applicationtidak ada hubungannya dengan apakah jenisnya dapat dibaca atau dieksekusi. Itu karena ada mekanisme penentuan charset khusus yang ditetapkan oleh bahasa / jenis itu sendiri, bukan hanya charsetparameter generik . Subtipe textharus dapat ditranskodekan oleh proxy ke charset lain, mengubah parameter charset. Ini tidak benar dari JavaScript karena:

Sebuah. RFC mengatakan agen pengguna harus melakukan BOM-sniffing pada skrip untuk menentukan tipe (saya tidak yakin apakah ada browser yang melakukan ini);

b. browser menggunakan informasi lain — penyandian halaman yang disertakan dan pada beberapa browser script charsetatributnya — untuk menentukan charset. Jadi setiap proksi yang mencoba transcode sumber daya akan merusak penggunanya. (Tentu saja dalam kenyataannya tidak ada yang pernah menggunakan proxy transcoding, tapi itu maksudnya.)

Oleh karena itu byte file yang tepat harus dipertahankan dengan tepat , yang membuatnya menjadi applicationtipe biner dan tidak berbasis karakter secara teknis text.

Untuk alasan yang sama, application/xmlsecara resmi lebih disukai daripada text/xml: XML memiliki mekanisme pensinyalan charset in-band sendiri. Dan semua orang mengabaikan applicationXML juga.

text/javascriptdan text/xmlmungkin bukan Hal yang Resmi resmi, tetapi ada apa yang semua orang gunakan saat ini untuk alasan kompatibilitas, dan alasan mengapa mereka bukan hal yang benar secara praktis sama sekali tidak penting.

bobince
sumber
4
Solusi paling "kompatibilitas" adalah tidak memasukkan jenis konten apa pun dalam respons sama sekali. RFC menyatakan bahwa tanpa jenis konten yang eksplisit, penerima akan menafsirkannya "berdasarkan konteks" yang selalu merupakan perilaku yang benar untuk semua peramban langsung dari peramban pertama
Pacerier
Hati-hati dengan application/javascriptdan IE berjalan pada mode kompatibilitas dengan IE=8. Sepertinya skrip sebaris tidak dievaluasi dengan benar. text/javascriptberfungsi dengan baik di sana.
Joscha
2
@Pacerier - Saya tahu komentar ini berumur 5 tahun, tetapi hari ini sering kali lebih baik memasukkan tipe mime, terutama untuk situs web tipe forum, untuk alasan keamanan. Memiliki penerima menginterpretasikan jenis membuat orang terbuka untuk menyerang dengan mengunggah file javascript berbahaya sebagai gambar, dan kemudian meminta browser mengartikan dan menjalankan skrip itu. Lebih baik meminta server mengembalikan tipe mime untuk semua respons dan menggunakan header X-Content-Type-Options: nosniffuntuk mencegah browser menginterpretasikan tipe tersebut.
sammy_winter
@sammy_winter Saya melihat peringatan seperti ini di mana-mana dan ngeri setiap saat. Jika saya mengizinkan pengguna untuk mengunggah konten, saya mungkin akan melakukan lebih banyak validasi daripada "oh yeah, nama cocokkan dengan regex untuk file png, saya bisa percaya itu", bukan? Jika tajuk yang salah menjadi "masalah keamanan", masalahnya mungkin di suatu tempat yang lebih dalam, bukan begitu? Ini sama dengan bersembunyi Server: nginxatau apa pun yang dikirim nginx. Seolah siapa pun yang mampu menemukan lubang perlu tajuk eksplisit untuk mengetahui server apa yang Anda jalankan ...
Sahsahae
17

Masalah dengan tipe MIME Javascript adalah bahwa tidak ada standar selama bertahun-tahun. Sekarang kita punya aplikasi / javascript sebagai tipe MIME resmi.

Namun sebenarnya, tipe MIME tidak masalah sama sekali, karena browser dapat menentukan jenisnya sendiri. Itu sebabnya spesifikasi HTML5 menyatakan bahwa type="text/javascript"itu tidak lagi diperlukan.

Harmen
sumber
5

applicationkarena .js-Files bukan sesuatu yang ingin dibaca pengguna tetapi sesuatu yang harus dijalankan.

thejh
sumber
Itu jawaban resmi tetapi IE mencekiknya.
Benn
20
@ Ben: Mungkin karena pengguna IE harus membaca semua file JS karena mereka tidak menjalankan dengan benar? Setidaknya, ini jujur ​​oleh Microsoft;)
thejh
Suka komentar Anda, tetapi sayangnya orang yang tidak dapat membaca javascript masih menggunakan IE sehingga kami harus menghadapinya :(.
Mark Baijens
1
Saya tidak berpikir apakah Anda ingin membacanya atau tidak ada hubungannya dengan alasannya. Ini ada hubungannya dengan bagaimana data ditranskode - atau lebih tepatnya, apakah bisa.
Zenexer
secara teknis, HTML dan CSS juga "dieksekusi" (diuraikan) oleh browser untuk menghasilkan hasil kode sebagai konten visual dan tidak dimaksudkan bagi pengguna untuk "membacanya", jadi, jawaban ini tidak masuk akal. Saya kira ada kebingungan besar tentang apa itu "teks" dan apa itu "aplikasi". Jika saya dapat memilih dalam hal ini, saya akan mengatakan IETF harus mempertimbangkan konten "teks" sebagai text, dan binarysebagai application-OR "tujuan" dari jenis kata seperti dalam "gambar", atau "dokumen", dll.
1

application / javascript adalah jenis yang benar untuk digunakan tetapi karena tidak didukung oleh IE6-8 Anda akan terjebak dengan teks / javascript. Jika Anda tidak peduli tentang validitas (dikecualikan HTML5) maka jangan menentukan jenis.

Radu
sumber
Dari mana Anda mendapatkan ini? Saya cukup yakin itu didukung. Atau, setidaknya, itu akan diabaikan.
Zenexer
@ Zenexer membaca jawabannya untuk pertanyaan lain . Tampaknya kompatibilitas IE berarti tidak application/javascript.
Camilo Martin
@ CamiloMartin Saya menggunakannya dengan IE hingga 6 setiap saat. Mereka hanya default ke JavaScript.
Zenexer
@ Zenexer Hm, aneh. Saya bertanya-tanya apa masalahnya di tanya jawab lainnya.
Camilo Martin
@ Zenexer Sudah lama sejak saya harus berurusan dengan ini, tetapi di sini ada beberapa akun lain yang menyebabkan masalah dengan IE6-8. Tidak sepenuhnya yakin mengapa ini sepertinya penting beberapa kali tetapi dalam pengalaman saya ini telah menyebabkan masalah.
Radu