การฝัง JavaScript ลงในเนื้อความของ HTML เป็นการปฏิบัติที่ไม่ดีหรือไม่?


85

ทีมที่ฉันทำงานอยู่มีนิสัยชอบใช้<script>แท็กในตำแหน่งสุ่มในเนื้อหาของหน้า HTML ของเรา ตัวอย่างเช่น:

<html>
    <head></head>
    <body>
        <div id="some-div">
            <script type="text/javascript">//some javascript here</script>
        </div>
    </body>
</html>

ฉันไม่เคยเห็นสิ่งนี้มาก่อน ดูเหมือนว่าจะใช้ได้กับเบราว์เซอร์บางตัวที่ฉันได้ทดสอบ แต่เท่าที่ฉันทราบการวางแท็กสคริปต์ในตำแหน่งเช่นนี้ไม่ถูกต้อง

ฉันผิดเหรอ? การที่เราวางแท็กสคริปต์ไว้ในแท็ก div เช่นนี้แย่แค่ไหน? มีปัญหาความเข้ากันได้ของเบราว์เซอร์ที่ฉันควรทราบหรือไม่?


1
มันกำลังทำอยู่ที่document.writesนั่นหรือไม่มีเหตุผลพิเศษที่ทำให้มันอยู่ที่ไหน?
Martin Smith

8
สคริปต์ถูกกฎหมายที่จะเกิดขึ้นที่ใดก็ได้ในร่างกาย ไม่มีอะไรผิดปกติ มันมีผลกระทบ (ระยะเวลาการบำรุงรักษาการผสมโค้ดและเลย์เอาต์ความชอบส่วนบุคคล) แต่อย่างอื่นก็ไม่เป็นไร
Tomalak

@earlz - ดูคำตอบของฉันว่าทำไมถึงไม่ดี แค่พยายามช่วยชีวิตที่นี่ และฉันถูกต้อง
Jason

คำตอบ:


89

ใช้ได้อย่างสมบูรณ์แบบ

คุณไม่ต้องการใส่โค้ดขนาดใหญ่จำนวนมากผสมในมาร์กอัปที่นั่น (ควรใช้สคริปต์ภายนอกดีกว่า) แต่จะมีประโยชน์กับ:

  • เพิ่มข้อมูลการผูกเพิ่มเติมสำหรับการเพิ่มประสิทธิภาพแบบก้าวหน้า (ซึ่งข้อมูลนั้นยากที่จะใส่ลงในชื่อคลาสหรือวิธีการอื่น ๆ ในการซ่อนข้อมูลเพิ่มเติมในแอตทริบิวต์) หรือ

  • ในกรณีที่จำเป็นต้องเริ่มการเพิ่มประสิทธิภาพสคริปต์โดยเร็วที่สุด (แทนที่จะรอให้ window-load / document-ready) ตัวอย่างเช่นนี้คือการโฟกัสอัตโนมัติซึ่งอาจทำให้เกิดความระคายเคืองได้หากยิงช้าเกินไป

คุณอาจกำลังคิดถึง<style>องค์ประกอบซึ่งไม่ได้รับอนุญาตใน<body>(แม้ว่าเบราว์เซอร์ส่วนใหญ่จะอนุญาตก็ตาม)


12
+1 สำหรับออโต้โฟกัส; บางครั้งฉันก็เชื่อมต่อได้ช้าและมันก็ไม่สนุกที่จะอยู่ที่อื่นแล้ว (ในกรณีที่แย่ที่สุดคือการพิมพ์รหัสผ่าน) เมื่อถูกนำกลับไปที่ช่องแรก
Marcel Korpel

1
อย่างไรก็ตามการฝัง JS จะมีประโยชน์เมื่อมีเพียงเพจเดียวและเพื่อลดการค้นหาเซิร์ฟเวอร์ เรื่องเดียวกันกับ CSS แบบฝัง แต่โดยปกติแล้วการแยกโค้ดจาวาสคริปต์และ css ในไฟล์ที่แยกจากกันจะดีกว่าเพื่อลดเวลาในการโหลดเพจ (โดยใช้ส่วนหัวแคชที่ถูกต้อง) เมื่อใช้เทมเพลตที่มีข้อกำหนดจาวาสคริปต์และ css เดียวกัน
Codebeat

