Können Sie mehrere $ (document) .ready (function () {…}) haben? Abschnitte?


240

Wenn ich beim Start viele Funktionen habe, müssen sie alle unter einer einzigen liegen:

$(document).ready(function() {

oder kann ich mehrere solcher Aussagen haben?


1
Wird hauptsächlich benötigt, wenn ich mehrere js-Dateien laden muss, von denen jede $ (document) .ready () enthält. Funktion
Abdillah

@leora diese Frage wurde in einem Interview gestellt: D Danke
eirenaios

Antworten:


288

Sie können mehrere haben, aber es ist nicht immer das Schönste. Versuchen Sie, sie nicht zu stark zu verwenden, da dies die Lesbarkeit ernsthaft beeinträchtigt. Davon abgesehen ist es vollkommen legal. Siehe unten:

http://www.learningjquery.com/2006/09/multiple-document-ready

Probieren Sie es aus:

$(document).ready(function() {
    alert('Hello Tom!');
});

$(document).ready(function() {
    alert('Hello Jeff!');
});

$(document).ready(function() {
    alert('Hello Dexter!');
});

Sie werden feststellen, dass es dem entspricht. Beachten Sie die Reihenfolge der Ausführung:

$(document).ready(function() {
    alert('Hello Tom!');
    alert('Hello Jeff!');
    alert('Hello Dexter!');
});

Es ist auch erwähnenswert, dass eine in einem $(document).readyBlock definierte Funktion nicht von einem anderen $(document).readyBlock aus aufgerufen werden kann. Ich habe gerade diesen Test ausgeführt:

$(document).ready(function() {
    alert('hello1');
    function saySomething() {
        alert('something');
    }
    saySomething();

});
$(document).ready(function() {
    alert('hello2');
    saySomething();
}); 

Ausgabe war:

hello1
something
hello2

25
Es ist nicht ratsam, sich auf die Ausführungsreihenfolge zu verlassen, wenn Sie mehrere $ (document) .ready () -Anweisungen verwenden. Jeder muss unabhängig von einem anderen ausgeführt werden, der bereits ausgeführt wurde oder nicht.
James

@AoP - Ich weiß nicht, wie viel Sinn das macht, wenn sie nicht in der richtigen Reihenfolge ausgeführt werden, dann sind sie im Kontext der Anwendung völlig bedeutungslos. Verwenden Sie also mehrere $ (document) .ready (Blöcke würden insgesamt gebrochen.
Karim79

7
@ karim79 Sicherlich ist dies (die Frage des OP) am besten anwendbar, wenn ein kompliziertes Stück Code mit mehreren Startproblemen geschrieben wird - dh ein Code, der immer ausgeführt wird, wenn das Laden abgeschlossen ist, und ein Code, der nur auf einigen Inhaltsknoten erforderlich ist? In einer solchen Situation sollte der Kontext siliert sein und die Reihenfolge der Ausführung sollte unerheblich sein. Die Zuordnung zum Ereignis "DOM bereit", ohne das vorherige zu überschreiben, wird unabhängig vom Bestellverhalten zu einer nützlichen Funktion.
Tehwalrus

1
Wenn eine in einem Bereitschaftsblock definierte Funktion nicht von einem anderen Bereitschaftsblock aus aufgerufen werden kann, ist dies die Art und Weise, wie Sie die Funktion definieren. Wenn Sie sie jedoch stattdessen als saySomething = function () {} definieren, können Sie sie aufrufen. Verrückt oder? jsfiddle.net/f56qsogm teste es hier.
Ferr

2
Ich denke, es verhält sich so, weil es die Funktion zu dem Fensterobjekt hinzufügt, auf das global zugegriffen werden kann. Andernfalls handelt es sich um eine deklarative Funktion, die lokal für diese Bereitschaftsfunktion bestimmt ist.
Ferr

19

Sie können mehrere verwenden. Sie können aber auch mehrere Funktionen in einem Dokument verwenden.

$(document).ready(function() {
    // Jquery
    $('.hide').hide();
    $('.test').each(function() {
       $(this).fadeIn();
    });

    // Reqular JS
    function test(word) {
       alert(word);
    }
    test('hello!');
});

Dies ist in Ordnung, wenn Sie die volle Kontrolle über den an die Seite angehängten Code haben. Wenn jemand dies bereits in eine andere an die Seite angehängte Datei geschrieben hat, können Sie es so deklarieren.
James Wiseman

Ich bin mir nicht sicher, was du sagen willst. Aber wenn Sie dies in Ihren Kopf stecken und 15 andere externe JS einschließen, die alle eine (oder mehrere document.load) enthalten, funktioniert es immer noch so, als ob es nur eine gäbe. Erwähnenswert ist, dass die Schaufel jeder Funktion / Variablen mit der schließenden Klammer der Funktion $ (document) .ready endet.
Mickel

2
Ich versuche nur zu sagen, dass manchmal andere Leute Module an die Seite angehängt haben, für die bereits eine Dokumentbereitschaftsfunktion deklariert ist, sodass Sie möglicherweise nicht den Luxus haben, Ihren gesamten Code in eine Funktion zu verschieben (was natürlich ideal wäre ). Ich wäre jedoch auch vorsichtig, wenn ich hier zu viel Zeug hätte, da wir On Ready Bloating bekommen, was die Wartung des Codes ebenso schwierig machen kann.
James Wiseman

1
Ah, jetzt verstehe ich dich. Ja, da stimme ich zu. Ich habe gerade ein Beispiel angegeben, um zu beweisen, dass es möglich ist;)
Mickel

15

Ja, Sie können leicht mehrere Blöcke haben. Seien Sie nur vorsichtig mit Abhängigkeiten zwischen ihnen, da die Bewertungsreihenfolge möglicherweise nicht Ihren Erwartungen entspricht.


11

Ja, es ist möglich, mehrere Aufrufe von $ (document) .ready () durchzuführen. Ich glaube jedoch nicht, dass Sie wissen können, auf welche Weise sie ausgeführt werden. (Quelle)


14
in der Reihenfolge hinzugefügt hinzugefügt
redsquare

Vielen Dank, es ist gut, dies klar zu machen, da - trotz der allgemeinen Weisheit zu diesem Thema - auf der jQuery ready () -Seite nicht wirklich angegeben ist, ob Sie dies können oder nicht (zum Zeitpunkt des Schreibens :)). Es bedeutet jedoch, dass es in Ordnung ist, wenn Sie zwischen den Zeilen eines Satzes lesen:Ready handlers bound this way are executed after any bound by the other three methods above.
Reg Edit


3

Ja, es ist vollkommen in Ordnung. Aber vermeiden Sie es, es ohne Grund zu tun. Zum Beispiel habe ich es verwendet, um globale Site-Regeln getrennt von einzelnen Seiten zu deklarieren, als meine Javascript-Dateien dynamisch generiert wurden. Wenn Sie es jedoch immer wieder tun, wird es schwer lesbar.

Außerdem können Sie von einem anderen jQuery(function(){});Aufruf aus nicht auf einige Methoden zugreifen. Dies ist ein weiterer Grund, warum Sie dies nicht tun möchten .

Mit dem alten window.onloadersetzen Sie das alte jedoch jedes Mal, wenn Sie eine Funktion angegeben haben.


2

Ja, du kannst.

Mehrere dokumentenbereite Abschnitte sind besonders nützlich, wenn andere Module auf derselben Seite arbeiten, auf der sie verwendet werden. Mit der alten window.onload=funcDeklaration wurde jedes Mal, wenn Sie eine aufzurufende Funktion angegeben haben, die alte ersetzt.

Jetzt werden alle angegebenen Funktionen in die Warteschlange gestellt (kann jemand bestätigen?), Unabhängig davon, in welchem ​​dokumentenbereiten Abschnitt sie angegeben sind.


Ja, es ist wahr, die Funktionen stehen in der Warteschlange, anstatt frühere $ (document) .ready-Funktionen zu ersetzen.
Deeksy

2

Ich denke, der bessere Weg ist, auf benannte Funktionen umzuschalten (Weitere Informationen zu diesem Thema finden Sie in diesem Überlauf) . Auf diese Weise können Sie sie von einem einzelnen Ereignis aus aufrufen.

Wie so:

function firstFunction() {
    console.log("first");
}

function secondFunction() {
    console.log("second");
}


function thirdFunction() {
    console.log("third");
}

Auf diese Weise können Sie sie in einer einzigen Bereitschaftsfunktion laden.

jQuery(document).on('ready', function(){
   firstFunction();
   secondFunction();
   thirdFunction();

});

Dadurch wird Folgendes in Ihr console.log ausgegeben:

first
second
third

Auf diese Weise können Sie die Funktionen für andere Ereignisse wiederverwenden.

jQuery(window).on('resize',function(){
    secondFunction();
});

Überprüfen Sie diese Geige für die Arbeitsversion


0

Es ist legal, aber manchmal verursacht es unerwünschtes Verhalten. Als Beispiel habe ich die MagicSuggest-Bibliothek verwendet und zwei MagicSuggest-Eingaben auf einer Seite meines Projekts hinzugefügt und für jede Initialisierung von Eingaben separate dokumentenbereite Funktionen verwendet. Die allererste Eingangsinitialisierung hat funktioniert, aber nicht die zweite und auch ohne Fehler. Die zweite Eingabe wurde nicht angezeigt. Daher empfehle ich immer, eine Dokumentbereitschaftsfunktion zu verwenden.


0

Sie können sogar dokumentenfertige Funktionen in enthaltenen HTML-Dateien verschachteln. Hier ist ein Beispiel mit jquery:

Datei: test_main.html

<!DOCTYPE html>
<html lang="en">
<head>
    <script src="jquery-1.10.2.min.js"></script>
</head>

<body>
    <div id="main-container">
        <h1>test_main.html</h1>
    </div>

<script>
    $(document).ready( function()
    {
        console.log( 'test_main.html READY' );
        $("#main-container").load("test_embed.html");
    } );
</script>

</body>
</html>

Datei: test_embed.html

<h1>test_embed.html</h1>
<script>
    $(document).ready( function()
    {
        console.log( 'test_embed.html READY' );
    } );
</script>

Konsolenausgabe:

test_main.html READY                       test_main.html:15
test_embed.html READY                      (program):4

Browser zeigt:

test_embed.html


0

Sie können dies auch folgendermaßen tun:

<html>
<head>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<script>
 $(document).ready(function(){
     $("#hide").click(function(){
     $("#test").hide();
     });
     $("#show").click(function(){
     $("#test").show();
     });
 });
</script>
</head>

<body>
<h2>This is a test of jQuery!</h2>
<p id="test">This is a hidden paragraph.</p>
<button id="hide">Click me to hide</button>
<button id="show">Click me to show</button>
</body>

Die vorherigen Antworten zeigten, dass mehrere benannte Funktionen innerhalb eines einzelnen .ready-Blocks oder eine einzelne unbenannte Funktion im .ready-Block mit einer anderen benannten Funktion außerhalb des .ready-Blocks verwendet wurden. Ich habe diese Frage gefunden, als ich nachgeforscht habe, ob es eine Möglichkeit gibt, mehrere unbenannte Funktionen im .ready-Block zu haben - ich konnte die Syntax nicht richtig einstellen. Ich fand es endlich heraus und hoffte, dass ich durch das Posten meines Testcodes anderen helfen würde, nach der Antwort auf dieselbe Frage zu suchen, die ich hatte


Können Sie beschreiben, wie sich dies von den anderen Antworten unterscheidet?
Stephen Rauch

sicher: Die vorherigen Antworten zeigten, dass mehrere benannte Funktionen in einem einzelnen .ready-Block oder eine einzelne unbenannte Funktion im .ready-Block mit einer anderen benannten Funktion außerhalb des .ready-Blocks verwendet wurden. Ich habe diese Frage gefunden, als ich nachgeforscht habe, ob es eine Möglichkeit gibt, mehrere unbenannte Funktionen im .ready-Block zu haben - ich konnte die Syntax nicht richtig einstellen. Ich fand es endlich heraus und hoffte, dass ich durch das Posten meines Testcodes anderen helfen würde, nach der Antwort auf dieselbe Frage zu suchen, die ich hatte.
JEPrice

Entschuldigung, ich meinte in der Frage. Unten links im Textfeld befindet sich eine Schaltfläche zum Bearbeiten. Wenn Sie beschreiben, warum Ihre Lösung anders / besser ist, ist dies eine viel bessere Antwort, da zukünftige Leser das "Warum" schneller verstehen können. Vielen Dank.
Stephen Rauch
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.