มีอะไรเลวร้ายเกี่ยวกับ DOM


42

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


31
Apart from cross-browser inconsistenciesมันยังไม่เพียงพอหรือ
yannis

3
คำถามเดียวกัน (รวมถึงการอ้างอิงถึง Crockford) ได้รับการถามและปิดเนื่องจากไม่สร้างสรรค์ที่ SO: เกิดอะไรขึ้นกับ DOM
ริ้น

3
คนส่วนใหญ่ที่บอกว่า DOM เป็นสาหัสมีทั้งไม่รู้หรือพูดมรดกเบราว์เซอร์ที่น่ากลัว
Raynos

โมเดลการเผยแพร่เหตุการณ์ไม่ถูกต้อง: ไม่อนุญาตให้โหนดพาเรนต์แทนที่ตัวจัดการเหตุการณ์ลูกเพื่อเพิ่มลักษณะการทำงานที่กำหนดเอง ใน OOP มันเรียกว่าฟังก์ชั่นเสมือนความหลากหลายและการมอบหมาย (การสืบทอดผ่านองค์ประกอบ) เหตุการณ์จะถูกจับจากบนลงล่างก่อนจากนั้นก็ขึ้นฟอง ใน Elm พวกเขาใช้โมเดลที่สามารถคอมโพสิตได้อย่างเพียงพอซึ่งเหตุการณ์ฟองสบู่ก่อนแล้ว "จับ" (เผยแพร่จากพ่อแม่สู่ลูก) จะช่วยให้ยกเลิกกิจกรรม ("ปิดหน้าต่าง?") และพฤติกรรมการแทนที่ / ตกแต่งองค์ประกอบของเด็ก
Brian Haak

คำตอบ:


33

Crockford ได้นำเสนออย่างกว้างขวางในหัวข้อ"Anconvenient API: Theory of the Dom"ซึ่งเขาอธิบายความคิดเห็นของเขาเกี่ยวกับ DOM ไม่มากก็น้อย มันยาว (1 ชม. 18 ม.) แต่การนำเสนอส่วนใหญ่ของ Crockford ค่อนข้างสนุกและให้ความรู้

Cross เบราว์เซอร์ไม่สอดคล้องกันดูเหมือนจะเป็นปัญหาหลักของเขาและฉันยอมรับว่ามันเป็นสิ่งที่น่ารำคาญที่สุดใน DOM เขาระบุ:

  • กับดักที่เป็นกรรมสิทธิ์ (กับเบราว์เซอร์และเซิร์ฟเวอร์)
  • ทำลายกฎ
  • สงครามองค์กร
  • ความกดดันครั้งรุนแรง

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

  • document.allคุณลักษณะของ Microsoft เท่านั้น
  • ความจริงที่ว่าnameและidเคยเป็นที่ใช้แทนกันได้
  • ฟังก์ชั่นที่แตกต่างกันในการดึงโหนด:
    • document.getElementById(id),
    • document.getElementsByName(name),
    • *node*.getElementsByTagName(tagName))

และยังคงมีตัวอย่างอีกสองสามตัวอย่างส่วนใหญ่จะกำหนดเป้าหมายไปที่ DOM การรั่วไหลของหน่วยความจำ มีสไลด์สรุปชื่อ "รอยแตกของ DOM" ที่สรุป:

  • รายการข้อผิดพลาด DOM รวมข้อบกพร่องทั้งหมดในเบราว์เซอร์
  • รายการข้อผิดพลาด DOM รวมข้อบกพร่องทั้งหมดในเบราว์เซอร์ที่รองรับทั้งหมด
  • ไม่มี DOM ที่ใช้มาตรฐานอย่างสมบูรณ์
  • DOM ส่วนใหญ่ไม่ได้อธิบายไว้ในมาตรฐานใด ๆ

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


18
ความขัดแย้งระหว่างเบราว์เซอร์ไม่เกี่ยวข้องกับ DOM นั่นคือสิ่งที่เราเรียกว่า "เบราว์เซอร์ดั้งเดิม" อย่ากล่าวโทษ DOM เนื่องจากมีเบราว์เซอร์รุ่นเก่า นั่นเหมือนกับการพูดว่า "linux sucks เพราะฉันรู้ว่า distro n และ m แบบดั้งเดิมและพวกเขาดูด"
Raynos

