Чи можете ви мати кілька $ (документ) .ready (функція () {…}); розділи?


240

Якщо у мене є багато функцій при запуску, чи всі вони повинні бути одним єдиним:

$(document).ready(function() {

чи можу я мати кілька таких заяв?


1
Потрібно головним чином, коли мені потрібно завантажити кілька js-файлів, де кожен містить $ (документ) .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

25
Нерозумно покладатися на порядок виконання під час використання декількох операторів $ (document) .ready (). Кожного потрібно виконати незалежно від будь-якого іншого, який вже був виконаний чи ні.
Джеймс,

@AoP - Я не знаю, який сенс має, якщо вони не виконуються в порядку, то вони є абсолютно безглуздими в контексті програми, тому, використовуючи кілька $ (документ). Вже (блоки будуть порушені взагалі.
karim79

7
@ karim79, безумовно, це (питання ОП) найбільш застосовне при написанні складного бітового коду з декількома проблемами запуску - тобто якийсь код, який завжди виконується при завершенні завантаження, і той, який потрібен лише для деяких контентних вузлів? У такій ситуації контекст повинен бути силовим, і порядок виконання повинен бути несуттєвим - можливість призначити події "готовий до DOM" без перезапису попереднього стає корисною функцією, незалежно від поведінки замовлення.
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, все, що містить один (або кілька завантажених документів), воно все одно працюватиме так, як ніби було тільки одне. Варто зазначити, що совок кожної функції / змінної закінчується кінцевою дужкою $ (документа) .ready-function.
Мікель

2
Просто намагаюся сказати, що іноді інші люди мають написані модулі, приєднані до сторінки, з уже задекларованою функцією готовості до документа, тож у вас може не бути розкоші перемістити весь код в одну функцію (що, дано, було б ідеально ). Я б також насторожився, щоб тут було занадто багато матеріалів, оскільки ми потрапимо на Ready Bloating, який може зробити код однаково важким для обслуговування.
Джеймс Вісман

1
Ах, тепер я тебе розумію. Так, я згоден на це. Щойно наводив приклад, щоб довести, що це можливо;)
Мікель

15

Так, ви можете легко мати кілька блоків. Будьте обережні з залежностями між ними, оскільки порядок оцінювання може бути не таким, як ви очікуєте.


11

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


14
зателефонували в додане замовлення
redsquare

Дякую, це добре зробити це зрозумілим, оскільки - незважаючи на загальну розумність з цього приводу, сторінка jQuery ready () насправді не говорить про те, можна чи ні (на момент написання :)). Однак це означає, що це добре, якщо ви читаєте між рядками одного речення:Ready handlers bound this way are executed after any bound by the other three methods above.
Редагувати

5

Так, це можливо, але ви можете краще використовувати div #mydiv і використовувати обидва

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

//and

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

2
Цікава ідея, але чому це краще?
Тім

3
Використання div не підтримується. Якщо ви з якоїсь причини це робите, ви робите це на свій страх і ризик: Метод .ready () можна викликати лише на об’єкт jQuery, що відповідає поточному документу
Редагування

3

Так, це цілком нормально, але уникайте робити це без причин. Наприклад, я використовував це для оголошення глобальних правил сайту окремо, ніж індивідуальні сторінки, коли мої файли javascript створювалися динамічно, але якщо ви просто продовжуєте це робити знову і знову, це буде важко читати.

Крім того, ви не можете отримати доступ до деяких методів з іншого jQuery(function(){});дзвінка, тому це ще одна причина, що ви не хочете цього робити.

На стару, window.onloadхоча ви будете замінювати стару щоразу, коли ви вказали функцію.


2

Так, ти можеш.

Розділи, готові до декількох документів, особливо корисні, якщо у вас є інші модулі, які перебувають на тій самій сторінці, на якій використовується. За допомогою старого window.onload=funcоголошення, кожного разу, коли ви вказували функцію, яку потрібно викликати, вона замінювала стару.

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


Так, це правда, функції в черзі перебувають у черзі, ніж замінюють попередні функції $ (документа).
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, з іншою функцією, що називається поза блоком .ready. Я знайшов це питання під час дослідження, чи існував спосіб мати декілька неназваних функцій всередині блоку .ready - я не зміг отримати синтаксис правильним. Нарешті я зрозумів це і сподівався, що, опублікувавши свій тестовий код, я допоможу іншим шукати відповіді на те саме питання, що і у мене.
JEPrice

Вибачте, я мав на увазі питання. У нижній лівій частині текстового поля є кнопка редагування. Опис того, чому ваше рішення відрізняється / краще, дає набагато кращу відповідь, оскільки майбутній читач може швидше зрозуміти "Чому". Дякую.
Стівен Рауч
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.