Можете ли вы иметь несколько $ (document) .ready (function () {…}); разделы?

240

Если у меня много функций при запуске, все ли они должны быть под одним:

$(document).ready(function() {

или я могу иметь несколько таких утверждений?

Лиора
источник
1
Требуется главным образом, когда мне нужно загрузить несколько js-файлов, каждый из которых содержит $ (document) .ready (); функция
Абдилла
@leora этот вопрос был задан в интервью: D Спасибо
eirenaios

Ответы:

288

Вы можете иметь несколько, но это не всегда самое подходящее. Старайтесь не злоупотреблять ими, так как это серьезно повлияет на читабельность. Кроме этого, это совершенно законно. Смотрите ниже:

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

Попробуйте это:

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

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

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

Вы обнаружите, что это эквивалентно этому, обратите внимание на порядок выполнения:

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

Также стоит отметить, что функцию, определенную в одном $(document).readyблоке, нельзя вызвать из другого $(document).readyблока, я только что запустил этот тест:

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

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

вывод был:

hello1
something
hello2
karim79
источник
25
Не стоит полагаться на порядок выполнения при использовании нескольких операторов $ (document) .ready (). Каждый из них должен выполняться независимо от того, был ли он уже выполнен или нет.
Джеймс
@AoP - я не знаю, какой смысл это делать, если они не выполняются по порядку, то они совершенно бессмысленны в контексте приложения, поэтому использование нескольких $ (document) .ready (блоки будут полностью разбиты.
karim79
7
@ karim79, конечно, это (вопрос ОП) наиболее применимо при написании сложного кода с множеством проблем при запуске - то есть, какой-нибудь код, который всегда запускается при завершении загрузки, а какой-то, который требуется только на некоторых узлах контента? В такой ситуации контекст должен быть изолированным, а порядок выполнения должен быть несущественным - возможность назначать событие «DOM ready» без перезаписи предыдущего становится полезной функцией независимо от порядка упорядочения.
tehwalrus
1
Что касается функции, определенной в одном готовом блоке, которая не может быть вызвана из другого готового блока - это верно в том смысле, как вы определяете функцию, но если вы вместо этого определите ее как saySomething = function () {}, то вы можете вызвать ее. Странно, правда? jsfiddle.net/f56qsogm проверить это здесь.
Ferr
2
Я думаю, что это ведет себя так, потому что это добавляет функцию к объекту окна, который доступен глобально. В противном случае это декларативная функция, локально ограниченная этой готовой функцией.
Ferr
19

Вы можете использовать несколько. Но вы также можете использовать несколько функций внутри одного документа.

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

    // Reqular JS
    function test(word) {
       alert(word);
    }
    test('hello!');
});
Микель
источник
Это нормально, если у вас есть полный контроль над кодом, прикрепленным к странице. Если кто-то уже написал это в другом файле, прикрепленном к странице, тогда вы можете объявить это следующим образом.
Джеймс Уайзман
Не уверен, что вы пытаетесь сказать. Но если вы поместите это в свою голову и включите 15 других внешних JS, все из которых содержат один (или несколько document.load), он все равно будет работать так, как если бы был только один. Стоит упомянуть, что совок каждой функции / переменной заканчивается закрывающей скобкой функции $ (document) .ready.
Миккель
2
Просто пытаюсь сказать, что иногда другие люди пишут модули, прикрепленные к странице, на которых уже объявлена ​​функция готовности документа, поэтому вы не можете позволить себе роскошь перенести весь код в одну функцию (что, конечно, было бы идеально). ). Однако я также опасался бы иметь здесь слишком много вещей, так как мы получим готовый вздутие живота, которое может сделать код столь же сложным в обслуживании.
Джеймс Уайзман
1
Ах, теперь я понимаю тебя. Да, я согласен с этим. Просто привел пример, чтобы доказать, что это возможно;)
Миккель
15

Да, вы можете легко иметь несколько блоков. Просто будьте осторожны с зависимостями между ними, поскольку порядок оценки может не соответствовать ожидаемому.

pjesi
источник
11

Да, возможно иметь несколько вызовов $ (document) .ready (). Тем не менее, я не думаю, что вы можете знать, каким образом они будут выполнены. (источник)

