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.


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

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.


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.


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


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!


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/

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.