108 lines
3.3 KiB
JavaScript
108 lines
3.3 KiB
JavaScript
// Add onHover event for dropdowns
|
|
|
|
(function ($) {
|
|
if (!$ || !$.fn) return;
|
|
|
|
const SELECTOR = "[data-bs-toggle=dropdown][data-trigger=hover]";
|
|
const TIMEOUT = 150;
|
|
|
|
function openDropdown($i) {
|
|
let t = $i.data("dd-timeout");
|
|
|
|
if (t) {
|
|
clearTimeout(t);
|
|
t = null;
|
|
$i.data("dd-timeout", t);
|
|
}
|
|
|
|
if ($i.attr("aria-expanded") !== "true") $i.dropdown("toggle");
|
|
}
|
|
|
|
function closeDropdown($i) {
|
|
let t = $i.data("dd-timeout");
|
|
|
|
if (t) clearTimeout(t);
|
|
|
|
t = setTimeout(() => {
|
|
let t2 = $i.data("dd-timeout");
|
|
|
|
if (t2) {
|
|
clearTimeout(t2);
|
|
t2 = null;
|
|
$i.data("dd-timeout", t2);
|
|
}
|
|
|
|
if ($i.attr("aria-expanded") === "true") $i.dropdown("toggle");
|
|
}, TIMEOUT);
|
|
|
|
$i.data("dd-timeout", t);
|
|
}
|
|
|
|
$(function () {
|
|
$("body")
|
|
.on(
|
|
"mouseenter",
|
|
`${SELECTOR}, ${SELECTOR} ~ .dropdown-menu`,
|
|
function () {
|
|
const $toggle = $(this).hasClass("dropdown-toggle")
|
|
? $(this)
|
|
: $(this).prev(".dropdown-toggle");
|
|
const $dropdown = $(this).hasClass("dropdown-menu")
|
|
? $(this)
|
|
: $(this).next(".dropdown-menu");
|
|
|
|
if (
|
|
window
|
|
.getComputedStyle($dropdown[0], null)
|
|
.getPropertyValue("position") === "static"
|
|
)
|
|
return;
|
|
|
|
// Set hovered flag
|
|
if ($(this).is(SELECTOR)) {
|
|
$(this).data("hovered", true);
|
|
}
|
|
|
|
openDropdown(
|
|
$(this).hasClass("dropdown-toggle")
|
|
? $(this)
|
|
: $(this).prev(".dropdown-toggle"),
|
|
);
|
|
},
|
|
)
|
|
.on(
|
|
"mouseleave",
|
|
`${SELECTOR}, ${SELECTOR} ~ .dropdown-menu`,
|
|
function () {
|
|
const $toggle = $(this).hasClass("dropdown-toggle")
|
|
? $(this)
|
|
: $(this).prev(".dropdown-toggle");
|
|
const $dropdown = $(this).hasClass("dropdown-menu")
|
|
? $(this)
|
|
: $(this).next(".dropdown-menu");
|
|
|
|
if (
|
|
window
|
|
.getComputedStyle($dropdown[0], null)
|
|
.getPropertyValue("position") === "static"
|
|
)
|
|
return;
|
|
|
|
// Remove hovered flag
|
|
if ($(this).is(SELECTOR)) {
|
|
$(this).data("hovered", false);
|
|
}
|
|
|
|
closeDropdown(
|
|
$(this).hasClass("dropdown-toggle")
|
|
? $(this)
|
|
: $(this).prev(".dropdown-toggle"),
|
|
);
|
|
},
|
|
)
|
|
.on("hide.bs.dropdown", function (e) {
|
|
if ($(this).find(SELECTOR).data("hovered")) e.preventDefault();
|
|
});
|
|
});
|
|
})(window.jQuery);
|