ความแตกต่างระหว่างวิธีการwindow.onload
ของJavaScript และ jQuery คือ$(document).ready()
อะไร?
$().ready()
ทำให้เกิดไฟหลังจากนั้นwindow.onload
ในบางครั้ง
ความแตกต่างระหว่างวิธีการwindow.onload
ของJavaScript และ jQuery คือ$(document).ready()
อะไร?
$().ready()
ทำให้เกิดไฟหลังจากนั้นwindow.onload
ในบางครั้ง
คำตอบ:
ready
เหตุการณ์เกิดขึ้นหลังจากที่เอกสาร HTML ได้รับการโหลดในขณะที่onload
เหตุการณ์เกิดขึ้นต่อมาเมื่อเนื้อหาทั้งหมด (เช่นภาพ) นอกจากนี้ยังได้รับการโหลด
onload
เหตุการณ์เป็นเหตุการณ์มาตรฐานใน DOM ในขณะที่ready
เหตุการณ์เป็นเฉพาะกับ jQuery วัตถุประสงค์ของready
เหตุการณ์คือว่าควรเกิดขึ้นเร็วที่สุดหลังจากที่โหลดเอกสารแล้วดังนั้นโค้ดที่เพิ่มฟังก์ชันการทำงานให้กับองค์ประกอบในหน้าไม่จำเป็นต้องรอให้โหลดเนื้อหาทั้งหมด
ready
เหตุการณ์เป็นที่เฉพาะเจาะจงเพื่อ jQuery ใช้DOMContentLoaded
กิจกรรมหากมีอยู่ในเบราว์เซอร์ไม่เช่นนั้นจะทำการจำลอง ไม่มีสิ่งที่เทียบเท่าใน DOM เนื่องจากDOMContentLoaded
เหตุการณ์ไม่ได้รับการสนับสนุนในเบราว์เซอร์ทั้งหมด
onload
นี้ onload
เป็นชื่อของคุณสมบัติวัตถุที่เก็บฟังก์ชันที่จะเรียกใช้เมื่อมีการเรียกใช้load
เหตุการณ์
window.onload
เป็นเหตุการณ์ JavaScript ที่มีอยู่ในตัว แต่เมื่อการติดตั้งมีความละเอียดอ่อนข้ามเบราว์เซอร์ (Firefox, Internet Explorer 6, Internet Explorer 8 และOpera ) jQuery จะจัดเตรียมdocument.ready
สิ่งเหล่านี้ออกมาและไฟทันทีที่ DOM ของหน้าพร้อม (ไม่ต้องรอรูปภาพ ฯลฯ )
$(document).ready
(โปรดทราบว่ามันไม่ได้ document.ready
ซึ่งไม่ได้กำหนด) เป็นฟังก์ชั่น jQuery, การห่อและให้สอดคล้องกับเหตุการณ์ต่อไปนี้:
document.ondomcontentready
/ document.ondomcontentloaded
- เหตุการณ์ใหม่ที่เกิดขึ้นเมื่อโหลด DOM ของเอกสาร (ซึ่งอาจใช้เวลาก่อนที่จะโหลดภาพ ฯลฯ ); อีกครั้งแตกต่างกันเล็กน้อยใน Internet Explorer และในส่วนที่เหลือของโลกwindow.onload
(ซึ่งใช้งานได้แม้ในเบราว์เซอร์รุ่นเก่า) ซึ่งจะทำงานเมื่อโหลดหน้าเว็บทั้งหมด (รูปภาพสไตล์ ฯลฯ )load
เหตุการณ์window
ถูกนำไปใช้อย่างสมเหตุสมผลในเบราว์เซอร์อย่างสม่ำเสมอ ปัญหาที่ jQuery และไลบรารี่อื่นกำลังพยายามแก้ไขนั้นเป็นปัญหาที่คุณกล่าวถึงซึ่งload
เหตุการณ์นั้นไม่ได้ถูกไล่ออกจนกว่าทรัพยากรที่ขึ้นต่อกันทั้งหมดเช่นอิมเมจและสไตล์ชีตจะโหลดซึ่งอาจใช้เวลานานหลังจากโหลด DOM ทั้งหมดแล้ว แสดงผลและพร้อมสำหรับการโต้ตอบ กรณีที่เกิดเพลิงไหม้ในเบราว์เซอร์ได้มากที่สุดเมื่อ DOM พร้อมที่จะเรียกว่าไม่DOMContentLoaded
DOMContentReady
onload
(มีความแตกต่าง wrt FF / IE / Opera) สำหรับDOMContentLoaded
คุณถูกต้องทั้งหมด แก้ไขเพื่อชี้แจง
document.onload
ก็สามารถใช้งานได้) เท่าที่ window.onload ไป: window.onload = fn1;window.onload=fn2;
- เฉพาะ fn2 เท่านั้นที่จะเรียกใช้ onload เว็บโฮสติ้งฟรีบางแห่งแทรกรหัสของตัวเองลงในเอกสารและบางครั้งสิ่งนี้ก็ทำให้รหัสในหน้า
$(document).ready()
เป็นเหตุการณ์ jQuery $(document).ready()
วิธีการของ JQuery จะถูกเรียกใช้ทันทีที่ DOM พร้อม (ซึ่งหมายความว่าเบราว์เซอร์แยกวิเคราะห์ HTML และสร้างแผนผัง DOM) สิ่งนี้ทำให้คุณสามารถเรียกใช้รหัสได้ทันทีที่เอกสารพร้อมที่จะจัดการ
ตัวอย่างเช่นหากเบราว์เซอร์รองรับเหตุการณ์ DOMContentLoaded (เบราว์เซอร์ที่ไม่ใช่ IE หลายตัว) ก็จะเริ่มทำงานในเหตุการณ์นั้น (โปรดทราบว่าเหตุการณ์ DOMContentLoaded ถูกเพิ่มไปยัง IE ใน IE9 + เท่านั้น)
สามารถใช้ไวยากรณ์สองแบบสำหรับสิ่งนี้:
$( document ).ready(function() {
console.log( "ready!" );
});
หรือเวอร์ชั่นย่อ:
$(function() {
console.log( "ready!" );
});
ประเด็นหลักสำหรับ$(document).ready()
:
$
ด้วยjQuery
เมื่อคุณได้รับ "$ ไม่ได้ถูกกำหนด"$(window).load()
แทน window.onload()
เป็นฟังก์ชัน JavaScript ดั้งเดิม window.onload()
เหตุการณ์ fires เมื่อเนื้อหาทั้งหมดในหน้าเว็บของคุณมีการโหลดรวมทั้ง DOM (ที่ด็อม), โฆษณาแบนเนอร์และภาพ ความแตกต่างระหว่างทั้งสองก็คือว่าในขณะที่เราสามารถมีได้มากกว่าหนึ่ง$(document).ready()
ฟังก์ชั่นเราสามารถมีonload
ฟังก์ชั่นเดียวเท่านั้น
ของ Windows โหลดเหตุการณ์ fires เมื่อเนื้อหาทั้งหมดที่อยู่ในหน้าของคุณจะโหลดอย่างเต็มที่รวมทั้ง DOM (ด็อม) เนื้อหาและAsynchronous JavaScript , เฟรมและภาพ คุณยังสามารถใช้ body onload = ทั้งสองเหมือนกัน; window.onload = function(){}
และ<body onload="func();">
เป็นวิธีการใช้เหตุการณ์เดียวกันที่แตกต่างกัน
$document.ready
เหตุการณ์ฟังก์ชั่นjQueryรันเร็วกว่าwindow.onload
และถูกเรียกใช้เมื่อโหลด DOM (โมเดลวัตถุเอกสาร) บนหน้าของคุณ มันจะไม่รอให้ภาพเฟรมที่จะได้รับการโหลดอย่างเต็มที่
ที่นำมาจากบทความต่อไปนี้:
วิธีการที่$document.ready()
แตกต่างจากwindow.onload()
$(document).ready(function() {
// Executes when the HTML document is loaded and the DOM is ready
alert("Document is ready");
});
// .load() method deprecated from jQuery 1.8 onward
$(window).on("load", function() {
// Executes when complete page is fully loaded, including
// all frames, objects and images
alert("Window is loaded");
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.7.2/jquery.min.js"></script>
ข้อควรระวังในการใช้$(document).ready()
กับ Internet Explorer หากคำขอ HTTP ถูกขัดจังหวะก่อนที่จะโหลดเอกสารทั้งหมด (ตัวอย่างเช่นในขณะที่หน้ากำลังสตรีมไปยังเบราว์เซอร์จะมีการคลิกลิงก์อื่น) IE จะเรียกใช้$(document).ready
เหตุการณ์
หากรหัสใด ๆ ใน$(document).ready()
เหตุการณ์อ้างอิงถึงวัตถุ DOM อาจมีอยู่สำหรับวัตถุเหล่านั้นที่จะไม่พบและข้อผิดพลาดของ Javascript สามารถเกิดขึ้นได้ ป้องกันการอ้างอิงของคุณไปยังวัตถุเหล่านั้นหรือเลื่อนรหัสที่อ้างอิงวัตถุเหล่านั้นไปยังเหตุการณ์ window.load
ฉันไม่สามารถทำซ้ำปัญหานี้ในเบราว์เซอร์อื่น ๆ (โดยเฉพาะ Chrome และ Firefox)
มักจะใช้window.addEventListener
เพิ่มเหตุการณ์ไปที่หน้าต่าง เพราะวิธีการที่คุณสามารถรันโค้ดในตัวจัดการเหตุการณ์ที่แตกต่างกัน
รหัสที่ถูกต้อง:
window.addEventListener('load', function () {
alert('Hello!')
})
window.addEventListener('load', function () {
alert('Bye!')
})
รหัสไม่ถูกต้อง:
window.onload = function () {
alert('Hello!') // it will not work!!!
}
window.onload = function () {
alert('Bye!')
}
นี่เป็นเพราะ onload เป็นเพียงคุณสมบัติของวัตถุซึ่งถูกเขียนทับ
โดยการเปรียบเทียบกับaddEventListener
มันจะดีกว่าที่จะใช้$(document).ready()
มากกว่า onload
$(document).on('ready', handler)
เชื่อมโยงกับเหตุการณ์ที่พร้อมจาก jQuery ตัวจัดการที่เรียกว่าเมื่อ DOM ที่จะโหลด สินทรัพย์เช่นภาพอาจจะยังคงมีการขาดหายไป มันจะไม่ถูกเรียกถ้าเอกสารพร้อมในเวลาที่มีผลผูกพัน jQuery ใช้DOMContentLoaded -Eventเพื่อทำการจำลองถ้าไม่พร้อมใช้งาน
$(document).on('load', handler)
เป็นเหตุการณ์ที่จะเริ่มทำงานเมื่อโหลดทรัพยากรทั้งหมดจากเซิร์ฟเวอร์ โหลดรูปภาพแล้ว ในขณะที่onloadเป็นเหตุการณ์ HTML แบบดิบพร้อมสร้างโดย jQuery
$(document).ready(handler)
จริงเป็นสัญญา ตัวจัดการจะถูกเรียกทันทีหากเอกสารพร้อมในเวลาที่เรียก มิฉะนั้นจะผูกกับready
-Event
ก่อน jQuery 1.8 , ดำรงอยู่ในฐานะที่เป็นชื่อแทน$(document).load(handler)
$(document).on('load',handler)
$.fn.load
ที่ไม่ได้ทำหน้าที่เป็นตัวยึดเหตุการณ์อีกต่อไป ในความเป็นจริงมันล้าสมัยตั้งแต่ jquery 1.8 ฉันอัปเดตตามนั้น
$(document).ready()
เป็นjQueryเหตุการณ์ซึ่งเกิดขึ้นเมื่อเอกสาร HTML ได้รับการโหลดอย่างเต็มที่ในขณะที่window.onload
เหตุการณ์เกิดขึ้นต่อมาเมื่อทุกอย่างรวมทั้งภาพบนหน้าเว็บโหลด
window.onload ยังเป็นเหตุการณ์จาวาสคริปต์ที่แท้จริงใน DOM ในขณะที่$(document).ready()
เหตุการณ์เป็นวิธีการใน jQuery
$(document).ready()
มักจะเป็น wrapper สำหรับ jQuery เพื่อให้แน่ใจว่าองค์ประกอบทั้งหมดที่โหลดเข้ามาเพื่อใช้ใน jQuery ...
ดูซอร์สโค้ด jQuery เพื่อทำความเข้าใจว่ามันทำงานอย่างไร:
jQuery.ready.promise = function( obj ) {
if ( !readyList ) {
readyList = jQuery.Deferred();
// Catch cases where $(document).ready() is called after the browser event has already occurred.
// we once tried to use readyState "interactive" here, but it caused issues like the one
// discovered by ChrisS here: http://bugs.jquery.com/ticket/12282#comment:15
if ( document.readyState === "complete" ) {
// Handle it asynchronously to allow scripts the opportunity to delay ready
setTimeout( jQuery.ready );
// Standards-based browsers support DOMContentLoaded
} else if ( document.addEventListener ) {
// Use the handy event callback
document.addEventListener( "DOMContentLoaded", completed, false );
// A fallback to window.onload, that will always work
window.addEventListener( "load", completed, false );
// If IE event model is used
} else {
// Ensure firing before onload, maybe late but safe also for iframes
document.attachEvent( "onreadystatechange", completed );
// A fallback to window.onload, that will always work
window.attachEvent( "onload", completed );
// If IE and not a frame
// continually check to see if the document is ready
var top = false;
try {
top = window.frameElement == null && document.documentElement;
} catch(e) {}
if ( top && top.doScroll ) {
(function doScrollCheck() {
if ( !jQuery.isReady ) {
try {
// Use the trick by Diego Perini
// http://javascript.nwbox.com/IEContentLoaded/
top.doScroll("left");
} catch(e) {
return setTimeout( doScrollCheck, 50 );
}
// detach all dom ready events
detach();
// and execute any waiting functions
jQuery.ready();
}
})();
}
}
}
return readyList.promise( obj );
};
jQuery.fn.ready = function( fn ) {
// Add the callback
jQuery.ready.promise().done( fn );
return this;
};
นอกจากนี้ฉันได้สร้างภาพด้านล่างเป็นข้อมูลอ้างอิงอย่างรวดเร็วสำหรับทั้งสอง
window.onload: เหตุการณ์ JavaScript ปกติ
document.ready: เหตุการณ์ jQuery เฉพาะเมื่อโหลด HTML ทั้งหมดแล้ว
สิ่งหนึ่งที่จำ (หรือฉันควรจะพูดว่าการเรียกคืน) คือการที่คุณไม่สามารถสแต็คเหมือนที่คุณสามารถมีonload
ready
ในคำอื่น ๆ jQuery มายากลช่วยให้หลาย ๆready
บนหน้าเดียวกัน onload
แต่คุณไม่สามารถทำเช่นนั้นด้วย
สุดท้ายonload
จะลบล้างonload
s ก่อนหน้าใด ๆ
วิธีที่ดีในการจัดการกับสิ่งนั้นคือฟังก์ชั่นที่เขียนโดย Simon Willison ที่เห็นได้ชัดและอธิบายไว้ในการใช้ฟังก์ชั่นโหลด JavaScript หลายรายการ
function addLoadEvent(func) {
var oldonload = window.onload;
if (typeof window.onload != 'function') {
window.onload = func;
}
else {
window.onload = function() {
if (oldonload) {
oldonload();
}
func();
}
}
}
// Example use:
addLoadEvent(nameOfSomeFunctionToRunOnPageLoad);
addLoadEvent(function() {
/* More code to run on page load */
});
Document.ready
(เหตุการณ์ jQuery) จะเริ่มทำงานเมื่อองค์ประกอบทั้งหมดอยู่ในตำแหน่งและสามารถอ้างอิงได้ในรหัส JavaScript แต่เนื้อหาไม่จำเป็นต้องโหลด Document.ready
ดำเนินการเมื่อมีการโหลดเอกสาร HTML
$(document).ready(function() {
// Code to be executed
alert("Document is ready");
});
window.load
แต่จะรอหน้าจะโหลดได้อย่างเต็มที่ ซึ่งรวมถึงเฟรมภายในรูปภาพและอื่น ๆ
$(window).load(function() {
//Fires when the page is loaded completely
alert("window is loaded");
});
เหตุการณ์ document.ready เกิดขึ้นเมื่อมีการโหลดเอกสาร HTML และwindow.onload
เหตุการณ์จะเกิดขึ้นในภายหลังเสมอเมื่อมีการโหลดเนื้อหาทั้งหมด (รูปภาพ ฯลฯ )
คุณสามารถใช้document.ready
เหตุการณ์ได้หากคุณต้องการแทรกแซง "ก่อน" ในกระบวนการเรนเดอร์โดยไม่ต้องรอให้โหลดรูปภาพ หากคุณต้องการภาพที่ (หรืออื่น ๆ "เนื้อหา") พร้อมก่อนสคริปต์ของคุณ "ไม่อะไร" window.onload
คุณจะต้องรอจนกว่า
ตัวอย่างเช่นถ้าคุณมีการดำเนินการเป็น "สไลด์โชว์" window.onload
รูปแบบและคุณจำเป็นต้องดำเนินการคำนวณขึ้นอยู่กับขนาดของภาพที่คุณอาจต้องการที่จะรอจนกว่า มิฉะนั้นคุณอาจประสบปัญหาการสุ่มขึ้นอยู่กับความเร็วในการโหลดภาพ สคริปต์ของคุณจะทำงานพร้อมกับเธรดที่โหลดรูปภาพ หากสคริปต์ของคุณมีความยาวเพียงพอหรือเซิร์ฟเวอร์นั้นเร็วพอคุณอาจไม่สังเกตเห็นปัญหาหากภาพเกิดขึ้นในเวลาที่กำหนด แต่วิธีปฏิบัติที่ปลอดภัยที่สุดจะช่วยให้สามารถโหลดรูปภาพได้
document.ready
อาจเป็นเหตุการณ์ที่ดีสำหรับคุณที่จะแสดงเครื่องหมาย "กำลังโหลด ... " แก่ผู้ใช้และเมื่อwindow.onload
ใดก็ตามที่คุณสามารถเขียนสคริปต์ที่ต้องการทรัพยากรที่โหลดเสร็จแล้วจากนั้นจึงลบเครื่องหมาย "กำลังโหลด ... "
ตัวอย่าง :-
// document ready events
$(document).ready(function(){
alert("document is ready..");
})
// using JQuery
$(function(){
alert("document is ready..");
})
// window on load event
function myFunction(){
alert("window is loaded..");
}
window.onload = myFunction;
window.onload
เป็นฟังก์ชั่น inbuilt JavaScript window.onload
ทริกเกอร์เมื่อหน้า HTML โหลด window.onload
สามารถเขียนได้เพียงครั้งเดียว
document.ready
เป็นฟังก์ชั่นของห้องสมุด jQuery document.ready
ทริกเกอร์เมื่อ HTML และรหัส JavaScript, CSS และรูปภาพทั้งหมดที่รวมอยู่ในไฟล์ HTML ถูกโหลดอย่างสมบูรณ์
document.ready
สามารถเขียนได้หลายครั้งตามความต้องการ
เมื่อคุณพูด$(document).ready(f)
คุณบอกให้สคริปต์เอนจิ้นทำสิ่งต่อไปนี้:
$
และเลือกมันเนื่องจากมันไม่ได้อยู่ในขอบเขตมันจะต้องทำการค้นหาตารางแฮชซึ่งอาจหรือไม่อาจมีการชนready
ออบเจกต์ที่เลือกซึ่งเกี่ยวข้องกับการค้นหาตารางแฮชอีกอันในวัตถุที่เลือกเพื่อค้นหาเมธอดและเรียกใช้ในกรณีที่ดีที่สุดนี่คือการค้นหาตารางแฮช 2 อัน แต่ไม่สนใจงานหนักที่ทำโดย jQuery โดยที่$
อ่างครัวของอินพุตที่เป็นไปได้ทั้งหมดถึง jQuery ดังนั้นแผนที่อื่นน่าจะส่งแบบสอบถามเพื่อจัดการตัวแก้ไขที่ถูกต้อง
หรือคุณสามารถทำสิ่งนี้:
window.onload = function() {...}
ซึ่งจะ
onload
เป็นคุณสมบัติหรือไม่โดยทำการค้นหาตารางแฮชเพราะมันจะเรียกว่าเหมือนฟังก์ชั่นในกรณีที่ดีที่สุดจะต้องเสียค่าใช้จ่ายในการค้นหาตารางแฮชเดียวซึ่งจำเป็นเพราะonload
ต้องดึงข้อมูล
ตามหลักการแล้ว jQuery จะรวบรวมแบบสอบถามของพวกเขาไปยังสตริงที่สามารถวางเพื่อทำสิ่งที่คุณต้องการให้ jQuery ทำ แต่ไม่มีการแจกจ่าย jQuery แบบรันไทม์ วิธีนี้คุณมีตัวเลือกอย่างใดอย่างหนึ่ง
eval
โดยตรงในรหัสของคุณและข้ามค่าใช้จ่ายของwindow.onload จัดทำโดย DOM api และมีข้อความระบุว่า "เหตุการณ์โหลดเกิดขึ้นเมื่อโหลดทรัพยากรที่กำหนด"
"เหตุการณ์โหลดเกิดขึ้นเมื่อสิ้นสุดกระบวนการโหลดเอกสาร ณ จุดนี้วัตถุทั้งหมดในเอกสารอยู่ใน DOM และอิมเมจสคริปต์ลิงก์และเฟรมย่อยทั้งหมดเสร็จสิ้นการโหลดแล้ว" DOM onload
แต่ใน jQuery $ (document) .ready () จะทำงานเฉพาะเมื่อหน้า Document Object Model (DOM) พร้อมสำหรับโค้ด JavaScript เพื่อเรียกใช้งาน นี้ไม่รวมถึงภาพสคริปต์ iframes ฯลฯเหตุการณ์พร้อม jQuery
ดังนั้นเมธอดพร้อมใช้ jquery จะรันเร็วกว่าเหตุการณ์ dom onload