วิธีการใช้งานฟังก์ชั่นเมื่อหน้าโหลดเต็ม?


306

ฉันต้องการรันโค้ด JavaScript บางตัวเมื่อโหลดหน้าเว็บจนเต็ม รวมถึงสิ่งต่าง ๆ เช่นรูปภาพ

ฉันรู้ว่าคุณสามารถตรวจสอบว่า DOM พร้อมหรือไม่ แต่ฉันไม่ทราบว่าเป็นเช่นเดียวกับเมื่อโหลดหน้าเว็บเต็มหรือไม่


7
ดังนั้นคุณจะตรวจสอบว่า DOM พร้อมหรือไม่
Mads Skjern

คำตอบ:


441

loadที่เรียกว่า มันมา waaaaay ก่อนที่จะพร้อม DOM อยู่และ DOM พร้อมถูกสร้างขึ้นจริงด้วยเหตุผลที่แน่นอนที่loadรอในภาพ

window.addEventListener('load', function () {
  alert("It's loaded!")
})

3
ดังนั้นเพียงชี้แจง (ถ้าฉันอาจ) เมื่อเทียบกับ DOM พร้อมwindow.onloadเรียกว่าเมื่อทุกองค์ประกอบของหน้า / resourse (เช่น * รวมถึง * ภาพ) ฉันถูกไหม?
BreakPhreak

19
@BreakPhreak: ใช่ :) onloadรอทรัพยากรทั้งหมดที่เป็นส่วนหนึ่งของเอกสาร แน่นอนว่านี่ไม่รวมคำขอที่สร้างขึ้นแบบไดนามิกซึ่งไม่ได้เป็นส่วนหนึ่งของเอกสารเช่นคำขอ AJAX
Matchu

3
ไม่ได้โหลดสคริปต์อย่างสมบูรณ์
HD ..

จะเกิดอะไรขึ้นถ้าสคริปต์ของฉันอาจถูกโหลดแบบไดนามิกและเกิดเหตุการณ์ "โหลด" ก่อนที่ฉันจะเพิ่มตัวจัดการ
pamelus

31
วิธีที่ดีกว่าคือaddEventListener("load", function(){... })แทนที่จะเขียนทับonloadคุณสมบัติ
user4642212

30

โดยปกติแล้วคุณสามารถใช้งานwindow.onloadได้ แต่คุณอาจสังเกตเห็นว่าเบราว์เซอร์ล่าสุดไม่ทำงานwindow.onloadเมื่อคุณใช้ปุ่มย้อนกลับ / ไปข้างหน้า

บางคนแนะนำให้ใช้สิ่งแปลก ๆ ในการแก้ปัญหานี้ แต่จริงๆแล้วถ้าคุณแค่window.onunloadจัดการ (แม้คนที่ไม่ได้ทำอะไรเลย) พฤติกรรมการแคชนี้จะถูกปิดการใช้งานในเบราว์เซอร์ทั้งหมด MDCเอกสาร "คุณสมบัติ" นี้สวยดี แต่ด้วยเหตุผลบางอย่างยังคงมีคนที่ใช้setIntervalและแฮ็แปลกอื่น ๆ

Opera บางเวอร์ชันมีข้อบกพร่องที่สามารถแก้ไขได้โดยการเพิ่มสิ่งต่อไปนี้ในหน้าของคุณ:

<script>history.navigationMode = 'compatible';</script>

หากคุณเพียงแค่พยายามรับฟังก์ชั่นจาวาสคริปต์ที่เรียกว่าหนึ่งครั้งต่อการดู (และไม่จำเป็นว่าหลังจากโหลด DOM เสร็จแล้ว) คุณสามารถทำสิ่งนี้ได้:

<img src="javascript:location.href='javascript:yourFunction();';">

ตัวอย่างเช่นฉันใช้เคล็ดลับนี้เพื่อโหลดไฟล์ที่มีขนาดใหญ่มากลงในแคชบนหน้าจอโหลด:

