เมื่อใดจึงควรใช้แอปพลิเคชัน / จาวาสคริปต์แทน JavaScript MIME แทนข้อความ / จาวาสคริปต์?


157

ขึ้นอยู่กับคำถามที่รหัส jQuery ไม่ทำงานใน IE , text/javascriptใช้ในเอกสาร HTML เพื่อให้ Internet Explorer สามารถเข้าใจมัน

แต่ฉันสงสัยว่าเมื่อคุณจะใช้application/javascriptและที่สำคัญทำไมคุณจะใช้มันแทนtext/javascript?


มีคำตอบ / คำบรรยาย
Benn



คำตอบ:


243

ในทางทฤษฎีตามRFC 4329application/javascript ,

เหตุผลที่ควรจะapplicationไม่ใช่สิ่งที่จะทำกับประเภทที่อ่านหรือปฏิบัติการ เป็นเพราะมีกลไกการกำหนดชุดอักขระแบบกำหนดเองที่วางโดยภาษา / ประเภทของตัวเองแทนที่จะเป็นเพียงcharsetพารามิเตอร์ทั่วไป ประเภทย่อยของtextควรจะสามารถแปลงรหัสโดยพร็อกซีเป็นชุดอักขระอื่นได้โดยเปลี่ยนพารามิเตอร์ชุดอักขระ สิ่งนี้ไม่เป็นจริงของ JavaScript เพราะ:

RFC กล่าวว่าตัวแทนผู้ใช้ควรใช้ BOM-sniffing ในสคริปต์เพื่อกำหนดประเภท (ฉันไม่แน่ใจว่าเบราว์เซอร์ใด ๆ ทำเช่นนี้จริง)

ข เบราว์เซอร์ใช้ข้อมูลอื่น ๆ รวมถึงการเข้ารหัสของหน้าและในบางเบราว์เซอร์จะมีการscript charsetระบุคุณสมบัติ ดังนั้นพร็อกซีใด ๆ ที่พยายามแปลงรหัสทรัพยากรจะทำให้ผู้ใช้ล่ม (แน่นอนว่าในความเป็นจริงไม่มีใครเคยใช้พร็อกซี่การแปลงรหัสอยู่ดี แต่นั่นเป็นเจตนา)

ดังนั้นไบต์แน่นอนของไฟล์ต้องได้รับการเก็บรักษาไว้ตรงซึ่งจะทำให้มันไบนารีชนิดและไม่ได้ในทางเทคนิคตัวอักษรตามapplicationtext

ด้วยเหตุผลเดียวกันapplication/xmlเป็นที่ต้องการอย่างเป็นทางการมากกว่าtext/xml: XML มีกลไกการส่งสัญญาณในวงดนตรีของตัวเอง และทุกคนก็ละเว้นapplicationXML เช่นกัน

text/javascriptและtext/xmlอาจไม่ใช่สิ่งที่ถูกต้องอย่างเป็นทางการ แต่มีสิ่งที่ทุกคนใช้ในวันนี้เพื่อเหตุผลด้านความเข้ากันได้และเหตุผลที่ว่าทำไมพวกเขาถึงไม่ใช่สิ่งที่ถูกต้องกำลังพูดจริง ๆ โดยไม่สำคัญ


4
โซลูชัน "ความเข้ากันได้" ส่วนใหญ่จะไม่รวมประเภทเนื้อหาใด ๆ ในการตอบสนองเลย RFC ระบุว่าไม่มีประเภทเนื้อหาที่ชัดเจนผู้รับจะตีความ"ตามบริบท"ซึ่งเป็นพฤติกรรมที่ถูกต้องสำหรับเบราว์เซอร์ทั้งหมดจากเบราว์เซอร์แรก
เสมอ

โปรดใช้ความระมัดระวังด้วยapplication/javascriptและ IE IE=8ทำงานบนโหมดที่เข้ากันกับ ดูเหมือนว่าสคริปต์แบบอินไลน์ไม่ได้รับการประเมินอย่างเหมาะสม text/javascriptทำงานได้ดีที่นั่น
Joscha

2
@Pacerier - ฉันรู้ว่าความคิดเห็นนี้มีอายุ 5 ปี แต่วันนี้มันมักจะดีที่สุดที่จะรวมประเภท mime โดยเฉพาะเว็บไซต์ประเภทฟอรั่มเพื่อเหตุผลด้านความปลอดภัย การให้ผู้รับตีความชนิดของไฟล์ให้เปิดไว้เพื่อทำการโจมตีโดยการอัพโหลดไฟล์จาวาสคริปต์ที่เป็นอันตรายเป็นรูปภาพจากนั้นให้เบราว์เซอร์ตีความและเรียกใช้สคริปต์นั้น เป็นการดีกว่าที่จะให้เซิร์ฟเวอร์ส่งคืนชนิด mime สำหรับการตอบกลับทั้งหมดและใช้ส่วนหัวX-Content-Type-Options: nosniffเพื่อป้องกันไม่ให้เบราว์เซอร์ตีความประเภทนั้น
sammy_winter