17

จริงๆแล้วมันค่อนข้างธรรมดา ตัวอย่างเช่นโค้ดติดตามการวิเคราะห์ของ Googleใช้ไวยากรณ์นี้เท่านั้น:

<script type="text/javascript">
  var gaJsHost = (("https:" == document.location.protocol) ? "https://ssl." : "http://www.");
  document.write(unescape("%3Cscript src='" + gaJsHost + "google-analytics.com/ga.js' type='text/javascript'%3E%3C/script%3E"));
</script>

ถ้ามันดีพอสำหรับ Google ...


37
-1 - เพียงเพราะ Google ทำมันไม่ได้หมายความว่าเป็นการปฏิบัติที่ดี ธรรมดา! = ดี
Jason

3
Google Analytics มีความซับซ้อนมากเกินไปอยู่แล้วและการใช้ JavaScript เพื่อติดตามเป็นตัวอย่างที่ดีของการใช้งานมากเกินไป
Esko

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

2
นอกประเด็น: ฉันมักจะหงุดหงิดกับการใช้งานที่ไม่จำเป็นและแปลกประหลาดของ Google unescapeเนื่องจากว่าescape/ unescapeIs Evil (และนั่น\x3Cจะเป็นวิธีที่ง่ายกว่ามากในการทำเช่นนั้น)
bobince

3
@Keltex: รหัสไม่ถูกต้องอย่างไรก็ตามอ้างว่าเป็นแนวทางปฏิบัติที่ดีเพียงเพราะบางคนใช้มันไม่ใช่ข้อโต้แย้งที่ถูกต้อง
Matti Virkkunen

4

มันถูกต้องและขึ้นอยู่กับกรอบงานฝั่งเซิร์ฟเวอร์ของคุณและลักษณะของโค้ดบางครั้งก็ยากที่จะหลีกเลี่ยง


4

ดังที่หลายคนกล่าวถึงมันถูกต้องใช้งานได้และมีการใช้กันอย่างแพร่หลาย

แนวทางปฏิบัติที่ดีที่สุดเท่าที่ความหมายแนะนำ (หรืออย่างน้อยก็ใช้เพื่อแนะนำ) คือการวางแท็กสคริปต์ไว้ในส่วนหัว

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

เพื่อให้เข้าใจง่ายขึ้นและโค้ดที่ดูแลรักษาได้ขอแนะนำให้ใช้ "JavaScript ที่ไม่สร้างความรำคาญ" โดยที่โค้ดจะอยู่ในไฟล์ภายนอกและเชื่อมโยงเหตุการณ์กับ DOM (JavaScript ที่ไม่สร้างความรำคาญของ Google)

กรณีหนึ่งที่มีประโยชน์ในการมี JavaScript แบบอินไลน์คือการเริ่มต้นตัวแปรด้วยค่าที่มีอยู่เฉพาะฝั่งเซิร์ฟเวอร์ซึ่งจะถูกใช้โดยโค้ด JavaScript ภายนอกในภายหลัง


3

ฉันชอบที่จะใส่การอ้างอิงถึงสคริปต์ภายนอกลงในส่วนหัวและสคริปต์ที่เริ่มต้นสิ่งต่างๆและเริ่มต้นวิดเจ็ตและสิ่งที่ไม่ได้อยู่ในเนื้อความ

ปัญหาที่พบได้ง่ายมากคือองค์ประกอบสคริปต์ในร่างกายไม่สามารถเข้าถึงองค์ประกอบที่ตามมาได้ นอกจากนี้ปัญหาความเข้ากันได้ของเบราว์เซอร์ที่น่ารังเกียจคือความจริงที่ว่า IE ไม่อนุญาตให้องค์ประกอบของสคริปต์แก้ไของค์ประกอบที่อยู่ในนั้นดังนั้นหากคุณมีสิ่งนี้:

<div id="foo">
  <script type="text/javascript">
    document.getElementById("foo")... // do something to it
  </script>
</div>

IE จะไม่ชอบหน้าของคุณ IE เวอร์ชันเก่าเคยให้ข้อความแสดงข้อผิดพลาดที่คลุมเครือมากสำหรับสิ่งนี้หรือแม้กระทั่งเว้นว่างทั้งหน้า แต่ดูเหมือนว่า IE8 จะให้ข้อความแสดงข้อผิดพลาดที่เป็นคำอธิบาย

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


