jQuery - wiele $ (dokument). już…?

358

Pytanie:

Co się stanie, jeśli połączę dwa pliki JavaScript, oba z $(document).readyfunkcjami? Czy jedno zastępuje drugie? Czy oboje $(document).readyzostaną wezwani?

Na przykład,

<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!");
});


Jestem pewien, że najlepszą praktyką jest połączenie obu połączeń w jeden, $(document).readyale w mojej sytuacji nie jest to całkiem możliwe.

rlb.usa
źródło

Odpowiedzi:

349

Wszystko zostanie wykonane i na podstawie pierwszego uruchomienia pierwszego uruchomienia !!

<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>

Demo Jak widać, nie zastępują się one nawzajem

Chciałbym też wspomnieć o jednej rzeczy

zamiast tego

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

możesz użyć tego skrótu

jQuery(function(){
   //dom ready codes
});
Praveen Prasad
źródło
66
lub nawet krótszy $ (function () {// kody gotowe do domu}); api.jquery.com/ready
davehale23
217
Pamiętaj, że widziałeś $ (function () {// do stuff}); po raz pierwszy i jak trudne było wyjaśnienie Google? $ (dokument). już tak dużo komunikuje za tak niewiele ...
Matt Montag
56
Głosowanie na zwięzły, mniej czytelny kod to głos na terroryzm.
FreeAsInBeer
10
Skróty nie przynoszą żadnych korzyści, ale powodują zaciemnianie. Jeśli Twoim celem jest, aby Twój kod był „krótszy”, jeśli chodzi o czas potrzebny na przeczytanie, zrozumienie i utrzymanie, wówczas te skróty poprowadzą Cię przez długą drogę.
jononomo
3
jeśli korzystanie ze skrótów jest złe, należy użyćjQuery(document).ready(function(){ });
Memet Olsen
76

Ważne jest, aby pamiętać, że każde jQuery()połączenie musi faktycznie wrócić. Jeśli zostanie zgłoszony wyjątek w jednym, kolejne (niepowiązane) wywołania nigdy nie zostaną wykonane.

Dotyczy to niezależnie od składni. Można użyć jQuery(), jQuery(function() {}), $(document).ready(), cokolwiek chcesz, zachowanie jest takie samo. Jeśli wczesny nie powiedzie się, kolejne bloki nigdy nie zostaną uruchomione.

Był to dla mnie problem podczas korzystania z bibliotek innych firm. Jedna biblioteka zgłaszała wyjątek, a kolejne biblioteki nigdy niczego nie inicjowały.

Cjastram
źródło
2
To. Właśnie spędziłem dobrą godzinę do zawężenia problemu do tego momentu. Jedno z moich $(document).readywywołań zgłosiło błąd i dlatego $(document).readynigdy nie została wywołana inna funkcja. Doprowadzało mnie to do szału.
przewiń w górę
10
Tak już nie jest. Począwszy od jQuery 3.0, jQuery zapewnia, że ​​wyjątek występujący w jednej procedurze obsługi nie uniemożliwia późniejszego dodania procedur obsługi. api.jquery.com/ready
Ravi Teja
31

$ (dokument) .ready (); jest taki sam jak każda inna funkcja. uruchamia się, gdy dokument jest gotowy - tzn. załadowany. pytanie dotyczy tego, co się stanie, gdy wiele $ (dokument) .ready () zostanie uruchomionych, a nie gdy uruchomisz tę samą funkcję w wielu $ (dokument) .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>');

});

oba będą zachowywać się dokładnie tak samo. jedyną różnicą jest to, że chociaż te pierwsze osiągną takie same wyniki. ten ostatni będzie działał o ułamek sekundy szybciej i wymaga mniej pisania. :)

podsumowując, tam gdzie to możliwe, używaj tylko 1 $ (dokument) .ready ();

// stara odpowiedź

Obaj zostaną wezwani w kolejności. Najlepszą praktyką byłoby ich połączenie. ale nie martw się, jeśli nie jest to możliwe. strona nie wybuchnie.

Ed Fryed
źródło
^^ edytował mój, ponieważ myślałem, że ludzie mogą się pomylić między uruchomieniem tej samej funkcji wiele razy i uruchomieniem różnych funkcji w wielu $ (dokumentach) .ready. ^^ mam nadzieję, że to pomoże.
Ed Fryed
21

Wykonanie odbywa się z góry na dół. Kto pierwszy ten lepszy.

Jeśli kolejność wykonywania jest ważna, połącz je.

Diodeus - James MacFarlane
źródło
9

Oba zostaną wezwane, kto pierwszy, ten lepszy. Spójrz tutaj .

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

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

Wynik:

Wywołano dokument gotowy 2!

Scoobler
źródło
2

Aby nie nićść wątku, ale w najnowszej wersji jQuerysugerowanej składni jest:

$( handler )

Tak wyglądałoby użycie anonimowej funkcji

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

Zobacz ten link:

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

Arlo Guthrie
źródło