document.allอยู่ในมาตรฐาน
Raynos

@ Raynos ใช่และไม่ใช่ ผู้จำหน่ายเบราว์เซอร์เป็นกำลังสำคัญที่อยู่เบื้องหลังการวิวัฒนาการของมาตรฐานเว็บมานานเกินไปทำให้ทุกอย่างยุ่งเหยิง สิ่งที่ฉันพยายามจะเน้นคือ DOM นั้นไม่ใช่ความผิดพลาด แต่เป็นการใช้งานที่ผิดพลาดและวิธีการที่ไม่สอดคล้องกันที่มาตรฐานพัฒนาขึ้น ใช้document.allตัวอย่างเช่นมันอยู่ในมาตรฐาน แต่เป็นละเมิดโดยจงใจ
yannis

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

3
คำตอบที่ดี; สิ่งที่น่ารำคาญอีกอย่างที่คุณไม่ได้กล่าวถึงคือ DOM API นั้นละเอียดมาก - เพียงเปรียบเทียบโค้ด jQuery ทั่วไปเพื่อพูดแทรกองค์ประกอบที่มีแอตทริบิวต์ไม่กี่ตัวที่โหนดใดโหนดหนึ่งกับรุ่นธรรมดา -DOM ที่ทำเช่นเดียวกัน
tdammers

15

เกิดอะไรขึ้นกับ DOM นอกเหนือจากไวยากรณ์ที่ได้รับแรงบันดาลใจจาก Java (ซึ่ง Crockford ได้สัมผัส) ไม่มีอะไร

สิ่งที่ "ผิด" มีผลกับผู้ค้าเบราว์เซอร์บางส่วน สิ่งที่ "ผิด" ใช้กับนักพัฒนา สิ่งที่ "ผิด" นำไปใช้กับความไม่รู้

ดังนั้นจะเริ่มที่ไหน

ลงไปในโพรงกระต่าย ...

ผู้ขายเบราว์เซอร์

ก่อนอื่นผู้ขายเบราว์เซอร์ได้ต่อสู้แข่งขันในช่วงหลายทศวรรษที่จะ "ดีที่สุด", "เร็วที่สุด", "ง่ายที่สุด" ฯลฯ ในช่วงทศวรรษแรก (199x —2000) ไมโครซอฟท์ครองพัก Internet Explorer แนะนำแนวคิดใหม่ ๆ เช่น:

  • เปิดเผยเอ็นจิ้นการแยกวิเคราะห์ HTML ของเบราว์เซอร์ในฐานะinnerHTMLและ outerHTML;
  • การจัดการกับข้อความได้ง่ายด้วยinnerTextและouterText;
  • รูปแบบเหตุการณ์ ( *tachEvent) ที่เป็นพิมพ์เขียวสำหรับกิจกรรมระดับ DOM 2 ( *EventListener)

แต่ละคนมีส่วนร่วม (เพื่อให้ดีขึ้นและแย่ลง) อย่างมีนัยสำคัญกับกองพัฒนาเว็บในปัจจุบัน Opera ยังใช้งานได้ถึง 3 ครั้งในเวอร์ชัน 7 (2003)

อย่างไรก็ตาม Netscape มีรูปแบบเหตุการณ์ DOM ของตัวเอง ( *EventListener) ในปี 2000 มันกลายเป็นข้อกำหนดกิจกรรมระดับ DOM 2 Safari 1 (2003) ใช้โมเดลนี้ Opera 7 (2003) ใช้โมเดลนี้ด้วย เมื่อซากปรักหักพังของ Netscape กลายเป็น Mozilla Mozilla Firefox 1 (2004) จึงได้สืบทอดโมเดลนี้

สำหรับส่วนแรกของทศวรรษที่สอง (2000–2004) Microsoft ครองตำแหน่งสูงสุด Internet Explorer 6 (2001) เป็นเบราว์เซอร์ที่ดีที่สุดในขณะนั้น หนึ่งในคู่แข่งของ Opera 6 (2001) ยังไม่ได้ติดตั้ง DOM ระดับ 1 Core ( createElementet al.) Microsoft ได้ติดตั้งใน Internet Explorer 4 (1997) ก่อนที่สเปคจะกลายเป็นคำแนะนำ (1998)

