jQuery - หลาย $ (เอกสาร). Ready …?


359

คำถาม:

หากฉันลิงก์ในไฟล์ JavaScript สองไฟล์ทั้งที่มี$(document).readyฟังก์ชั่นจะเกิดอะไรขึ้น หนึ่งเขียนทับอีกหรือไม่ หรือทั้งสอง$(document).readyได้รับการเรียก?

ตัวอย่างเช่น,

<script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.4.1/jquery.min.js"></script>

<script type="text/javascript" src="http://.../jquery1.js"></script>

<script type="text/javascript" src="http://.../jquery2.js"></script>

jquery1.js:

$(document).ready(function(){
    $("#page-title").html("Document-ready was called!");
});

jquery2.js:

$(document).ready(function(){
    $("#page-subtitle").html("Document-ready was called!");
});


ฉันแน่ใจว่าเป็นวิธีปฏิบัติที่ดีที่สุดในการรวมการโทรทั้งสองเข้าไว้ด้วยกัน$(document).readyในสถานการณ์ของฉัน


คำตอบ:


351

ทั้งหมดจะได้รับการดำเนินการและในวันแรกที่เรียกว่าพื้นฐานการทำงานครั้งแรก !!

<div id="target"></div>

<script>
  $(document).ready(function(){
    jQuery('#target').append('target edit 1<br>');
  });
  $(document).ready(function(){
    jQuery('#target').append('target edit 2<br>');
  });
  $(document).ready(function(){
    jQuery('#target').append('target edit 3<br>');
  });
</script>

การสาธิตอย่างที่คุณเห็นพวกเขาไม่ได้แทนที่กัน

อีกสิ่งหนึ่งที่ฉันอยากจะพูดถึง

ในสถานที่นี้

$(document).ready(function(){});

คุณสามารถใช้ทางลัดนี้

jQuery(function(){
   //dom ready codes
});

66
หรือแม้แต่สั้นกว่า $ (ฟังก์ชั่น () {// dom ready codes}); api.jquery.com/ready
davehale23

217
จำการเห็น $ (function () {// do stuff}); เป็นครั้งแรกและคำอธิบายนั้นยากเพียงใดสำหรับ Google $ (เอกสาร). ติดต่อสื่อสารกันมากขึ้นเพื่อน้อย ...
Matt Montag

56
การลงคะแนนสำหรับรหัสสั้น ๆ ที่อ่านง่ายน้อยนั้นเป็นการลงคะแนนสำหรับการก่อการร้าย
FreeAsInBeer

10
ทางลัดไม่ให้ประโยชน์ใด ๆ แต่ก่อให้เกิดความสับสน หากเป้าหมายของคุณคือทำให้โค้ดของคุณ "สั้นลง" ในแง่ของระยะเวลาที่ใช้ในการอ่านทำความเข้าใจและดูแลรักษาทางลัดเหล่านี้จะนำคุณไปสู่ทางที่ไกล
jononomo

3
หากใช้ทางลัดเป็นสิ่งที่ชั่วร้ายเราควรใช้jQuery(document).ready(function(){ });
Memet Olsen

76

โปรดทราบว่าการjQuery()โทรแต่ละครั้งจะต้องส่งคืนจริง หากมีข้อผิดพลาดเกิดขึ้นในการเรียกครั้งหนึ่งการโทร (ไม่เกี่ยวข้อง) ที่ตามมาจะไม่ถูกดำเนินการ

สิ่งนี้ใช้โดยไม่คำนึงถึงไวยากรณ์ คุณสามารถใช้jQuery(), jQuery(function() {}), $(document).ready()สิ่งที่คุณชอบพฤติกรรมเหมือนกัน หากบล็อกแรกล้มเหลวบล็อกที่ตามมาจะไม่ถูกเรียกใช้

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


2
นี้. ฉันเพิ่งใช้เวลาหนึ่งชั่วโมงเพื่อ จำกัด ปัญหาจนถึงจุดนี้ หนึ่งใน$(document).readyสายของฉันโยนข้อผิดพลาดและดังนั้นจึง$(document).readyไม่เคยเรียกใช้ฟังก์ชันที่แตกต่างกัน มันทำให้ฉันบ้า
scrollup

10
นี่ไม่ใช่กรณีอีกต่อไป ในฐานะของ jQuery 3.0, jQuery ทำให้แน่ใจว่ามีข้อยกเว้นที่เกิดขึ้นในตัวจัดการหนึ่งไม่ได้ป้องกันตัวจัดการที่เพิ่มเข้ามาในภายหลังจากการดำเนินการ api.jquery.com/ready
Ravi Teja

32

$ (เอกสาร) .ready (); เหมือนกับฟังก์ชั่นอื่น ๆ มันจะยิงเมื่อเอกสารพร้อม - โหลดเช่น คำถามคือเกี่ยวกับสิ่งที่เกิดขึ้นเมื่อ $ (เอกสาร) .ready () หลายรายการถูกไล่ออกไม่ใช่เมื่อคุณใช้งานฟังก์ชั่นเดียวกันภายในหลาย ๆ $ (เอกสาร). Ready ()

//this
<div id="target"></div>

$(document).ready(function(){
   jQuery('#target').append('target edit 1<br>');
});
$(document).ready(function(){
   jQuery('#target').append('target edit 2<br>');
});
$(document).ready(function(){
   jQuery('#target').append('target edit 3<br>');
});

//is the same as
<div id="target"></div>

$(document).ready(function(){

    jQuery('#target').append('target edit 1<br>');

    jQuery('#target').append('target edit 2<br>');

    jQuery('#target').append('target edit 3<br>');

});

ทั้งสองจะทำงานเหมือนกันทุกประการ ข้อแตกต่างคือแม้ว่าอดีตจะบรรลุผลลัพธ์เดียวกัน ส่วนหลังจะทำงานในเสี้ยววินาทีได้เร็วขึ้นและต้องการการพิมพ์น้อยลง :)

โดยสรุปหากเป็นไปได้ให้ใช้เพียง $ 1 (เอกสาร) .ready ();

// คำตอบเก่า

พวกเขาทั้งสองจะถูกเรียกตามลำดับ วิธีปฏิบัติที่ดีที่สุดคือการรวมเข้าด้วยกัน แต่ไม่ต้องกังวลหากเป็นไปไม่ได้ หน้าจะไม่ระเบิด


^^ แก้ไขของฉันเพราะฉันคิดว่าผู้คนอาจสับสนระหว่างการใช้งานฟังก์ชั่นเดียวกันหลายครั้งและใช้งานฟังก์ชั่นที่แตกต่างกันในหลาย ๆ $ (เอกสาร). Ready's แล้ว ^^ หวังว่ามันจะช่วยได้
Ed Fryed

21

การดำเนินการคือจากบนลงล่าง มาก่อนเสริฟก่อน.

หากลำดับการดำเนินการมีความสำคัญให้รวมเข้าด้วยกัน


9

ทั้งสองจะได้รับเรียกมาเสิร์ฟก่อนได้ก่อน ลองดูที่นี่

$(document).ready(function(){
    $("#page-title").html("Document-ready was called!");
  });

$(document).ready(function(){
    $("#page-title").html("Document-ready 2 was called!");
  });

เอาท์พุท:

เอกสารพร้อม 2 ถูกเรียก!


2

ไม่ต้องตัดเธรด แต่ภายใต้jQueryไวยากรณ์ที่แนะนำล่าสุดคือ:

$( handler )

การใช้ฟังก์ชั่นนิรนามจะเป็นเช่นนี้

$(function() { ... insert code here ... });

ดูลิงค์นี้:

https://api.jquery.com/ready/

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