JW.
источник
14
звонил в добавленном порядке
redsquare
Спасибо, это хорошо прояснить, так как - несмотря на общую мудрость по этому вопросу - страница jQuery ready () на самом деле не говорит, можете ли вы или нет (на момент написания :)). Это, однако, подразумевает, что все в порядке, если вы читаете между строк одного предложения:Ready handlers bound this way are executed after any bound by the other three methods above.
Reg Edit
5

Да, это возможно, но вы можете лучше использовать div #mydiv и использовать оба

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

//and

$("#mydiv").ready(function(){});

источник
2
Интересная идея, но почему она лучше?
Тим
3
Использование div не поддерживается. Если по какой-либо причине вы делаете это, вы делаете это на свой страх и риск: метод .ready () может быть вызван только для объекта jQuery, соответствующего текущему документу
Reg Edit
3

Да, это нормально. Но избегайте этого без причины. Например, я использовал его для объявления глобальных правил сайта отдельно от отдельных страниц, когда мои файлы JavaScript создавались динамически, но если вы будете продолжать делать это снова и снова, это затруднит чтение.

Также вы не можете получить доступ к некоторым методам из другого jQuery(function(){});вызова, так что это еще одна причина, по которой вы не хотите этого делать.

window.onloadХотя со старым вы будете заменять старый каждый раз, когда указали функцию.

Нео
источник
2

Да, ты можешь.

Разделы с несколькими документами особенно полезны, если у вас есть другие модули, использующие ту же страницу, что и они. Со старым window.onload=funcобъявлением, каждый раз, когда вы указывали функцию для вызова, она заменяла старую.

Теперь все указанные функции поставлены в очередь / сложены (кто-то может подтвердить?) Независимо от того, в каком разделе готовых документов они указаны.

Джеймс Уайзман
источник
Да, это правда, функции ставятся в очередь чаще, чем заменяют предыдущие функции $ (document) .ready.
Deeksy
2

Я думаю, что лучший способ - это переключиться на именованные функции (проверьте этот переполнение для получения дополнительной информации по этому вопросу) . Таким образом, вы можете позвонить им с одного события.

Вот так:

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

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


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

Таким образом, вы можете загрузить их в одну функцию готовности.

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

});

Это выведет следующее в ваш console.log:

first
second
third

Таким образом, вы можете повторно использовать функции для других событий.

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

Проверьте эту скрипку для рабочей версии

Желе Верзейден
источник
0

Это законно, но иногда это вызывает нежелательное поведение. В качестве примера я использовал библиотеку MagicSuggest и добавил два входа MagicSuggest на страницу моего проекта и использовал отдельные функции готовности документа для каждой инициализации входных данных. Первая инициализация Входа работала, но не вторая и тоже не выдавала ошибки, Второй Вход не появлялся. Поэтому я всегда рекомендую использовать одну функцию готовности документа.

Нимантха Харшана Перера
источник
0

Вы можете даже вкладывать готовые функции документа во включенные HTML-файлы. Вот пример использования jquery:

Файл: 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>

Файл: test_embed.html

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

Консольный вывод:

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

Браузер показывает:

test_embed.html

Тим
источник
0

Вы также можете сделать это следующим образом:

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

предыдущие ответы показали использование нескольких именованных функций внутри одного блока .ready или одной безымянной функции в блоке .ready с другой именованной функцией за пределами блока .ready. Я нашел этот вопрос, исследуя, есть ли способ иметь несколько неназванных функций внутри блока .ready - я не смог получить правильный синтаксис. Я наконец понял это и надеялся, что, разместив свой тестовый код, я помогу другим в поиске ответа на тот же вопрос, что и у меня.

JEPrice
источник
Можете ли вы описать, как это отличается от других ответов?
Стивен Раух
конечно: предыдущие ответы показали использование нескольких именованных функций в одном блоке .ready или одной неназванной функции в блоке .ready с другой именованной функцией вне блока .ready. Я нашел этот вопрос, исследуя, есть ли способ иметь несколько неназванных функций внутри блока .ready - я не смог получить правильный синтаксис. Я, наконец, понял это и надеялся, что, разместив свой тестовый код, я помогу другим найти ответ на тот же вопрос, что и у меня.
JEPrice
Извините, я имел в виду вопрос. В левом нижнем углу текстового поля есть кнопка редактирования. Описание того, почему ваше решение отличается / лучше, делает его гораздо лучшим ответом, так как будущий читатель сможет быстрее понять «почему». Спасибо.
Стивен Раух