อย่างไรก็ตามส่วนที่สองของทศวรรษที่สอง (2004 - 2010) จะพิสูจน์หายนะสำหรับ Microsoft ในปี 2003 Apple เปิดตัว Safari 1.0 ในปี 2004 Mozilla เสร็จสมบูรณ์ Firefox 1.0 ดูเหมือนว่า Microsoft จะนอนหลับอยู่บนบัลลังก์บนยอดภูเขาของเบราว์เซอร์ Internet Explorer 7 ไม่ได้เปิดตัวจนถึงปี 2549: ช่องว่างห้าปีย้อนหลังไปถึงวันที่วางจำหน่ายของ Internet Explorer 6 ต่างจาก Internet Explorer รุ่น 4 ถึง 6 รุ่น 7 คิดค้นเพียงเล็กน้อย การเปลี่ยนแปลง DOM เป็นนาที เกือบสองปีครึ่งต่อมา Internet Explorer 8 เปิดตัวแล้ว ไมโครซอฟท์ตื่นขึ้นจากการนอนหลับและสังเกตว่าผู้ค้าเบราว์เซอร์รายอื่นรวมตัวกันเกิดขึ้นทั่วมาตรฐานเว็บจำนวนมาก น่าเสียดายที่เวลาที่ผ่านไปนานเกินไปนับตั้งแต่นวัตกรรมที่แท้จริงของ Microsoft ครั้งล่าสุด มีการสร้างการเคลื่อนไหวในหมู่ผู้ขายเบราว์เซอร์ ต้องเพิ่มฟีเจอร์ DOM ใหม่ในแบบฟอร์มข้อมูลจำเพาะของ W3C ความคิดของ Microsoft ถูกทิ้งไว้ในอดีต รูปแบบกิจกรรมของ Microsoft (*tachEvent) ถูกแยกออกสำหรับโมเดลเหตุการณ์ระดับ DOM 2 Internet Explorer ไม่ได้ใช้แบบจำลองก่อนหน้านี้จนกระทั่งรุ่น 9 (2011) ซึ่งกลายเป็นรูปแบบกิจกรรมระดับ DOM 3

ข้อผิดพลาดของ Microsoft (DOM) สามารถสรุปได้ดังต่อไปนี้:

  • การปรากฏตัวเป็นคุณสมบัติหลักของ Windows และข้อกำหนดด้านความปลอดภัยระดับ OS ที่เกิดขึ้น

  • การพึ่งพา ActiveX สำหรับรหัสฝั่งไคลเอ็นต์

  • นวัตกรรมที่ลดลงอย่างน่าสงสัยหลังจากรุ่น 6 (2001)


(เว็บ) นักพัฒนา

ประการที่สองนักพัฒนามีความผิดจำนวนหนึ่ง ในขณะที่เว็บยังคงดำเนินต่อไปเรื่อย ๆ ผู้คนจำนวนมากขึ้นเรื่อย ๆ ในการพัฒนาเว็บ สิ่งนี้นำไปสู่การเจือจางความสามารถและจรรยาบรรณในการทำงาน อย่างไรก็ตามปัญหาส่วนใหญ่ขึ้นอยู่กับทัศนคติ "ทำให้เสร็จเร็ว" มีความสำคัญเหนือกว่า "ทำให้เสร็จถูกต้อง" เป็นผลให้หน้าเว็บนับไม่ถ้วนเข้ากันไม่ได้กับเบราว์เซอร์ต่างๆ หนึ่งในสาเหตุหลักของความไม่ลงรอยกันนี้คือการปฏิบัติที่เรียกว่า "ตัวแทนผู้ใช้ดมกลิ่น" แม้ว่าการฝึกจะยังคงใช้อยู่ในปัจจุบัน แต่ก็พิสูจน์แล้วว่าผิดพลาดและเป็นอันตราย โอเปร่ายังไปจนถึง "หยุด" รุ่นตัวแทนผู้ใช้ที่ "9.80" ในรุ่น 10 (2009) และอื่น ๆ สิ่งนี้มีวัตถุประสงค์เพื่อป้องกันสคริปต์ที่ผิดพลาดไม่ให้แตก การฝึกฝนที่ดีกว่าเรียกว่า "


ความไม่รู้