3

ใช้ได้!

คุณสามารถใช้ได้:

<script type="text/javascript">
    //<![CDATA[

    // Some JavaScript code that perfectly validates in the W3C validator

    //]]>
</script>

ฉันไม่คิดว่าคุณจะพูดได้ว่าเป็นการปฏิบัติที่ไม่ดีโดยทั่วไปหรือไม่ คุณต้องบอกเป็นกรณี แต่แน่นอนว่าเป็นการดีที่จะมีโค้ด JavaScript ทั้งหมดของคุณในที่เดียวกัน จะค่อนข้างยุ่งถ้าคุณมีโค้ด JavaScript เพียงเล็กน้อยในไฟล์ HTML ของคุณ


2
เป็นการปฏิบัติที่ไม่ดีโดยทั่วไป
Jason

โอเคแค่อ่านที่คุณโพสต์สิ่งที่ควรรู้ ฉันไม่เคยทำมันอยู่แล้ว แต่ไม่ว่ามันจะทำให้เบราว์เซอร์ของคุณแฮงค์ได้ ... ... มันมาได้อย่างไร?
แม้ว

1
JavaScript ใด ๆ ก็สามารถแขวนเบราว์เซอร์ของคุณได้ (บางครั้งฉันยังคงได้รับกล่องแจ้งเตือนเหล่านั้นใน Firefox ด้วยตัวเลือก 'Abort script' และ 'Continue script')
Marcel Korpel

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

อย่าใช้สิ่ง CDATA นั้น - มันเป็นเรื่องไร้สาระ เฉพาะโปรแกรมแยกวิเคราะห์ที่ตรวจสอบความถูกต้องของ XML เท่านั้นที่เข้าใจส่วน CDATA ดังนั้นหากหน้าเว็บของคุณแสดงเป็น HTML ก็จะไม่มีความแตกต่างในการทำงาน อย่างไรก็ตามหากหน้าเว็บของคุณแสดงเป็น XML หน้านั้นจะแสดงผล "//" ก่อนแท็กเปิด
brothercake

2

ฉันไม่เคยเห็นสิ่งนี้มาก่อน ดูเหมือนว่าจะใช้ได้กับเบราว์เซอร์บางตัวที่ฉันได้ทดสอบ แต่เท่าที่ฉันทราบการวางแท็กสคริปต์ในตำแหน่งเช่นนี้ไม่ถูกต้อง

ถูกต้อง แต่ไม่ใช่วิธีปฏิบัติที่ดี (หรือแนะนำ)

ฉันผิดเหรอ? การที่เราวางแท็กสคริปต์ไว้ในแท็ก div เช่นนี้แย่แค่ไหน? มีปัญหาความเข้ากันได้ของเบราว์เซอร์ที่ฉันควรทราบหรือไม่?

ไม่มีปัญหาในการวาง<script>องค์ประกอบอื่น ๆ (แต่ควรอยู่ภายใน<head>หรือ<body>) นอกจากนี้ยังไม่มีปัญหาในแง่ของความเข้ากันได้ของเบราว์เซอร์อย่างไรก็ตามการฝังสคริปต์ JS บนหน้าเว็บทำให้เกิดข้อเสียร้ายแรง(อย่างไร / เหตุใดจึงถือว่าไม่ดี) :

  1. เพิ่มน้ำหนักหน้า
  2. ความยาก (หรืออาจเป็นไปไม่ได้) สำหรับการลดขนาด
  3. ไม่สามารถโอนย้ายหรือใช้สำหรับเพจอื่นได้
  4. ไม่สามารถแคชได้(ต้องดาวน์โหลดทุกครั้งที่โหลดหน้า)
  5. ไม่แยกความกังวล(รักษายากกว่า)

2

อย่างไรก็ตามยังดีที่คุณทราบว่าโค้ด JavaScript ที่จำเป็นสำหรับส่วนของ HTML จะอยู่ที่นั่น แทนที่จะต้องยืนยันและสร้างการรวมไว้ที่ด้านบนของไฟล์

ดังนั้นแทนที่จะ "ถ้าคุณจะใช้ HTML นี้ตรวจสอบให้แน่ใจว่าคุณนำเข้า xyz.js" คุณสามารถรวม HTML และดำเนินการได้

