javascript — Почему $(window).load выполняется раньше, чем $(document).ready?
$(window).load
Событие load происходит, когда сам элемент и все его дочерние элементы полностью загружены. Это событие может происходить на элементах, которые обладают полями URL (объект window, картинки, скрипты, фреймы).
Замечание 1: в некоторых случаях, если картинка содержится в кеше браузера, событие load может не произойти. Для такого случая можно воспользоваться специальным событием
event.special.load
, которое определено в небольшом плагине.Замечание 2: если вам не требуется готовность мультимедийных файлов, лучше воспользоваться методом
.ready()
, который устанавливает обработчик готовности структуры документа, что происходит раньше начала загрузки файлов мультимедиа.
Тут все предельно ясно, если пишем $(window).load
то код, написанный внутри этой конструкции, начнёт работу когда будет готов весь DOM включая изображения
$(document).ready
$(document).ready
код внутри блока начнёт выполняться сразу после того, когда будет готов DOM, за исключением картинок. Указанный код будет выполняться непосредственно после готовности DOM, не дожидаясь полной загрузки изображений. Вызов $(document).ready
несколько раз приведет к последовательному исполнению вызовов друг за другом, в последовательности сверху вниз.
$(window).load
или $(document).ready
?Хотя, для воспроизведения такой ситуации потребуется немало усилий, все равно остаются нюансы. Иногда, такое возникает, когда внутри события ready
срабатывает подписка на load
к примеру, или наоборот, что приводит к странному поведению.
Если опираться на некоторые другие ответы, такие как:
- After all $(document). ready() have run, is there an event for that?
- window.onload vs $(document).ready()
- multiple $(document).ready and $(window).load in $(document).ready
то приходишь к выводу, что событие $(window).load
всегда должно произойти после $(document).ready
. Но, факт присутствия такого поведения имеется.
Теперь подумаем про кеширование страницы. Да, действительно, после того, как изображения будут закэшированы весь написанный вами код, скорее всего, начнет выполняться последовательно, сверху вниз. Таким образом получатся ситуации, когда $(window).load
и $(document).ready
оба этих блока будут ждать только загрузку DOM
, а если еще и подписка на событие внутри события будет, то получится коллизия, и стоящий $(window).load
перед $(document).ready
выполнится раньше. В любом случае, коллизия происходит не просто так и нужно заняться исправлением кода и его рефакторингом.
Полезные ссылки для ознакомления:
$(document). ready
vs$(window).load
vswindow.onload
- Обработчик события load
.load()
- Обработчик готовности дерева DOM
.ready()
.ready()
.load()
- Справочник jQuery Загрузка документа
JavaScript · Bootstrap v5.0
Индивидуальные или скомпилированные
Плагины могут быть включены по отдельности (используя отдельный Bootstrap js/dist/*.js
) или все сразу, используя bootstrap.js
или уменьшенный bootstrap. min.js
(не включайте оба).
Если вы используете сборщик (Webpack, Rollup…), вы можете использовать файлы /js/dist/*.js
, которые готовы к UMD.
Использование Bootstrap в качестве модуля
Мы предоставляем версию Bootstrap, построенную как ESM
( bootstrap.esm.js
и bootstrap.esm.min.js
), который позволяет вам использовать Bootstrap в качестве модуля в вашем браузере, если ваши целевые браузеры его поддерживают.
<тип сценария = "модуль"> импортировать {Toast} из 'bootstrap.esm.min.js' Array.from(document.querySelectorAll('.toast')) .forEach(toastNode => новый Toast(toastNode)) скрипт>
Несовместимые плагины
Из-за ограничений браузера некоторые из наших плагинов, а именно плагины Dropdown, Tooltip и Popover, нельзя использовать в Некоторые плагины и компоненты CSS зависят от других плагинов. Если вы включаете плагины по отдельности, обязательно проверьте наличие этих зависимостей в документации. Наши раскрывающиеся списки, всплывающие окна и всплывающие подсказки также зависят от Popper. Bootstrap 5 предназначен для использования без jQuery, но все же можно использовать наши компоненты с jQuery. Если Bootstrap обнаружит Почти все подключаемые модули Bootstrap можно включить и настроить только через HTML с атрибутами данных (наш предпочтительный способ использования функций JavaScript). Обязательно использовать только один набор атрибутов данных для одного элемента (например, вы не можете вызвать всплывающую подсказку и модальное окно с помощью одной и той же кнопки.) В настоящее время для запроса элементов DOM мы используем собственные методы
по соображениям производительности, поэтому вы должны использовать допустимые селекторы.
Если вы используете специальные селекторы, например: Зависимости
Все еще хотите использовать jQuery? Это возможно!
jQuery
в окне
объект , он добавит все наши компоненты в систему плагинов jQuery; это означает, что вы сможете сделать $('[data-bs-toggle="tooltip"]').tooltip()
, чтобы включить всплывающие подсказки. То же самое касается и других наших компонентов. Атрибуты данных
Селекторы
roll:Example
, обязательно избегайте их.
События
Bootstrap предоставляет настраиваемые события для уникальных действий большинства плагинов. Как правило, они бывают в форме инфинитива и причастия прошедшего времени, где инфинитив (например, показать
) запускается в начале события, а его форма причастия прошедшего времени (например, показано
) запускается при завершении действия.
Все инфинитивные события обеспечивают функциональность
. Это дает возможность остановить выполнение действия до его начала. Возврат false из обработчика событий также автоматически вызовет preventDefault()
.
переменная myModal = document.getElementById('myModal') myModal.addEventListener('show.bs.modal', функция (событие) { если (!данные) { return event.preventDefault() // останавливает показ модального окна } })
События jQuery
Bootstrap обнаружит jQuery, если jQuery
присутствует в объекте window
и нет атрибута data-bs-no-jquery
, установленного для
. Если jQuery найден, Bootstrap будет генерировать события благодаря системе событий jQuery. Поэтому, если вы хотите прослушивать события Bootstrap, вам придется использовать методы jQuery ( .on
, .one
) вместо addEventListener
$('#myTab a').on('show.bs.tab', функция () { // сделай что-нибудь... })
Programmatic API
Все конструкторы принимают необязательный объект опций или ничего (что запускает подключаемый модуль с его поведением по умолчанию):
var myModalEl = document.getElementById('myModal') var modal = new bootstrap.Modal(myModalEl) // инициализируется значениями по умолчанию var modal = new bootstrap.Modal(myModalEl, {клавиатура: false}) // инициализируется без клавиатуры
Если вы хотите получить конкретный экземпляр плагина, каждый плагин предоставляет метод getInstance
. Чтобы получить его непосредственно из элемента, сделайте следующее: bootstrap. Popover.getInstance(myPopoverEl)
.
Селекторы CSS в конструкторах
Вы также можете использовать селектор CSS в качестве первого аргумента вместо элемента DOM для инициализации подключаемого модуля. В настоящее время элемент для плагина находится методом
, так как наши плагины поддерживают только один элемент.
var modal = новый bootstrap.Modal('#myModal') var dropdown = новый bootstrap.Dropdown('[data-bs-toggle="dropdown"]')
Асинхронные функции и переходы
Все программные методы API являются асинхронными и возвращаются вызывающей стороне после начала перехода, но до его завершения .
Чтобы выполнить действие после завершения перехода, вы можете прослушать соответствующее событие.
переменная myCollapseEl = document.getElementById('myCollapse') myCollapseEl.addEventListener('show.bs.collapse', функция (событие) { // Действие, выполняемое после расширения сворачиваемой области })
Кроме того, вызов метода на компонент перехода будет проигнорирован
.переменная myCarouselEl = document.getElementById('myCarousel') var carousel = bootstrap.Carousel.getInstance(myCarouselEl) // Получить экземпляр карусели myCarouselEl.addEventListener('slid.bs.carousel', функция (событие) { carousel.to('2') // Перейдет к слайду 2, как только завершится переход к слайду 1 }) carousel.to('1') // Начнет переход к слайду 1 и вернется к вызывающей стороне carousel.to('2') // !! Будет проигнорирован, т.к. переход на слайд 1 не закончен!!
Настройки по умолчанию
Вы можете изменить настройки по умолчанию для плагина, изменив объект Constructor плагина. По умолчанию
:
// изменяет значение по умолчанию для параметра «клавиатура» модального плагина на false bootstrap.Modal.Default.keyboard = ложь
Нет конфликта (только если вы используете jQuery)
Иногда необходимо использовать плагины Bootstrap с другими фреймворками пользовательского интерфейса. В этих обстоятельствах иногда могут возникать конфликты пространств имен.
.noConflict
для плагина, для которого вы хотите восстановить значение.var bootstrapButton = $.fn.button.noConflict() // вернуть $.fn.button к ранее присвоенному значению $.fn.bootstrapBtn = bootstrapButton // дать $().bootstrapBtn функциональность Bootstrap
Номера версий
Доступ к версии каждого плагина Bootstrap можно получить через свойство VERSION
конструктора плагина. Например, для плагина всплывающей подсказки:
bootstrap.Tooltip.VERSION // => "5.0.2"
Никаких специальных откатов при отключенном JavaScript
Плагины Bootstrap не очень изящно отступают при отключенном JavaScript. Если вас волнует пользовательский опыт в этом случае, используйте
, чтобы объяснить ситуацию (и как снова включить JavaScript) своим пользователям и/или добавить свои собственные запасные варианты.
Сторонние библиотеки
Bootstrap официально не поддерживает сторонние библиотеки JavaScript , такие как Prototype или jQuery UI.
Несмотря на 9ария-[\w-]*$/i вар DefaultAllowlist = { // Глобальные атрибуты разрешены для любого предоставленного ниже элемента. '*': ['класс', 'каталог', 'идентификатор', 'язык', 'роль', ARIA_ATTRIBUTE_PATTERN], a: ['цель', 'href', 'название', 'отн'], область: [], б: [], бр: [], столбец: [], код: [], раздел: [], эм: [], час: [], ч2: [], h3: [], h4: [], h5: [], h5: [], h6: [], я: [], img: ['src', 'srcset', 'alt', 'название', 'ширина', 'высота'], ли: [], ол: [], п: [], пре: [], с: [], маленький: [], охватывать: [], суб: [], Как дела: [], сильный: [], ты: [], ул: [] } 9данные-мое-приложение-[\w-]+/ myDefaultAllowList['*'].push(myCustomRegex)Если вы хотите обойти наше дезинфицирующее средство, потому что предпочитаете использовать специальную библиотеку, например DOMPurify, вам следует сделать следующее:
var yourTooltipEl = document.getElementById('yourTooltip') var tooltip = новый bootstrap.Tooltip(yourTooltipEl, { sanitizeFn: функция (содержимое) { вернуть DOMPurify.sanitize (контент) } })
JS篇(001)-document load 和document ready 的区别_51CTO博客_document load和document ready的区别
JS篇(001)-document load 和document ready 的区别
原创
© 著作权 作者 所有 : : 来自 51CTO 博客 齐丶先 丶森 的 作品 作品 , 请 联系 作者 转载 授权 , 否则 将 追究 责任 责任
: : 页面 加载 有 两 种 法律 责任
: : : 加载 有 两 事件 事件 责任
是 当 页面 资源 全部 加载 完成 后 ((包括 文档 树 树 , css 文件 , js 文件 , 图片 资源)) 执行 一 个 函数 函数 函数 : : 资源) 多 执行 , 时间 较 长 后 执行 图片 图片 资源 资源 多 需要 需要 需要 函数 函数 需要 需要 需要 需要等待 较 时间 , 所以 一些 效果 可能 受到 影响
2. $ (документ) .ready () 是 当 文档 树 加载 完成 后 执行 一 个 函数 (不 包含 图片 , CSS 等) 所以 比 比 较 执行
在原生的js中不包括ready()这个方法,只有load方法也就是onload事件
参与互动
- знак
- 收藏
- 评论
- 分享
- 举报
相关文章
关注
分类列表
- # 前端面试秘籍147篇
- # java4篇
- # vue总结2篇
- # 书籍2篇
近期文章
- 1.