ประการที่สามจุดโทษที่ฉันชอบคือความเขลา ความไม่รู้ในความจริงที่ว่าผู้ขายเบราว์เซอร์ไม่ได้ทำงานร่วมกันเกือบพอที่จะสร้างข้อมูลจำเพาะแบบครบวงจร; ความไม่รู้ในความจริงที่ว่า Microsoft หลบเลี่ยงผู้ใช้เบราว์เซอร์อื่น ๆ ความไม่รู้ในความเป็นจริงที่ว่านักพัฒนามีทั้งขี้เกียจเกินไปหรือสายตาสั้นเกินไปที่จะรำคาญการวิจัยเบราว์เซอร์ (โดยเฉพาะผู้ที่ไม่ได้เป็นสมัย en .) มีความแตกต่างมากใน APIs และการใช้งานที่มี ส่วนใหญ่สามารถหลีกเลี่ยงได้ด้วยวิธีการที่เรียบง่าย แต่มีการป้องกัน (พึ่งพา DOM 0) พร้อมกับการวิจัยและการทดสอบจำนวนมาก ความไม่รู้นำไปสู่ความคิดที่ว่า Internet Explorer 6 เป็นความเสียหายต่อโลก (จำจุดบนบัลลังก์เบราว์เซอร์ที่กล่าวถึงก่อนหน้านี้)


การสะท้อน

น่าเศร้าที่ DOM เป็นเพียง API ที่เข้าใจผิด ความปรารถนามากมายที่จะขว้างก้อนหิน (ผ่าน FUD) แต่มีความปรารถนาเพียงเล็กน้อยที่จะเรียนรู้ความสลับซับซ้อน หนึ่งในผลของความไม่รู้นี้คือการแนะนำ DOM "selectors" DOM at heart เป็น API เพื่อจัดการโครงสร้างของเอกสาร Tree traversal ควรใช้สำหรับปัญหาที่ซับซ้อนตามรูปแบบของเอกสารที่ถูกแยกวิเคราะห์ ด้วยการแนะนำ DOM Selectors API ตอนนี้ผู้พัฒนาสามารถใช้ประโยชน์จากเอนจิ้นการสำรวจเส้นทาง CSS ของเบราว์เซอร์ สะดวกมาก แต่ซ่อนเร้นรูปแบบที่แท้จริงของทรีเอกสาร ด้วย "selectors" การดึงข้อมูลองค์ประกอบโหนดนั้นเป็นระดับประถมศึกษา อย่างไรก็ตาม DOM มีชนิดโหนดอื่นที่ระบุไว้สิบเอ็ดรายการ โหนดข้อความอะไร แสดงความคิดเห็นโหนด? โหนดเอกสารหรือไม่ เหล่านี้เป็นโหนดที่มักต้องการในขณะที่โต้ตอบกับ DOM


ข้อสรุป

ในระยะสั้นใช้เวลาของคุณและอ่านข้อกำหนดต่างๆของ DOM ทดสอบโค้ดในเบราว์เซอร์ให้ได้มากที่สุด หากพบว่า Internet Explorer ทำงานผิดปกติให้ปรึกษา MSDN พฤติกรรมส่วนใหญ่มักถูกบันทึกไว้

(เกร็ดเล็กเกร็ดน้อยประวัติศาสตร์สามารถและอาจไม่ถูกต้อง; ความไม่ถูกต้องใด ๆ ที่จะได้รับการต้อนรับ)

-Matt


โอเปร่ายิ่งไปกว่านั้น "หยุด" - ฉันเกลียดวิธีการนี้เพราะค่อนข้างสั้น (นักพัฒนาบางคนไม่สามารถเขียนโค้ดได้ดังนั้นให้ไข API เพื่อช่วยพวกเขา) โดยปกติคุณจะต้องได้รับประเภทและเวอร์ชันของเบราว์เซอร์เมื่อมีข้อผิดพลาดเฉพาะในเบราว์เซอร์นั้นซึ่งลูกค้าของคุณยืนยันในการแก้ไข การแก้ไขสำหรับเบราว์เซอร์ที่เฉพาะเจาะจงนั้นง่ายกว่าการใช้ "การตรวจจับบั๊ก" (เช่นการย้อนกลับของ "การตรวจจับคุณสมบัติ")
Pavel Horal

