Bootstrap 5 / jQuery:是否可以强制 bootstrap 5 立即注入其 jquery 插件,而不是在 DOMContentLoaded 之后?
Bootstrap 5 / jQuery: is it possible to force bootstrap 5 to inject its jquery plugins immediately, not after DOMContentLoaded?
迁移到 BS 5 后,这变得坏了:
<script src="https://code.jquery.com/jquery-3.6.0.js"></script>
<script src="https://cdn.jsdelivr.net/npm/@popperjs/core@2.9.2/dist/umd/popper.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.0.1/dist/js/bootstrap.min.js"></script>
<script>
$('[data-bs-toggle="tooltip"]').tooltip()
</script>
正常工作时:
<script src="https://code.jquery.com/jquery-3.6.0.js"></script>
<script src="https://cdn.jsdelivr.net/npm/@popperjs/core@2.9.2/dist/umd/popper.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.0.1/dist/js/bootstrap.min.js"></script>
<script>
document.addEventListener("DOMContentLoaded", function (event) {
(function () {
$('[data-bs-toggle="tooltip"]').tooltip()
})();
});
</script>
这在迁移文档中不存在,对我来说看起来很奇怪,所以我想问:可能是我做错了什么,仍然可以像在 BS4 中那样立即注入插件?
你说得对 jQuery 插件一加载就可用。
A jQuery 插件是通过扩展 jQuery.prototype 创建的,如本例所示 Learn jQuery:
$.fn.greenify = function() {
this.css( "color", "green" );
};
一旦将函数分配给jQuery原型,就可以运行,所以,只要脚本在最后,调用新的jQuery功能马上就可以了。
$( "a" ).greenify(); // Makes all the links green.
Bootstrap 4
对于Bootstrap 4,由于它的JavaScript是在jQuery加载后立即作为插件加载的,因此Bootstrap jQuery功能可用离开。
您可以从 Bootstrap 4.6.0 的工具提示模块中看到代码,其中分配了 tooltip function to jQuery:
$.fn[NAME] = Tooltip._jQueryInterface
$.fn[NAME].Constructor = Tooltip
$.fn[NAME].noConflict = () => {
$.fn[NAME] = JQUERY_NO_CONFLICT
return Tooltip._jQueryInterface
}
一个警告 — 对于版本 4,Bootstrap 推荐 waiting for the DOM to be loaded。
$(function () {
$('[data-toggle="tooltip"]').tooltip()
})
运行 该功能立即可用,因为它位于页面底部。
Bootstrap 5
Bootstrap 5 的工作方式不同。它会创建一个 bootstrap JavaScript 对象,您可以立即使用(一旦加载脚本文件)。将 BS-5 code for enabling tooltips 紧跟在 BS-5 代码之后即可:
var tooltipTriggerList = [].slice.call(document.querySelectorAll('[data-bs-toggle="tooltip"]'));
var tooltipList = tooltipTriggerList.map(function (tooltipTriggerEl) {
return new bootstrap.Tooltip(tooltipTriggerEl)
});
在Bootstrap定义工具提示功能后,calls a function to add the tooltip to jQuery:
defineJQueryPlugin(Tooltip)
function 做的第一件事是检查文档是否仍在加载:
const defineJQueryPlugin = plugin => {
onDOMContentLoaded(() => {
const $ = getjQuery()
if ($) {
const name = plugin.NAME
const JQUERY_NO_CONFLICT = $.fn[name]
$.fn[name] = plugin.jQueryInterface
$.fn[name].Constructor = plugin
$.fn[name].noConflict = () => {
$.fn[name] = JQUERY_NO_CONFLICT
return plugin.jQueryInterface
}
}
})
}
检查DOM是否加载的function是:
const onDOMContentLoaded = callback => {
if (document.readyState === 'loading') {
document.addEventListener('DOMContentLoaded', callback)
} else {
callback()
}
}
如果 DOM 仍在加载,则会创建 DOMContentLoaded 事件的事件侦听器,并且该侦听器 运行 是创建 jQuery 插件的代码在 加载 DOM 之后。
所以,是的,jQuery 插件在加载后立即可用,但是 Bootstrap 将插件分配延迟到 DOMContentLoaded 事件之后。他们为什么这样做,我不知道,但这就是代码当前的工作方式。
迁移到 BS 5 后,这变得坏了:
<script src="https://code.jquery.com/jquery-3.6.0.js"></script>
<script src="https://cdn.jsdelivr.net/npm/@popperjs/core@2.9.2/dist/umd/popper.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.0.1/dist/js/bootstrap.min.js"></script>
<script>
$('[data-bs-toggle="tooltip"]').tooltip()
</script>
正常工作时:
<script src="https://code.jquery.com/jquery-3.6.0.js"></script>
<script src="https://cdn.jsdelivr.net/npm/@popperjs/core@2.9.2/dist/umd/popper.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.0.1/dist/js/bootstrap.min.js"></script>
<script>
document.addEventListener("DOMContentLoaded", function (event) {
(function () {
$('[data-bs-toggle="tooltip"]').tooltip()
})();
});
</script>
这在迁移文档中不存在,对我来说看起来很奇怪,所以我想问:可能是我做错了什么,仍然可以像在 BS4 中那样立即注入插件?
你说得对 jQuery 插件一加载就可用。
A jQuery 插件是通过扩展 jQuery.prototype 创建的,如本例所示 Learn jQuery:
$.fn.greenify = function() {
this.css( "color", "green" );
};
一旦将函数分配给jQuery原型,就可以运行,所以,只要脚本在最后,调用新的jQuery功能马上就可以了。
$( "a" ).greenify(); // Makes all the links green.
Bootstrap 4
对于Bootstrap 4,由于它的JavaScript是在jQuery加载后立即作为插件加载的,因此Bootstrap jQuery功能可用离开。
您可以从 Bootstrap 4.6.0 的工具提示模块中看到代码,其中分配了 tooltip function to jQuery:
$.fn[NAME] = Tooltip._jQueryInterface
$.fn[NAME].Constructor = Tooltip
$.fn[NAME].noConflict = () => {
$.fn[NAME] = JQUERY_NO_CONFLICT
return Tooltip._jQueryInterface
}
一个警告 — 对于版本 4,Bootstrap 推荐 waiting for the DOM to be loaded。
$(function () {
$('[data-toggle="tooltip"]').tooltip()
})
运行 该功能立即可用,因为它位于页面底部。
Bootstrap 5
Bootstrap 5 的工作方式不同。它会创建一个 bootstrap JavaScript 对象,您可以立即使用(一旦加载脚本文件)。将 BS-5 code for enabling tooltips 紧跟在 BS-5 代码之后即可:
var tooltipTriggerList = [].slice.call(document.querySelectorAll('[data-bs-toggle="tooltip"]'));
var tooltipList = tooltipTriggerList.map(function (tooltipTriggerEl) {
return new bootstrap.Tooltip(tooltipTriggerEl)
});
在Bootstrap定义工具提示功能后,calls a function to add the tooltip to jQuery:
defineJQueryPlugin(Tooltip)
function 做的第一件事是检查文档是否仍在加载:
const defineJQueryPlugin = plugin => {
onDOMContentLoaded(() => {
const $ = getjQuery()
if ($) {
const name = plugin.NAME
const JQUERY_NO_CONFLICT = $.fn[name]
$.fn[name] = plugin.jQueryInterface
$.fn[name].Constructor = plugin
$.fn[name].noConflict = () => {
$.fn[name] = JQUERY_NO_CONFLICT
return plugin.jQueryInterface
}
}
})
}
检查DOM是否加载的function是:
const onDOMContentLoaded = callback => {
if (document.readyState === 'loading') {
document.addEventListener('DOMContentLoaded', callback)
} else {
callback()
}
}
如果 DOM 仍在加载,则会创建 DOMContentLoaded 事件的事件侦听器,并且该侦听器 运行 是创建 jQuery 插件的代码在 加载 DOM 之后。
所以,是的,jQuery 插件在加载后立即可用,但是 Bootstrap 将插件分配延迟到 DOMContentLoaded 事件之后。他们为什么这样做,我不知道,但这就是代码当前的工作方式。