@sammy_winter ฉันเห็นคำเตือนเหล่านี้ทุกที่และประจบประแจงทุกครั้ง หากฉันอนุญาตให้ผู้ใช้อัปโหลดเนื้อหาฉันอาจทำการตรวจสอบมากกว่า "oh yeah, ชื่อที่ตรงกับ regex สำหรับไฟล์ png ฉันสามารถเชื่อถือได้" ใช่ไหม? หากส่วนหัวที่ไม่ถูกต้องกลายเป็น "ปัญหาด้านความปลอดภัย" ปัญหาอาจอยู่ในที่ที่ลึกกว่านั้นคุณไม่คิดอย่างนั้นหรือ สิ่งนี้เหมือนกับการซ่อนServer: nginxหรืออะไรก็ตามที่ nginx ส่ง ราวกับว่าใครก็ตามที่มีความสามารถในการค้นหารูต้องมีเฮดเดอร์ที่ชัดเจนเพื่อรู้ว่าเซิร์ฟเวอร์ใดที่คุณใช้ ...
Sahsahae

17

ปัญหาเกี่ยวกับประเภท MIME ของ Javascript คือยังไม่มีมาตรฐานมานานหลายปี ตอนนี้เรามีapplication / javascriptเป็นประเภท MIME อย่างเป็นทางการ

แต่ที่จริงแล้วประเภท MIME นั้นไม่สำคัญเลยเพราะเบราว์เซอร์สามารถระบุประเภทได้ นั่นเป็นสาเหตุที่ HTML5 ระบุว่าtype="text/javascript"ไม่จำเป็นต้องใช้อีกต่อไป


5

applicationเพราะ - .jsไฟล์ไม่ใช่สิ่งที่ผู้ใช้ต้องการอ่าน แต่เป็นสิ่งที่ควรดำเนินการ


นั่นเป็นคำตอบอย่างเป็นทางการ แต่ IE ก็ติดใจ
เบนน์

20
@Benn: อาจเป็นเพราะผู้ใช้ IE ต้องอ่านไฟล์ JS ทั้งหมดเพราะพวกเขาทำงานไม่ถูกต้อง? อย่างน้อยก็เป็นจริงโดย Microsoft;)
thejh

รักความคิดเห็นของคุณ แต่น่าเสียดายที่คนที่ไม่สามารถอ่านจาวาสคริปต์ยังคงใช้ IE ดังนั้นเราต้องจัดการกับมัน :(.
Mark Baijens

1
ฉันไม่คิดว่าคุณต้องการอ่านหรือไม่มีสาเหตุอะไร ต้องทำอย่างไรกับข้อมูลที่ได้รับการแปลง - หรือไม่ว่ามันจะเป็น
Zenexer

ในทางเทคนิคแล้ว HTML และ CSS ก็ถูก "ดำเนินการ" (แยกวิเคราะห์) โดยเบราว์เซอร์เพื่อสร้างผลลัพธ์ของโค้ดเป็นเนื้อหาภาพและไม่ได้มีไว้สำหรับผู้ใช้ในการ "อ่าน" ดังนั้นคำตอบนี้ไม่สมเหตุสมผลนัก ฉันเดาว่ามีความสับสนที่สำคัญว่า "ข้อความ" คืออะไรและ "แอปพลิเคชัน" คืออะไร หากฉันสามารถลงคะแนนในเรื่องนี้ฉันจะบอกว่า IETF ควรพิจารณาเนื้อหา "ข้อความ" เป็นtextและ - binaryหรือapplication"วัตถุประสงค์" ของประเภทที่กล่าวถึงเช่นใน "ภาพ" หรือ "เอกสาร" ฯลฯ

1

application / javascript เป็นประเภทที่ถูกต้องที่จะใช้ แต่เนื่องจาก IE6-8 ไม่รองรับคุณจะต้องติดอยู่กับ text / javascript หากคุณไม่สนใจเรื่องความถูกต้อง (ยกเว้น HTML5) ก็อย่าเพิ่งระบุประเภท


คุณได้สิ่งนี้มาจากไหน ฉันค่อนข้างแน่ใจว่ามันรองรับ หรืออย่างน้อยก็จะถูกละเว้น
Zenexer

@Zenexer อ่านคำตอบของเขากับคำถามอีก ดูเหมือน IE application/javascriptเข้ากันได้หมายความว่าไม่มี
Camilo Martin

@CamiloMartin ฉันใช้งานได้ดีกับ IE ลงไป 6 ตลอดเวลา พวกเขาเพิ่งเริ่มต้นกับ JavaScript
Zenexer

@ Zenexer หืมมมม ฉันสงสัยว่าเกิดอะไรขึ้นกับคำถาม & คำตอบอื่น ๆ
Camilo Martin

@ Zenexer เป็นเวลานานแล้วที่ฉันต้องจัดการกับเรื่องนี้ แต่นี่คือบัญชีอื่น ๆ ที่ทำให้เกิดปัญหากับ IE6-8 ไม่แน่ใจทั้งหมดว่าทำไมสิ่งนี้ดูเหมือนจะมีความสำคัญบางครั้ง แต่จากประสบการณ์ของฉันมันทำให้เกิดปัญหา
Radu
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.