TLDR:将光标从工具提示移回触发元素关闭,显示并关闭工具提示( Flink )。
我需要使工具提示打开悬停,并使其内容可点击。我发现了一个工作的例子here的SO。
当您将光标悬停在图元上时,它会显示一个可以交互的工具提示,一旦您将光标从工具提示移开,它就会关闭。
不过有个问题。
如果离开工具提示并将光标移回到触发工具提示的图元上,则工具提示会重新弹出,但过一会儿就会消失(“ Flink ”)。需要将光标从图元上移开并移回到图元上,工具提示才会再次显示。
我尝试做的是检查光标是否回到触发元素上,如果是这种情况not,则运行关闭函数(tooltip.hide()
)。
我试着通过模仿SO上的例子中的现有过程来做到这一点。也就是说,检查工具提示是否丢失了:hover
,setTimout
(300ms),并检查光标现在是位于触发元素上还是回到工具提示上。
下面是一个jsFiddle示例。
这是代码。有问题的代码在两个looong注解行之间。
注:将光标从触发元素移开并返回到触发元素上也会触发 Flink 。
//https://stackoverflow.com/questions/67993080/bootstrap-5-make-tooltip-hoverable-and-link-clickable
var tooltipTriggerList = [].slice.call(document.querySelectorAll('button'))
for (let tt of tooltipTriggerList){
tt.setAttribute("data-bs-placement","top")
}
var tooltipList = tooltipTriggerList.map(function (tooltipTriggerEl) {
const tooltip = new bootstrap.Tooltip(tooltipTriggerEl, {
trigger: "manual",
'customClass': 'custom-tooltip'
})
let tooltipElTimeout;
let currentToolTip;
let currentTooltipTimeout;
tooltipTriggerEl.addEventListener("mouseenter", function () {
let toolTipID;
// Clear Set Timeout
clearTimeout(currentTooltipTimeout);
// Show Tooltip
tooltip.show();
// Assign current tooltip ID to toolTipID variable
toolTipID = tooltipTriggerEl.getAttribute("aria-describedby");
// Assign current tooltip to currentToolTip variable
currentToolTip = document.querySelector(`#${toolTipID}`);
/*******************************************************************/
// Hide tooltip on tooltip mouse leave
currentToolTip.addEventListener("mouseleave", function () {
currentTooltipTimeout = setTimeout(()=>{
console.log("!currentToolTip.matches(':hover')");
console.log(!currentToolTip.matches(":hover"));
if(!tooltipTriggerEl.matches(":hover")){
console.log("!tooltipTriggerEl.matches(':hover')");
console.log(!tooltipTriggerEl.matches(":hover"));
if (!currentToolTip.matches(":hover")) {
tooltip.hide();
}
}
}, 300)
});
/***********************************************************************/
});
tooltipTriggerEl.addEventListener("mouseleave", function () {
// SetTimeout before tooltip disappears
tooltipTimeout = setTimeout(function () {
// Hide tooltip if not hovered.
if (!currentToolTip.matches(":hover")) {
tooltip.hide();
}
}, 100);
});
return tooltip;
})
谢谢
**编辑:**胺拉穆尔的功能是我们想要的。现在有一个新的问题,因为toolTipID = tooltipTriggerEl.getAttribute("aria-describedby");
不工作,一旦工具提示关闭(只工作一次)。工具提示不再生成aria-describedby
属性。你可以看到这个here
编辑nr2胺代码中有一个作用域问题。如果我们将isHidden
变量移到tooltipTriggerEl.addEventListener
中,aria-describedby
问题就消失了。尽管现在我们又有了“ Flink ”问题。
1条答案
按热度按时间njthzxwz1#
在您代码中,您有一个事件侦听器,它添加了一个事件列表器,这是一个很大的错误,因为它向您的元素添加了无限多个事件列表器。
因此您只需像这样组织代码:
现在你可以看到,我刚刚添加了isHidden变量来检查弹出窗口信息是否隐藏,如果你可以通过查询选择器请求得到它,你可以用元素来做这件事。就是这样。享受你的生活吧。
编辑:我忘了告诉你,我已经把3秒前检查是否弹出隐藏或没有。