Изменить заголовок всплывающей подсказки Popper.js при нажатии

Клянусь, я искал и не нашел этого вопроса. Извините, если я сделал ошибку!

ВНИМАНИЕ: Я хочу использовать ТОЛЬКО JavaScript! Я не хочу включать библиотеку jQuery! Есть много примеров использования jQuery, но они мне не помогают.

Проблема: я создаю веб-сайт и использую Bootstrap 5 + Popper. У меня есть несколько адресов электронной почты, написанных в содержании. Каждый адрес электронной почты встроен в привязку HTML. Для каждого адреса электронной почты я показываю всплывающую подсказку «Копировать адрес» при наведении на него. Когда нажимается якорный текст (адрес электронной почты), я хочу скопировать адрес электронной почты в буфер обмена, чтобы пользователь мог вставить его в любой клиент электронной почты, который они используют. После нажатия на адрес электронной почты заголовок всплывающей подсказки должен быть изменен на «Скопировано» в качестве подтверждения для пользователя.

HTML код:

      <a href="#" data-bs-toggle="tooltip" title="" data-bs-original-title="Copy address">office@example.com</a>
...
<!-- This input text field is used to copy the text (E-Mail addresses) via JavaScript -->
<input type="text" id="copy_input" readonly style="position: absolute; left: -9999px;">

Инициализация JavaScript для всплывающей подсказки Popper (точно так же, как на странице Bootstrap для всплывающей подсказки):

      var tooltipTriggerList = [].slice.call(document.querySelectorAll('[data-bs-toggle="tooltip"]'))
var tooltipList = tooltipTriggerList.map(function (tooltipTriggerEl) {
  return new bootstrap.Tooltip(tooltipTriggerEl);
});

И вот мой код JavaScript, который может копировать адрес электронной почты в буфер обмена, НО НЕ МОЖЕТ изменить заголовок всплывающей подсказки:

      tooltipTriggerList.forEach(function(alink) {
    alink.addEventListener('click', function(e) {
        e.preventDefault();
        const copy_input = document.querySelector('#copy_input');
        copy_input.value = alink.textContent.trim();
        copy_input.select();
        document.execCommand('copy');
        copy_input.value = '';
        alink.setAttribute('data-bs-original-title', 'Copied');
        alink.setAttribute('title', 'Copied');  // just to be sure...
        alink.show();  // I thought show() would re-display the changed title, but no!
    });
});

К сожалению, заголовок всплывающей подсказки не изменяется функцией слушателя выше.

Спасибо за вашу помощь!

1 ответ

Ошибка связана с тем, что метод show должен вызываться для объекта всплывающей подсказки, вставленного в элемент ссылки.

      tooltipTriggerList.forEach(function(alink) {
    alink.addEventListener('click', function(e) {
        e.preventDefault();
        // do the copy logic ....
    
        // change title for tooltip
        alink.setAttribute('data-bs-original-title', 'Copied');
    
        // show the tooltip with the new title
        bootstrap.Tooltip.getInstance(alink).show()
    });
});
Другие вопросы по тегам