ดังนั้นจึงไม่จำเป็นต้องเป็นสิ่งชั่วร้ายที่น่ากลัวเสมอไป อาจจะไม่ได้น่าประทับใจ แต่ก็ไม่ได้แย่มากเช่นกัน ชนิดของมันขึ้นอยู่กับเจตนา


2

ดูแนวทางปฏิบัติที่ดีที่สุดของ Yahoo UI: http://developer.yahoo.com/performance/rules.html (JavaScript ที่ด้านล่างของหน้า)


+1 ใหญ่! มีคำตอบมากมาย แต่ไม่มีคำตอบใดที่กล่าวถึงว่าสคริปต์ใน HEAD สามารถบล็อกองค์ประกอบอื่น ๆ ได้ (เช่นภาพ! ซึ่งอาจทำให้เลย์เอาต์สับสนเมื่อเชื่อมต่อช้า)
David J

1

ถูกกฎหมายอย่างแน่นอน ฉันเคยเห็นมันในสองสามหน้าที่นี่ใน Exforsysเช่น

ตอนนี้เป็นไซต์การสอนที่แสดงพื้นฐานของ HTML และ JavaScript เพื่อให้เข้าใจได้อย่างสมบูรณ์ในบริบทนั้น อย่างไรก็ตามฉันไม่ต้องการเห็นมันในรหัสการผลิตสำหรับสิ่งอื่นใดมากไปกว่าคำสั่งธรรมดาหรือสองคำ // Some JavaScript code hereฉันไม่อยากแสดงความคิดเห็นโดยไม่เห็นสิ่งที่คุณแทนที่

ไม่ควรมีปัญหาเกี่ยวกับเบราว์เซอร์ใด ๆ กับสิ่งนี้


1

สามารถเพิ่ม <script> ใน bodyได้ แต่ Internet Explorer ไม่ชอบจริงๆ ดังนั้นเพื่อความปลอดภัยยิ่งขึ้นตรวจสอบให้แน่ใจว่าคุณมีสคริปต์ของคุณอยู่ในแท็ก <head>

นั่นเป็นการสร้างความเสียหาย (โดยเฉพาะสำหรับ Internet Explorer) ในโครงการที่เรากำลังดำเนินการอยู่


1

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

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

ฉันจะไม่เรียกใช้ฟังก์ชันที่ใช้เวลานานในแท็กสคริปต์แบบอินไลน์เนื่องจากสิ่งเหล่านี้เกิดขึ้นในการโหลดหน้าเว็บและตามที่ Jason ระบุไว้ข้างต้นอาจทำให้การโหลดหน้าเว็บช้าลง ไลบรารีสคริปต์ทั้งหมดมีฟังก์ชันที่เป็นระเบียบซึ่งช่วยให้คุณสามารถทำสิ่งต่างๆในการโหลดเพจและจะให้คุณมีตัวเลือกว่าเมื่อใดในการโหลดเพจเพื่อเริ่มการทำงานเช่นหลังจากโหลด DOM


1

เป็นหนึ่งในแนวทางปฏิบัติที่ดีที่สุดหลายประการเกี่ยวกับการปรับปรุงประสิทธิภาพเช่นเดียวกับการปรับปรุงแนวทางการเขียนโปรแกรมของคุณ

ท้ายที่สุดแล้วในการพัฒนาเว็บการทำให้ผลิตภัณฑ์มีความสำคัญมากที่สุด!


1

ใช้ได้อย่างสมบูรณ์แบบแม้ว่าอาจส่งผลเสียต่อการบำรุงรักษา ดูเพิ่มเติมที่ฉันควรใส่แท็ก <script> ในมาร์กอัป HTML ได้อย่างไร และเหตุใดการเรียกใช้ฟังก์ชัน jQuery นี้จึงล้มเหลวใน Firefox .


0

คำแนะนำที่ระบุไว้ว่าควรเก็บสคริปต์ไว้ในส่วนหัวเพื่อให้แน่ใจว่าสคริปต์ถูกโหลดก่อนที่จะถูกเรียก นี่เป็นปัญหาสำหรับตัวจัดการเหตุการณ์บางอย่างเท่านั้น สำหรับสคริปต์ประเภทอื่นไม่สำคัญและสำหรับบางประเภท (เช่น document.write) จะไม่สมเหตุสมผลเลย