3

DOM เป็น API ที่แย่มาก

นั่นคือผิด DOM ไม่ใช่ API ที่แย่มาก

  • ก่อนอื่นให้จำไว้ว่า DOM คือผู้ไม่เชื่อเรื่องภาษา ภาษาหลักทั้งหมดใช้ API นี่เป็นเพราะคุณไม่ได้ใช้ในเบราว์เซอร์ แต่ทุกที่ที่คุณต้องจัดการกับ XML

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

  • ประการที่สาม DOM เป็นหนึ่งในสองวิธีหลักในการแยกวิเคราะห์ XML (อื่น ๆ คือ SAX) และ DOM ขึ้นอยู่กับบริบทของคุณ DOM มีประสิทธิภาพมาก

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

  • ก่อนอื่นถ้าคุณคิดเกี่ยวกับมัน DOM เป็นหนึ่งในพื้นที่ที่ความไม่ลงรอยกันเหล่านี้เอาชนะได้ง่ายกว่า ในการเปรียบเทียบเหตุการณ์เช่นหลอกลวงมากและน่ารำคาญที่จะทำให้ปกติ

  • ประการที่สองการตรวจจับคุณสมบัติสำหรับคุณสมบัติ DOM นั้นง่ายกว่าพื้นที่อื่น

  • ประการที่สาม DOM 3 ดีกว่า - และทุกวันนี้เบราว์เซอร์ทุกตัวรองรับมากที่สุด

แน่นอนว่าความเข้ากันไม่ได้นั้นน่ารำคาญ แต่เมื่อคุณลงไปถึงพวกเขา DOM จะระคายเคืองน้อยลง

ฉันไม่เห็นด้วยกับเหตุผลเช่นกับดักที่เป็นกรรมสิทธิ์สงครามองค์กร ฯลฯ เป็นเหตุผลสำหรับมัน

  • ฉันคิดว่ามันเป็นการตัดการเชื่อมต่อระหว่างปรัชญาของ JavaScript ซึ่งเป็นภาษาที่มีน้ำหนักเบาและการใช้งาน DOM นั้นได้รับแรงบันดาลใจจาก Java ซึ่งมีส่วนทำให้เกิดความยุ่งยากอย่างมาก

  • ประการที่สอง DOM ได้รับการออกแบบมาสำหรับ XML และได้รับการดัดแปลงสำหรับ HTML ดังนั้นในเบราว์เซอร์เรามี DOM สองประการคือ HTML DOM และ XML DOM และไม่เข้ากัน

  • ประการที่สามการสำรวจเส้นทาง DOM ในเบราว์เซอร์ไม่ดี เราไม่มี XPath สำหรับ HTML DOM ดังนั้นก่อนที่จะเลือกเครื่องมือ CSS มันน่าเบื่อมากที่จะสำรวจเส้นทาง

ในที่สุดฉันคิดว่าวันนี้กับเบราว์เซอร์ที่ทันสมัย ​​(และด้วยเบราว์เซอร์ที่เก่ากว่าค่อย ๆ จางหายไป) ไม่มีเหตุผลที่ DOM จะต้องเรียกว่าไม่ดี แน่นอนว่ามันจะดีขึ้นในเบราว์เซอร์ทั้ง API และการใช้งาน


เหตุการณ์ต่าง ๆ เป็นเรื่องปกติธรรมดาที่จะทำให้ปกติ: \
Raynos

คิดเกี่ยวกับมัน - ถ้าคุณต้องสนับสนุนcurrentTargetคุณสมบัติสำหรับวัตถุเหตุการณ์ - มันจะไม่สำคัญหรือ?
treecoder

การนำ bubbling ของเหตุการณ์ไปใช้เป็นเหมือนรหัส 100 บรรทัด: \
Raynos

currentTargetไม่ได้เป็นเพียงแค่เดือดปุด ๆ เหตุการณ์ - และมันจะเป็นการดีที่จะใช้การเดือดปุด ๆ เหตุการณ์ของคุณเอง?
treecoder

1
และเมื่อdataManagerนั่งข้างนอกคุณบอกว่ารหัสนั้นเป็นเรื่องเล็กน้อยใช่ไหม :)
เครื่องมือถอดรหัส
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.