Требуется главным образом, когда мне нужно загрузить несколько js-файлов, каждый из которых содержит $ (document) .ready (); функция
Абдилла
@leora этот вопрос был задан в интервью: D Спасибо
eirenaios
Ответы:
288
Вы можете иметь несколько, но это не всегда самое подходящее. Старайтесь не злоупотреблять ими, так как это серьезно повлияет на читабельность. Кроме этого, это совершенно законно. Смотрите ниже:
Также стоит отметить, что функцию, определенную в одном $(document).readyблоке, нельзя вызвать из другого $(document).readyблока, я только что запустил этот тест:
Не стоит полагаться на порядок выполнения при использовании нескольких операторов $ (document) .ready (). Каждый из них должен выполняться независимо от того, был ли он уже выполнен или нет.
Джеймс
@AoP - я не знаю, какой смысл это делать, если они не выполняются по порядку, то они совершенно бессмысленны в контексте приложения, поэтому использование нескольких $ (document) .ready (блоки будут полностью разбиты.
karim79
7
@ karim79, конечно, это (вопрос ОП) наиболее применимо при написании сложного кода с множеством проблем при запуске - то есть, какой-нибудь код, который всегда запускается при завершении загрузки, а какой-то, который требуется только на некоторых узлах контента? В такой ситуации контекст должен быть изолированным, а порядок выполнения должен быть несущественным - возможность назначать событие «DOM ready» без перезаписи предыдущего становится полезной функцией независимо от порядка упорядочения.
tehwalrus
1
Что касается функции, определенной в одном готовом блоке, которая не может быть вызвана из другого готового блока - это верно в том смысле, как вы определяете функцию, но если вы вместо этого определите ее как saySomething = function () {}, то вы можете вызвать ее. Странно, правда? jsfiddle.net/f56qsogm проверить это здесь.
Ferr
2
Я думаю, что это ведет себя так, потому что это добавляет функцию к объекту окна, который доступен глобально. В противном случае это декларативная функция, локально ограниченная этой готовой функцией.
Ferr
19
Вы можете использовать несколько. Но вы также можете использовать несколько функций внутри одного документа.
Это нормально, если у вас есть полный контроль над кодом, прикрепленным к странице. Если кто-то уже написал это в другом файле, прикрепленном к странице, тогда вы можете объявить это следующим образом.
Джеймс Уайзман
Не уверен, что вы пытаетесь сказать. Но если вы поместите это в свою голову и включите 15 других внешних JS, все из которых содержат один (или несколько document.load), он все равно будет работать так, как если бы был только один. Стоит упомянуть, что совок каждой функции / переменной заканчивается закрывающей скобкой функции $ (document) .ready.
Миккель
2
Просто пытаюсь сказать, что иногда другие люди пишут модули, прикрепленные к странице, на которых уже объявлена функция готовности документа, поэтому вы не можете позволить себе роскошь перенести весь код в одну функцию (что, конечно, было бы идеально). ). Однако я также опасался бы иметь здесь слишком много вещей, так как мы получим готовый вздутие живота, которое может сделать код столь же сложным в обслуживании.
Джеймс Уайзман
1
Ах, теперь я понимаю тебя. Да, я согласен с этим. Просто привел пример, чтобы доказать, что это возможно;)
Миккель
15
Да, вы можете легко иметь несколько блоков. Просто будьте осторожны с зависимостями между ними, поскольку порядок оценки может не соответствовать ожидаемому.
Да, возможно иметь несколько вызовов $ (document) .ready (). Тем не менее, я не думаю, что вы можете знать, каким образом они будут выполнены. (источник)
Спасибо, это хорошо прояснить, так как - несмотря на общую мудрость по этому вопросу - страница jQuery ready () на самом деле не говорит, можете ли вы или нет (на момент написания :)). Это, однако, подразумевает, что все в порядке, если вы читаете между строк одного предложения:Ready handlers bound this way are executed after any bound by the other three methods above.
Reg Edit
5
Да, это возможно, но вы можете лучше использовать div #mydiv и использовать оба
Да, это нормально. Но избегайте этого без причины. Например, я использовал его для объявления глобальных правил сайта отдельно от отдельных страниц, когда мои файлы JavaScript создавались динамически, но если вы будете продолжать делать это снова и снова, это затруднит чтение.
Также вы не можете получить доступ к некоторым методам из другого
jQuery(function(){});вызова, так что это еще одна причина, по которой вы не хотите этого делать.
window.onloadХотя со старым вы будете заменять старый каждый раз, когда указали функцию.
Разделы с несколькими документами особенно полезны, если у вас есть другие модули, использующие ту же страницу, что и они. Со старым window.onload=funcобъявлением, каждый раз, когда вы указывали функцию для вызова, она заменяла старую.
Теперь все указанные функции поставлены в очередь / сложены (кто-то может подтвердить?) Независимо от того, в каком разделе готовых документов они указаны.
Это законно, но иногда это вызывает нежелательное поведение. В качестве примера я использовал библиотеку MagicSuggest и добавил два входа MagicSuggest на страницу моего проекта и использовал отдельные функции готовности документа для каждой инициализации входных данных. Первая инициализация Входа работала, но не вторая и тоже не выдавала ошибки, Второй Вход не появлялся. Поэтому я всегда рекомендую использовать одну функцию готовности документа.
<html><head><scriptsrc="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><pid="test">This is a hidden paragraph.</p><buttonid="hide">Click me to hide</button><buttonid="show">Click me to show</button></body>
предыдущие ответы показали использование нескольких именованных функций внутри одного блока .ready или одной безымянной функции в блоке .ready с другой именованной функцией за пределами блока .ready. Я нашел этот вопрос, исследуя, есть ли способ иметь несколько неназванных функций внутри блока .ready - я не смог получить правильный синтаксис. Я наконец понял это и надеялся, что, разместив свой тестовый код, я помогу другим в поиске ответа на тот же вопрос, что и у меня.
Можете ли вы описать, как это отличается от других ответов?
Стивен Раух
конечно: предыдущие ответы показали использование нескольких именованных функций в одном блоке .ready или одной неназванной функции в блоке .ready с другой именованной функцией вне блока .ready. Я нашел этот вопрос, исследуя, есть ли способ иметь несколько неназванных функций внутри блока .ready - я не смог получить правильный синтаксис. Я, наконец, понял это и надеялся, что, разместив свой тестовый код, я помогу другим найти ответ на тот же вопрос, что и у меня.
JEPrice
Извините, я имел в виду вопрос. В левом нижнем углу текстового поля есть кнопка редактирования. Описание того, почему ваше решение отличается / лучше, делает его гораздо лучшим ответом, так как будущий читатель сможет быстрее понять «почему». Спасибо.
Ответы:
Вы можете иметь несколько, но это не всегда самое подходящее. Старайтесь не злоупотреблять ими, так как это серьезно повлияет на читабельность. Кроме этого, это совершенно законно. Смотрите ниже:
http://www.learningjquery.com/2006/09/multiple-document-ready
Попробуйте это:
Вы обнаружите, что это эквивалентно этому, обратите внимание на порядок выполнения:
Также стоит отметить, что функцию, определенную в одном
$(document).ready
блоке, нельзя вызвать из другого$(document).ready
блока, я только что запустил этот тест:вывод был:
источник
Вы можете использовать несколько. Но вы также можете использовать несколько функций внутри одного документа.
источник
Да, вы можете легко иметь несколько блоков. Просто будьте осторожны с зависимостями между ними, поскольку порядок оценки может не соответствовать ожидаемому.
источник
Да, возможно иметь несколько вызовов $ (document) .ready (). Тем не менее, я не думаю, что вы можете знать, каким образом они будут выполнены. (источник)
источник
Ready handlers bound this way are executed after any bound by the other three methods above.
Да, это возможно, но вы можете лучше использовать div #mydiv и использовать оба
источник
Да, это нормально. Но избегайте этого без причины. Например, я использовал его для объявления глобальных правил сайта отдельно от отдельных страниц, когда мои файлы JavaScript создавались динамически, но если вы будете продолжать делать это снова и снова, это затруднит чтение.
Также вы не можете получить доступ к некоторым методам из другого
jQuery(function(){});
вызова, так что это еще одна причина, по которой вы не хотите этого делать.window.onload
Хотя со старым вы будете заменять старый каждый раз, когда указали функцию.источник
Да, ты можешь.
Разделы с несколькими документами особенно полезны, если у вас есть другие модули, использующие ту же страницу, что и они. Со старым
window.onload=func
объявлением, каждый раз, когда вы указывали функцию для вызова, она заменяла старую.Теперь все указанные функции поставлены в очередь / сложены (кто-то может подтвердить?) Независимо от того, в каком разделе готовых документов они указаны.
источник
Я думаю, что лучший способ - это переключиться на именованные функции (проверьте этот переполнение для получения дополнительной информации по этому вопросу) . Таким образом, вы можете позвонить им с одного события.
Вот так:
Таким образом, вы можете загрузить их в одну функцию готовности.
});
Это выведет следующее в ваш console.log:
Таким образом, вы можете повторно использовать функции для других событий.
источник
Это законно, но иногда это вызывает нежелательное поведение. В качестве примера я использовал библиотеку MagicSuggest и добавил два входа MagicSuggest на страницу моего проекта и использовал отдельные функции готовности документа для каждой инициализации входных данных. Первая инициализация Входа работала, но не вторая и тоже не выдавала ошибки, Второй Вход не появлялся. Поэтому я всегда рекомендую использовать одну функцию готовности документа.
источник
Вы можете даже вкладывать готовые функции документа во включенные HTML-файлы. Вот пример использования jquery:
Файл: test_main.html
Файл: test_embed.html
Консольный вывод:
Браузер показывает:
test_embed.html
источник
Вы также можете сделать это следующим образом:
предыдущие ответы показали использование нескольких именованных функций внутри одного блока .ready или одной безымянной функции в блоке .ready с другой именованной функцией за пределами блока .ready. Я нашел этот вопрос, исследуя, есть ли способ иметь несколько неназванных функций внутри блока .ready - я не смог получить правильный синтаксис. Я наконец понял это и надеялся, что, разместив свой тестовый код, я помогу другим в поиске ответа на тот же вопрос, что и у меня.
источник