0

หากคุณมีโปรแกรมแก้ไขที่สามารถจัดการทั้งไวยากรณ์ HTML และ JavaScript พร้อมกัน และถ้าคุณชอบอ่าน HTML สักสองสามบรรทัดก่อนแล้วจึงใช้ JavaScript cpde ... แน่นอน ไปเลย


ฟังดูเหมือน Visual Studio และมุมมองมีดโกนซึ่งสามารถจัดการทั้งสองอย่างได้ สิ่งนี้ค่อนข้างสะดวกในบางกรณี (รหัสทั้งหมดที่คุณต้องแก้ไขในที่เดียว) แน่นอนว่าจาวาสคริปต์ในมุมมองที่มากเกินไปอาจทำให้การอ่านและทำความเข้าใจโค้ดเป็นเรื่องยากและยังมีปัญหาในการขยาย html ของเอาต์พุต
jahu

0

บางสิ่ง:

  1. เป็นรหัสที่ถูกต้องอย่างสมบูรณ์
  2. มันเป็นเรื่องไม่ปกติอย่างสมบูรณ์

การทำเช่นนี้จะทำให้การโหลดหน้าเว็บช้าลงอย่างมากเนื่องจากโค้ด JavaScript ต้องทำงานก่อนที่ส่วนที่เหลือของหน้าจะสามารถแสดงผลได้ หากคุณใช้งานโค้ด JavaScript จำนวนมากเบราว์เซอร์ของคุณอาจค้าง คุณควรพยายาม (ทุกครั้งที่ทำได้) โหลดโค้ด JavaScript ของคุณแบบไดนามิกและที่ส่วนท้ายของหน้าของคุณ (ควรอยู่ก่อน</body>แท็ก)

ซื้อและอ่านHigh Performance JavaScript มันจะเปลี่ยนวิธีเขียนโค้ด JavaScript


3
ไม่ใช่การโหวตดาวน์ของฉัน แต่เมื่อฉันคิดว่า Yahoo ฉันคิดว่าYAHOO.util.Event.addListenerจาวาสคริปต์ไม่ได้มีประสิทธิภาพ / รัดกุม ฉันจะไม่ได้อ่านหนังสือและรักษามันเป็นพระกิตติคุณบางครั้งคุณต้องมี JavaScript .jsในหน้าตัวเองเช่นตัวแปรแสดงผลแบบไดนามิกสิ่งที่คุณไม่สามารถทำได้ในภายนอก
Nick Craver

2
คุณอ่านหนังสือหรือยัง ถ้าคุณมีคุณจะรู้ว่ามันสอนเทคนิคการเพิ่มประสิทธิภาพ สิ่งที่ต้องการYAHOO.xx.xx.xxจะถูกแคชไว้ในเครื่อง ในบางครั้งใช่คุณสามารถแสดงตัวแปรบนหน้าได้ แต่โดยปกติแล้วสามารถทำได้จากภายนอก แต่อย่างใดหากคุณเพียงแค่ตั้งค่าอินพุตที่ซ่อนจากเซิร์ฟเวอร์ แต่ผมบอกว่ามันเป็นunrecommendedไม่ผิด นอกจากนี้นิโคลัสซากัสผู้เขียนก็รู้ดีว่าเขาเป็นใคร
Jason

2
"การโหลดแบบ dinamically" และ "การโหลดที่ส่วนท้ายของหน้า" นั้นแตกต่างกันและเป็นไปไม่ได้อย่างมากที่จะมีประสิทธิภาพที่เพิ่มขึ้นจากการใช้ทั้งสองอย่าง "คุณอ่านหนังสือหรือยัง" และ "ฉันถูกต้อง" ก็ไม่ใช่วิธีที่ดีที่สุดในการเริ่มบทสนทนาที่สร้างสรรค์ นอกจากนี้ยังสามารถตอบคำถามเดิมด้วย "เพราะในที่สุดมันก็ทำให้เกิดปัญหากับ IE" เนื่องจากการดำเนินการบางอย่างจะได้รับการสนับสนุนก็ต่อเมื่อสคริปต์เป็นส่วนย่อยของเนื้อหาโดยตรง
Nacho Coloma
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.