TogglePopover() не открывается, но не закрывает встроенное всплывающее окно HTML

Я пытаюсь использовать встроенный в HTML поповер. Я попытался использовать следующий JavaScript для включения/выключения всплывающего окна.

HTML

<div>
  <button onclick = "handlePopover(event, 'popover-1')">+</button>
  <aside id = "popover-1" popover = "">
    <p>My Test</p>
  </aside>
</div>

JavaScript

function handlePopover(event, id) {
  // Identify the first popover element with the given id
  const popover = document.getElementById(id)

  // Exit early if no matching popover was found
  if (!popover) return

  // Get the coordinates of the clicked button
  let rect = event.target.getBoundingClientRect()

  // Modify the coordinates of the popover
  popover.style.left = rect.left + 10 + "px"
  popover.style.top = rect.top + 10 + "px"

  // Toggle the display state
  popover.togglePopover()
}

Поповер включается правильно и позиционируется правильно. Однако он не выключается, когда я нажимаю кнопку второй (или третий, или четвертый...) раз. Однако обратите внимание, что всплывающее окно исчезает, если я нажимаю за пределами области всплывающего окна, а не над кнопкой.

Как скрыть всплывающее окно при втором нажатии кнопки?

Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
1
0
79
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Демо

Без специального обработчика событий

Вы можете легко это сделать, используя атрибут popovertarget.

<div>
  <button popovertarget = "popover-1">+</button>
  <aside id = "popover-1" popover>
    <p>My Test</p>
  </aside>
</div>

С обработчиком пользовательских событий

Использование состояния всплывающего окна вручную

Если вы хотите использовать для этого специальное событие, используйте popover="manual"

 <aside id = "popover-1" popover = "manual">
    <p>My Test</p>
  </aside>

Обратите внимание, как мой код JavaScript изменяет положение всплывающего окна. Я хотел бы сохранить эту функциональность. Вот почему я считаю, что проще обрабатывать всю логику всплывающих окон внутри одной функции JS.

Ben 08.04.2024 20:23
popover = "manual" кажется, это решение. Хотя при выборе «вручную» я теряю некоторые приятные готовые функции, например, нажатие на всплывающее окно, чтобы скрыть его, и отображение только одного всплывающего окна за раз. Спасибо
Ben 08.04.2024 20:28

вы также можете сделать что-то вроде этого:

а) дать вашей кнопке идентификатор

 <button id = "popOverId" onclick = "handlePopover(event, 'popover-1')">+</button>

б) переключить popOver при нажатии кнопки

    let toggle = true;
    
    function handlePopover(event, id) {
        // Identify the first popover element with the given id
        const popover = document.getElementById(id)
    
        // Exit early if no matching popover was found
        if (!popover) return
    
        // Get the coordinates of the clicked button
        let rect = event.target.getBoundingClientRect()
    
        // Modify the coordinates of the popover
        popover.style.left = rect.left + 10 + "px"
        popover.style.top = rect.top + 10 + "px"
    
        // Toggle the display state
        popover.togglePopover(toggle);
    
    }
    
    
    document.addEventListener("click", (evt) => {
    
        if (evt.target.id !== "popOverId") {
            toggle = true;
        } else {
            toggle = !toggle;
        }
    
    });

Решение underscore более лаконичное и чистое, поэтому, если оно соответствует вашим потребностям, выбирайте именно его.

Другие вопросы по теме