javascript Bootstrap 5.2,如果光标回到触发元素上,则阻止关闭工具提示

7rfyedvj  于 2022-12-17  发布在  Java
关注(0)|答案(1)|浏览(124)

TLDR:将光标从工具提示移回触发元素关闭,显示并关闭工具提示( Flink )。

我需要使工具提示打开悬停,并使其内容可点击。我发现了一个工作的例子here的SO。
当您将光标悬停在图元上时,它会显示一个可以交互的工具提示,一旦您将光标从工具提示移开,它就会关闭。
不过有个问题。
如果离开工具提示并将光标移回到触发工具提示的图元上,则工具提示会重新弹出,但过一会儿就会消失(“ Flink ”)。需要将光标从图元上移开并移回到图元上,工具提示才会再次显示。
我尝试做的是检查光标是否回到触发元素上,如果是这种情况not,则运行关闭函数(tooltip.hide())。
我试着通过模仿SO上的例子中的现有过程来做到这一点。也就是说,检查工具提示是否丢失了:hoversetTimout(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 ”问题。

njthzxwz

njthzxwz1#

在您代码中,您有一个事件侦听器,它添加了一个事件列表器,这是一个很大的错误,因为它向您的元素添加了无限多个事件列表器。
因此您只需像这样组织代码:

//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 currentTooltipTimeout;
    tooltipTriggerEl.addEventListener("mouseenter", function () {
        let isHidden = true;
        let toolTipID;
        // Clear Set Timeout
        clearTimeout(tooltipElTimeout);
        clearTimeout(currentTooltipTimeout);
        
        if (isHidden)
        {
                tooltip.show();
            isHidden=false;
        }
            
        
    });
        // Hide tooltip on tooltip mouse leave
    tooltipTriggerEl.addEventListener("mouseleave", function () {
                                           
                    console.log("!currentToolTip.matches(':hover')");
                    if(!tooltipTriggerEl.matches(":hover")){
                            currentTooltipTimeout=setTimeout(()=>{
                            if (!isHidden && !tooltipTriggerEl.matches(":hover")){
                                tooltip.hide();
                              isHidden=true;
                          }
                            
                            console.log("!tooltipTriggerEl.matches(':hover')");
                            console.log(!tooltipTriggerEl.matches(":hover"));
                        }, 3000)
                    }                
        });
  
    return tooltip;

})

现在你可以看到,我刚刚添加了isHidden变量来检查弹出窗口信息是否隐藏,如果你可以通过查询选择器请求得到它,你可以用元素来做这件事。就是这样。享受你的生活吧。
编辑:我忘了告诉你,我已经把3秒前检查是否弹出隐藏或没有。

相关问题