ฉันคอยฟังคน (โดยเฉพาะ Crockford) พูดว่า DOM เป็น API ที่แย่มาก แต่ไม่ได้พิสูจน์ความเป็นจริงของคำสั่งนี้ นอกเหนือจากความไม่สอดคล้องกันของเบราว์เซอร์แล้วอะไรคือสาเหตุที่ทำให้ DOM ถูกพิจารณาว่าไม่ดี?
ฉันคอยฟังคน (โดยเฉพาะ Crockford) พูดว่า DOM เป็น API ที่แย่มาก แต่ไม่ได้พิสูจน์ความเป็นจริงของคำสั่งนี้ นอกเหนือจากความไม่สอดคล้องกันของเบราว์เซอร์แล้วอะไรคือสาเหตุที่ทำให้ DOM ถูกพิจารณาว่าไม่ดี?
คำตอบ:
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 (และฉันคิดว่าพวกเราทุกคน) ต้องการให้เป็นเช่นนั้น แต่ผู้ค้าเบราว์เซอร์ดูเหมือนจะกระตือรือร้นที่จะร่วมมือกันมากกว่าพวกเขาเมื่อห้าหรือสิบปีที่แล้ว
document.all
อยู่ในมาตรฐาน
document.all
ตัวอย่างเช่นมันอยู่ในมาตรฐาน แต่เป็นละเมิดโดยจงใจ
เกิดอะไรขึ้นกับ DOM นอกเหนือจากไวยากรณ์ที่ได้รับแรงบันดาลใจจาก Java (ซึ่ง Crockford ได้สัมผัส) ไม่มีอะไร
สิ่งที่ "ผิด" มีผลกับผู้ค้าเบราว์เซอร์บางส่วน สิ่งที่ "ผิด" ใช้กับนักพัฒนา สิ่งที่ "ผิด" นำไปใช้กับความไม่รู้
ดังนั้นจะเริ่มที่ไหน
ผู้ขายเบราว์เซอร์
ก่อนอื่นผู้ขายเบราว์เซอร์ได้ต่อสู้แข่งขันในช่วงหลายทศวรรษที่จะ "ดีที่สุด", "เร็วที่สุด", "ง่ายที่สุด" ฯลฯ ในช่วงทศวรรษแรก (199x —2000) ไมโครซอฟท์ครองพัก Internet Explorer แนะนำแนวคิดใหม่ ๆ เช่น:
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 ( createElement
et 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
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 และการใช้งาน
currentTarget
คุณสมบัติสำหรับวัตถุเหตุการณ์ - มันจะไม่สำคัญหรือ?
currentTarget
ไม่ได้เป็นเพียงแค่เดือดปุด ๆ เหตุการณ์ - และมันจะเป็นการดีที่จะใช้การเดือดปุด ๆ เหตุการณ์ของคุณเอง?
dataManager
นั่งข้างนอกคุณบอกว่ารหัสนั้นเป็นเรื่องเล็กน้อยใช่ไหม :)
Apart from cross-browser inconsistencies
มันยังไม่เพียงพอหรือ