Close popover in JS when another is opened with popper.js

Viewed 339

I have some basic HTML and load popper.js. I have about 3 popovers but they don't close when I click open another one.

I use tailwind as css and vanilla JS. I don't want to use jQuery to get this to work. It also shows some error about the event being deprecated but not sure how to fix it.

Please help!

Here is my pen: https://codepen.io/RobineSavert/pen/xxLMqpX

Here is my code:

function openPopover(event, tooltipID, position) {
  let element = event.target;
  while (element.nodeName !== "BUTTON") {
    element = element.parentNode;
  }
  var popper = Popper.createPopper(
    element,
    document.getElementById(tooltipID), {
      placement: position,
    }
  );
  document.getElementById(tooltipID).classList.toggle("hidden");
}
<link href="https://unpkg.com/tailwindcss@^2/dist/tailwind.min.css" rel="stylesheet"/>
<script src="https://unpkg.com/@popperjs/core@2.10.2/dist/umd/popper.min.js"></script>
  <section class="bg-gradient-to-b from-night to-babyblue w-full h-95vh justify-center">
    <div class="flex flex-1 pr-2 pt-2">

<button onclick="openPopover(event,'popover-cv-bottom', 'bottom')" class="mr-4 bg-red-400 flex h-12 justify-center p-3 rounded-full text-center text-white w-12" type="button">
        click
      </button>
      <button onclick="openPopover(event,'popover-email-bottom', 'bottom')" type="button" class="mr-4 bg-red-400 flex h-12 justify-center p-3 rounded-full text-center text-white w-12">
        click
      </button>
      <button onclick="openPopover(event,'popover-save-bottom', 'bottom')" type="button" class="mr-4 bg-red-400 flex h-12 justify-center p-3 rounded-full text-center text-white w-12">
        click       </button>
      <div class="hidden bg-white border mr-3 block z-50 font-normal leading-normal text-sm max-w-xs text-left no-underline break-words rounded-lg" id="popover-cv-bottom">
        <div>
          <div
            class="text-gray-700 opacity-75 font-semibold p-3
        mb-0
        border-b border-solid border-gray-100
        uppercase
        rounded-t-lg
      "
          >
            Popover 1 - title
          </div>
          <div class="text-gray-700 p-3">
            Lorem, ipsum dolor sit amet consectetur adipisicing elit. Saepe,
            non.
          </div>
        </div>
      </div>
      <div class="hidden bg-white border mr-3 block z-50 font-normal leading-normal text-sm max-w-xs text-left no-underline break-words rounded-lg" id="popover-email-bottom">
        <div>
          <div
            class="
        text-gray-700
        opacity-75
        font-semibold
        p-3
        mb-0
        border-b border-solid border-gray-100
        uppercase
        rounded-t-lg
      "
          >
            Popover 2 - title
          </div>
          <div class="text-gray-700 p-3">
            Lorem, ipsum dolor sit amet consectetur adipisicing elit. Saepe,
            non.
          </div>
        </div>
      </div>
      <div class="hidden bg-white border mr-3 block z-50 font-normal leading-normal text-sm max-w-xs text-left no-underline break-words rounded-lg" id="popover-save-bottom">
        <div>
          <div
            class="
        text-gray-700
        opacity-75
        font-semibold
        p-3
        mb-0
        border-b border-solid border-gray-100
        uppercase
        rounded-t-lg
      "
          >
            Popover 3 - title
          </div>
          <div class="text-gray-700 p-3">
            Lorem, ipsum dolor sit amet consectetur adipisicing elit. Saepe,
            non.
          </div>
        </div>

      </div>
    </div>
</section>

1 Answers

You can try this:

allPoppers = [];

function openPopover(event, tooltipID, position)
{
  var el = document.getElementById(tooltipID);
  var state = el.style.visibility;
  
  // Close all popovers
  hideElements(allPoppers);

  let element = event.target;
  while (element.nodeName !== "BUTTON") {
    element = element.parentNode;
  }
  
  Popper.createPopper(
    element,
    el, {
      placement: position,
    }
  );

  allPoppers.push(tooltipID);
  toggle(el, state);
}

function toggle(el, state)
{
  if (state == "hidden") {
      el.style.visibility = "visible";
  } else if (state == "visible") {
      el.style.visibility = "hidden";
  } else {
      el.style.visibility = "visible";
  }
}

function hideElements(elements)
{
  var length = elements.length;

  if (length > 0) {
    for (var i = 0; i < length; i++) {
      document.getElementById(elements[i]).style.visibility = "hidden";
    }
  } 
}
.popover {  
    visibility: hidden;
}
<link href="https://unpkg.com/tailwindcss@^2/dist/tailwind.min.css" rel="stylesheet"/>
<script src="https://unpkg.com/@popperjs/core@2.10.2/dist/umd/popper.min.js"></script>
  <section class="bg-gradient-to-b from-night to-babyblue w-full h-95vh justify-center">
    <div class="flex flex-1 pr-2 pt-2">

<button onclick="openPopover(event,'popover-cv-bottom', 'bottom')" class="mr-4 bg-red-400 flex h-12 justify-center p-3 rounded-full text-center text-white w-12" type="button">
        click
      </button>
      <button onclick="openPopover(event,'popover-email-bottom', 'bottom')" type="button" class="mr-4 bg-red-400 flex h-12 justify-center p-3 rounded-full text-center text-white w-12">
        click
      </button>
      <button onclick="openPopover(event,'popover-save-bottom', 'bottom')" type="button" class="mr-4 bg-red-400 flex h-12 justify-center p-3 rounded-full text-center text-white w-12">
        click       </button>
      <div class="bg-white border mr-3 block z-50 font-normal leading-normal text-sm max-w-xs text-left no-underline break-words rounded-lg popover" id="popover-cv-bottom">
        <div>
          <div
            class="text-gray-700 opacity-75 font-semibold p-3
        mb-0
        border-b border-solid border-gray-100
        uppercase
        rounded-t-lg
      "
          >
            Popover A
          </div>
          <div class="text-gray-700 p-3">
            A
          </div>
        </div>
      </div>
      <div class="bg-white border mr-3 block z-50 font-normal leading-normal text-sm max-w-xs text-left no-underline break-words rounded-lg popover" id="popover-email-bottom">
        <div>
          <div
            class="
        text-gray-700
        opacity-75
        font-semibold
        p-3
        mb-0
        border-b border-solid border-gray-100
        uppercase
        rounded-t-lg
      "
          >
            Popover B
          </div>
          <div class="text-gray-700 p-3">
            B
          </div>
        </div>
      </div>
      <div class="bg-white border mr-3 block z-50 font-normal leading-normal text-sm max-w-xs text-left no-underline break-words rounded-lg popover" id="popover-save-bottom">
        <div>
          <div
            class="
        text-gray-700
        opacity-75
        font-semibold
        p-3
        mb-0
        border-b border-solid border-gray-100
        uppercase
        rounded-t-lg
      "
          >
            Popover C
          </div>
          <div class="text-gray-700 p-3">
            C
          </div>
        </div>
      </div>
    </div>
</section>

Related