อะไรคือความแตกต่างระหว่างwindow.onloadเหตุการณ์และonloadเหตุการณ์ของbodyแท็ก? ฉันจะใช้เมื่อใดและควรทำอย่างไรให้ถูกต้อง?
อะไรคือความแตกต่างระหว่างwindow.onloadเหตุการณ์และonloadเหตุการณ์ของbodyแท็ก? ฉันจะใช้เมื่อใดและควรทำอย่างไรให้ถูกต้อง?
คำตอบ:
window.onload = myOnloadFuncและ<body onload="myOnloadFunc();">มีวิธีการที่แตกต่างกันของการใช้เหตุการณ์เดียวกัน การใช้งานwindow.onloadนั้นไม่น่ารำคาญน้อยกว่า - ใช้ JavaScript ของคุณจาก HTML
ไลบรารี JavaScript ทั่วไป, Prototype, ExtJS, Dojo, JQuery, YUI ฯลฯ ให้การล้อมรอบที่ดีรอบเหตุการณ์ที่เกิดขึ้นเมื่อเอกสารถูกโหลด คุณสามารถฟังหน้าต่างเหตุการณ์เหตุการณ์โหลดและตอบสนองต่อเหตุการณ์นั้น แต่ onLoad จะไม่ทำงานจนกว่าจะดาวน์โหลดทรัพยากรทั้งหมดดังนั้นตัวจัดการเหตุการณ์ของคุณจะไม่ถูกดำเนินการจนกว่าจะมีการเรียกภาพขนาดใหญ่ครั้งสุดท้าย ในบางกรณีนั่นคือสิ่งที่คุณต้องการอย่างแน่นอนในบางกรณีคุณอาจพบว่าการฟังเมื่อ DOM พร้อมแล้วก็เหมาะสมกว่า - เหตุการณ์นี้คล้ายกับ onLoad แต่เริ่มทำงานโดยไม่ต้องรอรูปภาพและอื่น ๆ เพื่อดาวน์โหลด
myOnloadFunc()ในบริบทโกลบอล ( thisจะอ้างถึงwindow) การตั้งค่าผ่าน javascript จะทำให้มันทำงานในบริบทขององค์ประกอบ ( thisหมายถึงองค์ประกอบที่เหตุการณ์ถูกเรียกใช้) ในกรณีนี้มันจะไม่สร้างความแตกต่าง แต่มันจะมีองค์ประกอบอื่น ๆ
thisอ้างถึงได้หากต้องการ
ไม่มีความแตกต่าง แต่คุณไม่ควรใช้อย่างใดอย่างหนึ่ง
ในเบราว์เซอร์จำนวนมากwindow.onloadเหตุการณ์จะไม่ถูกเรียกใช้จนกว่าจะโหลดรูปภาพทั้งหมดซึ่งไม่ใช่สิ่งที่คุณต้องการ เบราว์เซอร์ที่ใช้มาตรฐานมีเหตุการณ์ที่เรียกว่าDOMContentLoadedfires ก่อนหน้านี้ แต่ IE ไม่รองรับ (ในขณะที่เขียนคำตอบนี้) ฉันขอแนะนำให้ใช้ไลบรารี javascript ซึ่งรองรับคุณสมบัติข้ามเบราว์เซอร์ DOMContentLoaded หรือค้นหาฟังก์ชั่นที่เขียนได้ดีที่คุณสามารถใช้ได้ jQuery's $(document).ready()เป็นตัวอย่างที่ดี
window.onloadสามารถทำงานได้โดยไม่มีร่างกาย สร้างหน้าเว็บที่มีแท็กสคริปต์เท่านั้นและเปิดในเบราว์เซอร์ หน้าไม่มีเนื้อหาใด ๆ แต่ก็ยังใช้งานได้ ..
<script>
function testSp()
{
alert("hit");
}
window.onload=testSp;
</script>
<!ELEMENT html (head, body)>[1] - และ html401 ระบุ<!ELEMENT HTML O O (%html.content;)ด้วย<!ENTITY % html.content "HEAD, BODY">เช่นกัน [2] html51 ระบุA head element followed by a body element.เนื้อหา html เช่นกัน [3] w3.org/TR/xhtml1/dtds.html#a_dtd_XHTML-1.0-Strict w3.org/TR/xhtml1/dtds.html#a_dtd_XHTML-1.0-Strict w3.org/TR/html51/semantics.html#the -html-element - ดังนั้นฉันเดาว่ามาตรฐาน HTML ทั่วไป / ที่ใช้งานอยู่ทั้งหมดนั้นต้องใช้แท็กเนื้อหา :)
Start tag: optional, End tag: optional
ฉันชอบโดยทั่วไปจะไม่ใช้<body onload=""> กิจกรรม ฉันคิดว่าการแยกพฤติกรรมออกจากเนื้อหาให้มากที่สุดเท่าที่จะทำได้
ที่กล่าวว่ามีโอกาส (มักจะหายากสำหรับฉัน) ที่การใช้ตัวถังรถสามารถเพิ่มความเร็วเล็กน้อย
ฉันชอบที่จะใช้ Prototype ดังนั้นโดยทั่วไปฉันจะใส่อะไรแบบนี้ใน<headหน้าของฉัน:
document.observe("dom:loaded", function(){
alert('The DOM is loaded!');
});
หรือ
Event.observe(window, 'load', function(){
alert('Window onload');
});
ข้างต้นเป็นเทคนิคที่ผมได้เรียนรู้ที่นี่ ฉันชื่นชอบแนวคิดของการแนบตัวจัดการเหตุการณ์นอก HTML
(แก้ไขเพื่อแก้ไขการสะกดผิดในรหัส)
'คำตอบเชิงอัตวิสัยมากมายสำหรับคำถามวัตถุประสงค์ JavaScript "ไม่สร้างความรำคาญ" เป็นความเชื่อโชคลางเหมือนกฎเดิมที่จะไม่ใช้ gotos เขียนโค้ดในลักษณะที่ช่วยให้คุณบรรลุเป้าหมายได้อย่างน่าเชื่อถือไม่ใช่ตามความเชื่อทางศาสนาของใครบางคน
ทุกคนที่พบ:
<body onload="body_onload();">
การที่จะทำให้เสียสมาธิมากเกินไปคือการทำท่ามากเกินไปและไม่ได้จัดลำดับความสำคัญตรง
ปกติแล้วฉันจะใส่รหัส JavaScript ในไฟล์. js แยกกัน แต่ฉันไม่พบอะไรยุ่งยากเกี่ยวกับการเชื่อมโยงตัวจัดการเหตุการณ์ใน HTML ซึ่งเป็น HTML ที่ถูกต้องตามวิธี
window.onload- ถูกเรียกหลังจาก DOM, ไฟล์ JS, รูปภาพ, Iframes, ส่วนขยายและอื่น ๆ ทั้งหมดโหลดอย่างสมบูรณ์ นี่เท่ากับ $ (หน้าต่าง). load (function () {});
body onload=""- เรียกว่าเมื่อโหลด DOM แล้ว นี่เท่ากับ $ (เอกสาร). ready (function () {});
readyกับonloadเหตุการณ์vs loadไฟไหม้หลังจากโหลดเอกสารทั้งหมดรวมถึงสคริปต์ภาพและสไตล์ทั้งหมด DOMContentLoadedไฟไหม้หลังจากต้นไม้ DOM ได้รับการสร้างขึ้น แต่ก่อนที่ภาพ ฯลฯDOMContentLoadedที่มีความเท่าเทียมกันที่จะไม่document.ready load
นอกจากนี้ไม่มีความแตกต่าง ...
ดังนั้นโดยพื้นฐานแล้วคุณสามารถใช้ทั้งคู่ (ทีละครั้ง! -)
แต่เพื่อความสะดวกในการอ่านและเพื่อความสะอาดของรหัส html ฉันมักจะชอบ window.onload! o]
ถ้าคุณกำลังพยายามที่จะเขียนรหัส JS สร้างความรำคาญ (และคุณควรจะเป็น) <body onload="">แล้วคุณไม่ควรใช้
ฉันเข้าใจว่าเบราว์เซอร์ที่แตกต่างกันจัดการทั้งสองนี้แตกต่างกันเล็กน้อย แต่ทำงานเหมือนกัน ในเบราว์เซอร์ส่วนใหญ่หากคุณกำหนดทั้งสองจะถูกละเว้น
ลองนึกถึงการโหลดเช่นเดียวกับคุณลักษณะอื่น ๆ ตัวอย่างเช่นในกล่องอินพุตคุณสามารถใส่:
<input id="test1" value="something"/>
หรือคุณสามารถโทร:
document.getElementById('test1').value = "somethingelse";
แอ็ตทริบิวต์ onload ทำงานในลักษณะเดียวกันยกเว้นว่าจะรับฟังก์ชั่นเป็นค่าแทนที่จะเป็นสตริงเช่นเดียวกับแอตทริบิวต์ที่ทำ นอกจากนี้ยังอธิบายว่าทำไมคุณสามารถ "ใช้เพียงหนึ่งในนั้น" - การเรียก window.onload กำหนดค่าของแอตทริบิวต์ onload ใหม่สำหรับแท็ก body
นอกจากนี้เช่นเดียวกับคนอื่น ๆ ที่กำลังพูดอยู่มักจะเป็นเรื่องง่ายที่จะรักษาสไตล์และจาวาสคริปต์แยกจากเนื้อหาของหน้าซึ่งเป็นสาเหตุที่คนส่วนใหญ่แนะนำให้ใช้ window.onload หรือฟังก์ชั่นที่พร้อมของ jQuery
<body onload = ""> ควรแทนที่ window.onload
ด้วย <body onload = ""> document.body.onload อาจเป็นโมฆะไม่ได้กำหนดหรือฟังก์ชั่นขึ้นอยู่กับเบราว์เซอร์ (แม้ว่า getAttribute ("onload") ควรจะค่อนข้างสอดคล้องกันเพื่อให้ร่างกายของฟังก์ชั่นที่ไม่ระบุชื่อเป็นสตริง) . ด้วย window.onload เมื่อคุณกำหนดฟังก์ชั่นให้กับมัน window.onload จะเป็นฟังก์ชั่นที่สอดคล้องกันในเบราว์เซอร์ หากสิ่งนั้นสำคัญสำหรับคุณให้ใช้ window.onload
window.onload ดีกว่าสำหรับการแยก JS ออกจากเนื้อหาของคุณ ไม่มีเหตุผลมากนักที่จะใช้ <body onload = ""> อย่างไรก็ตามเมื่อคุณสามารถใช้ window.onload ได้
ใน Opera เป้าหมายเหตุการณ์สำหรับ window.onload และ <body onload = ""> (และแม้กระทั่ง window.addEventListener ("load", func, false)) จะเป็นหน้าต่างแทนเอกสารเช่นใน Safari และ Firefox แต่ 'นี่' จะเป็นหน้าต่างข้ามเบราว์เซอร์
สิ่งนี้หมายความว่าเมื่อมันเป็นเรื่องสำคัญคุณควรห่อสิ่งที่หยาบและทำสิ่งที่สอดคล้องกันหรือใช้ห้องสมุดที่ทำเพื่อคุณ
พวกเขาทั้งสองทำงานเหมือนกัน อย่างไรก็ตามโปรดทราบว่าหากกำหนดไว้ทั้งคู่จะมีการเรียกใช้เพียงหนึ่งรายการเท่านั้น ฉันมักจะหลีกเลี่ยงการใช้อย่างใดอย่างหนึ่งโดยตรง คุณสามารถแนบตัวจัดการเหตุการณ์กับเหตุการณ์โหลดได้ วิธีนี้คุณสามารถรวมแพ็กเกจ JS อื่น ๆ ได้ง่ายขึ้นซึ่งอาจต้องแนบการเรียกกลับไปยังเหตุการณ์ onload
เฟรมเวิร์ก JS ใด ๆ จะมีวิธีการข้ามเบราว์เซอร์สำหรับตัวจัดการเหตุการณ์
เป็นมาตรฐานที่ยอมรับได้ในการแยกเนื้อหาเค้าโครงและพฤติกรรม ดังนั้น window.onload () จะเหมาะสมกว่าที่จะใช้มากกว่า<body onload="">ทั้งสองทำงานเดียวกัน
ขออภัยสำหรับการเกิดใหม่ของหัวข้อนี้อีกครั้งหลังจากนั้นอีก 3 ปีของการนอนหลับ แต่บางทีฉันได้พบในที่สุดผลประโยชน์เถียงไม่ได้ของมากกว่าwindow.onload=fn1; <body onload="fn1()">มันเกี่ยวข้องกับโมดูล JSหรือโมดูลES : เมื่อonloadตัวจัดการของคุณอยู่ในไฟล์ "คลาสสิค" JS (เช่นที่เรียกว่าไม่มี<script type="module" … >วิธีใดเป็นไปได้เมื่อonloadตัวจัดการของคุณอยู่ในไฟล์ "โมดูล" JS (เช่นเรียกด้วย<script type="module" … >) <body onload="fn1()">จะล้มเหลวด้วย "fn1 () ไม่ได้กำหนดไว้ "ข้อผิดพลาดเหตุผลอาจเป็นได้ว่าโมดูล ES ไม่ได้โหลดก่อนที่จะแยกวิเคราะห์ HTML ... แต่เป็นเพียงการคาดเดาของฉันอย่างไรก็ตามwindow.onload=fn1;ทำงานได้อย่างสมบูรณ์กับโมดูล ...