<img src="bigfile"
onload="this.location.href='javascript:location.href=\'javascript:doredir();\';';doredir();">

ทุกคนสามารถอธิบายได้ว่าการหลอกลวงนี้ทำงานอย่างไร ซับซ้อนเกินไปสำหรับฉัน doh ..
Razzle

20

เพื่อความสมบูรณ์คุณอาจต้องการผูกเข้ากับ DOMContentLoaded ซึ่งตอนนี้ได้รับการสนับสนุนอย่างกว้างขวาง

document.addEventListener("DOMContentLoaded", function(event){
  // your code here
});

ข้อมูลเพิ่มเติม: https://developer.mozilla.org/en-US/docs/Web/Events/DOMContentLoaded


7
คำตอบนี้ตรงข้ามกับที่ถามในคำถาม
มูฮัมหมัดบินหัสรัตน์

2
แท้จริงแล้วเหตุการณ์ DOMContentLoaded จะถูกเรียกใช้เมื่อมีการโหลดเนื้อหา DOM ทั้งหมดก่อนที่จะโหลดการอ้างอิงทั้งหมด เนื่องจากผู้ใช้ในกลุ่มของคำตอบอ้างอิงที่$.readyฉันคิดว่ามันมีส่วนร่วมที่ดี Btw ฉันจะใช้addEventListener-method สำหรับloadเหตุการณ์ด้วยเพราะจะช่วยให้คุณมีการโทรกลับหลายครั้ง:window.addEventListener("load", function(event){ // your code here });
รบกวน

16

ลองใช้เลยเฉพาะเรียกใช้หลังจากหน้าทั้งหมดโหลดแล้ว

โดย Javascript

window.onload = function(){
    // code goes here
};

โดย Jquery

$(window).bind("load", function() {
    // code goes here
});

1
$(window)ทำให้ฉันคิดว่านี่เป็น jquery ใช่ไหม? หรือฉันจะทำให้สับสนกับจาวาสคริปต์? (ฉันใหม่สำหรับ JS)
Azendale

2
ทำไมไม่ใช้$(document).ready();เมื่อ jQuery ว่าง
Andreas

ของคุณเป็นเอกสาร (HTML แยกไม่มากก็น้อย) ส่วนอื่น ๆ ("โหลด") คือทุกอย่างรวมถึงรูปภาพและสไตล์ ขึ้นอยู่กับสิ่งที่คุณต้องการ
amenthes

11

ลองรหัสนี้

document.onreadystatechange = function () {
  if (document.readyState == "interactive") {
    initApplication();
  }
}

เยี่ยมชมhttps://developer.mozilla.org/en-US/docs/DOM/document.readyStateสำหรับรายละเอียดเพิ่มเติม


ใช่มันมีประโยชน์ ขอบคุณมาก ๆ ~
Bravo Yeung

2
"interactive"ไม่โหลดเต็มที่ "complete"เต็มแล้ว
Ryan Walker

ในที่สุด! ขอบคุณหนึ่งล้านยาโคบ วิธีการต่าง ๆ ทั้งหมดที่ระบุไว้ที่นี่ล้มเหลว (อย่างดีที่สุด radiobutton จะได้รับการอัปเดตและสามารถทำการคำนวณผลลัพธ์ได้ แต่ปุ่มจะไม่ปรากฏขึ้นมากด) วิธีการของคุณใช้กลอุบาย
Secr

8

เหตุการณ์ window.onload จะเริ่มทำงานเมื่อทุกอย่างถูกโหลดรวมถึงรูปภาพ ฯลฯ

คุณต้องการตรวจสอบสถานะ DOM ready ถ้าคุณต้องการให้โค้ด js ของคุณดำเนินการโดยเร็วที่สุด แต่คุณยังต้องเข้าถึงองค์ประกอบ DOM


8

Javascript ที่ใช้onLoad()งานกิจกรรมจะรอให้โหลดหน้าเว็บก่อนดำเนินการ

<body onload="somecode();" >

หากคุณใช้ฟังก์ชันเอกสารพร้อมกรอบงานของ jQuery โค้ดจะโหลดทันทีที่โหลด DOM และก่อนที่โหลดเนื้อหาหน้า:

$(document).ready(function() {
    // jQuery code goes here
});

7

คุณอาจต้องการใช้window.onloadเนื่องจากเอกสารระบุว่าไม่ได้ถูกไล่ออกจนกว่าทั้ง DOM พร้อมและสินทรัพย์อื่น ๆ ทั้งหมดในหน้า (ภาพ ฯลฯ ) ถูกโหลด


อ่าเก่ง ฉันทำสิ่งนี้ได้ดี ภาพสุดท้ายบนหน้านี้คือ: <img src = "imdbupdate.php? update = ajax" style = "display: hidden" onload = "window.location = 'movies.php? do = admincp'" /> อย่างไรก็ตามมัน ไม่ได้อ่านโดยตรงฉัน
Ben Shelock

...อะไร? คุณต้องการเปลี่ยนเส้นทางเมื่อโหลดภาพหรือไม่
Matchu

ฉันไม่แน่ใจว่าทำไมคุณถึงต้องการ แต่เหตุผลที่ไม่เปลี่ยนเส้นทางอาจเป็นเพราะมันแสดง: ซ่อนอยู่และทำให้เบราว์เซอร์ไม่ต้องโหลดเพราะมันจะไม่ปรากฏ
Matchu

อาจเป็นเพียงภาพที่ซ่อนอยู่ซึ่งทำอะไรบางอย่างที่สำคัญบนเซิร์ฟเวอร์เช่นการติดตามการเข้าชมหรือการทำบางสิ่งในฐานข้อมูล
Marc Novakowski

ฉันสามารถรับได้ แต่การเปลี่ยนเส้นทางหลังจากนั้นไม่สมเหตุสมผลสำหรับฉัน ทำไมมีหน้าเลยถ้าคุณไม่ต้องการให้ผู้ใช้ใช้เวลากับมัน? และหากเป้าหมายคือการเปลี่ยนเส้นทางเมื่อโหลดทำไมไม่ใช้เฉพาะเหตุการณ์ window.onload เนื่องจากเป็นการใช้งานโดยรวมที่สะอาดกว่า
Matchu


2

ในเบราว์เซอร์สมัยใหม่ที่มี javascript ที่ทันสมัย ​​(> = 2015) คุณสามารถเพิ่มtype="module"ไปยังแท็กสคริปต์ของคุณและทุกอย่างภายในสคริปต์นั้นจะทำงานหลังจากโหลดหน้าเว็บทั้งหมด เช่น:

<script type="module">
  alert("runs after") // Whole page loads before this line execute
</script>
<script>
  alert("runs before")
</script>

เบราว์เซอร์ที่มีอายุมากกว่าจะเข้าใจnomoduleแอตทริบิวต์ บางสิ่งเช่นนี้:

<script nomodule>
  alert("tuns after")
</script>

สำหรับข้อมูลเพิ่มเติมสามารถเยี่ยมชมjavascript.info



1

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

ดังนั้นโดยพื้นฐานแล้วจาวาสคริปต์นั้นมีวิธีการโหลดบนหน้าต่างที่ได้รับการดำเนินการซึ่งหน้าเต็มโหลดรวมถึงภาพ ...

คุณสามารถทำอะไรบางอย่าง:

var spinner = true;

window.onload = function() {
  //whatever you like to do now, for example hide the spinner in this case
  spinner = false;
};

-1

อัปเดต 2019:นี่คือคำตอบที่เหมาะกับฉัน ตามที่ฉันต้องการคำขอ ajax หลายรายการเพื่อดำเนินการและส่งคืนข้อมูลก่อนเพื่อนับจำนวนรายการ

$(document).ajaxComplete(function(){
       alert("Everything is ready now!");
});
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.