具有不同触发选项的单个 html 元素上的多个 tippy.js 实例

Multiple tippy.js instances on a single html element with different trigger options

我正在尝试做一些与问题 here 中提出的非常相似(如果不相同)的事情(答案对我不起作用,似乎 answerer/creator没看懂问题)。

我的目标是在具有不同触发选项的单个 html 元素上有两个提示工具提示实例:

我是这样做的:

    var myelement = document.getElementById('myelementid');

    // Default way of creating tippy tooltips
    tippy(myelement, {
        content: 'Shown on hover.'
    });

    // Creating a tooltip which will be triggered manually/programmatically
    var mytippy = tippy(myelement, {
        content: 'Shown on click.',
        trigger: 'manual'
    });

    myelement.addEventListener("click", function() {
        mytippy.show(300);
        setTimeout(function(){ mytippy.hide(300); }, 1500);
    });

并且出于某种原因,它根本不会在该元素上显示手动触发的工具提示。我得到这个异常:Uncaught TypeError: Cannot read property 'show' of undefined at HTMLImageElement.<anonymous>(指的是 tippy show() 函数)。但是当我删除其中一个(tippy 实例)时,另一个完美运行。

看起来 Tippy.js 在工具提示的元素上使用了 HTML 属性(即 titledata-tippy)。由于重复的属性将是无效标记,因此解决方法可能是在单击元素时更改工具提示文本。然后,在用户离开该元素后,您可以将工具提示文本改回来。

例如:

let myelement = document.getElementById('myelementid');
let to;

let text = "Show on hover."
let tip = tippy(myelement, {
  content: text
});

myelement.addEventListener("click", handleClick);
myelement.addEventListener("mouseout", moveOut);

function moveOut () {
    // when the user moves their mouse away from the button
    // cancel showing the alternate tooltip text
    clearTimeout(to);
    // slight delay to prevent "flash" of original tooltip text
    setTimeout(function () {
        // set the tooltip text back to the original
        tip.setContent(text);
    }, 200);
}

function handleClick () {
    tip.setContent("Click");
    tip.show(300);
    to = setTimeout(function() {
        tip.hide(300);
    }, 1500); 
}

这是一个 fiddle 演示:https://jsfiddle.net/g6odqukr/

与此同时,我想到了在元素 myelement 本身上放置一个尖锐的工具提示,在其 parentNode 元素上放置另一个提示,目前看来是最简单的解决方案(理解和编写)。这就像编写两个完全不同的工具提示一样简单。它要求 parentNode 元素与 myelement 本身具有相同的大小,以便看起来工具提示实际上属于同一元素。

这里是代码:

var myelement = document.getElementById('myelementid');

// Default way of creating tippy tooltips
tippy(myelement, {
    content: 'Shown on hover.'
});

// Creating a tooltip which will be triggered on click
tippy(myelement.parentNode, {
    content: 'Shown on click.',
    trigger: 'click'
});

这里是更高级一点的版本:https://jsfiddle.net/zbhf48gn/