Как заставить всплывающее окно Bootstrap 5.2 срабатывать в операторе «если»?

Я использую всплывающие окна как часть процесса проверки ввода. У меня есть идея, но я не могу понять синтаксис, как заставить это работать.

https://jsbin.com/sufitelodo/1/edit?html,js,output

Этот JSBin является его основой.

Я не знаю, как написать HTML для скрытого всплывающего окна Bootstrap 5.2, которое появляется только при вызове в операторе if. Чтобы запустить это, введите число 0 на вход A и любое число на вход B и снова то же число на вход C. Первая ошибка должна заключаться в том, что вход A = 0, а затем вы меняете это на любой ненулевой, а затем второй ошибка должна произойти, когда вы попытаетесь отправить. Я хотел бы перейти от окон предупреждений к всплывающим окнам.

const popoverTriggerList = [].slice.call(
  document.querySelectorAll('[data-bs-toggle = "popover"]')
);
const popoverList = popoverTriggerList.map(function (popoverTriggerEl) {
  return new bootstrap.Popover(popoverTriggerEl, { html: true });
});



document.getElementById("button").addEventListener("click", testMe);

function testMe() {
  let inputA = parseFloat(document.getElementById("aInput").value);
  let inputB = parseFloat(document.getElementById("bInput").value);
  let inputC = parseFloat(document.getElementById("cInput").value);
  let popoverTest1 = document.getElementById("popoverTest1");
  let popoverTest2 = document.getElementById("popoverTest2");
  
  if (inputA === 0) {
    // Make popoverTest1 come up here
    //alert("This is when popoverTest1 should fire");
    bootstrap.Popover.getOrCreateInstance('#popoverTest1').show()
    
    return false;
    
  } else if (inputB === inputC) {
    // Make popoverTest2 come up here
    //alert("This is when popoverTest2 should fire");
    bootstrap.Popover.getOrCreateInstance('#popoverTest2').show()
    
    return false;
  }
}

document.getElementById("close1").addEventListener("click", closePop);
function closePop () {
  bootstrap.Popover.getInstance('#popoverTest1').hide();
}
<link href = "https://cdn.jsdelivr.net/npm/[email protected]/dist/css/bootstrap.min.css" rel = "stylesheet" integrity = "sha384-rbsA2VBKQhggwzxH7pPCaAqO46MgnOM80zW1RWuH61DGLwZJEdK2Kadq2F9CUG65" crossorigin = "anonymous">

<label for = "aInput">A Input</label>
  <input type = "number" id = "aInput">
  <span id = "popoverTest1" 
          data-bs-container = "body" 
          data-bs-toggle = "popover" 
          data-bs-trigger = "manual" 
          data-bs-content = "Top popover"
          data-bs-title='This is zero <a href = "" id = "close1">x</a>'
          data-bs-content='Change it to something non-zero'>
</span>
  <br><br>
  <label for = "bInput">B Input</label>
  <input type = "number" id = "bInput">
  <span id = "popoverTest2" 
          data-bs-container = "body" 
          data-bs-toggle = "popover" 
          data-bs-trigger = "manual" 
          data-bs-content = "Top popover"
          data-bs-title = "This is the same as Input C"
          data-bs-content = "Change it so it's not the same as Input C">
</span>
  <br> <br>
  <label for = "cInput">C Input</label>
  <input type = "number" id = "cInput">
 
<button type = "button" class = "btn btn-warning" id = "button">Hit Me</button>
  
<script src = "https://cdn.jsdelivr.net/npm/[email protected]/dist/js/bootstrap.bundle.min.js" integrity = "sha384-kenU1KFdBIe4zVF0s0G1M5b4hcpxyD9F7jL+jjXkk+Q2h455rYXK/7HAuoJl+0I4" crossorigin = "anonymous"></script>

Итак, вместо предупреждений я бы хотел более чистое всплывающее окно от Bootstrap, но синтаксис и их работа (даже после попытки расшифровать документацию) не на моей стороне. Затем, после открытия всплывающего окна, его нужно снова закрыть.

Я пробовал data-bs-trigger = "focus", но, похоже, это не позволило закрыть.

Спасибо за вашу помощь в этом.

*** Изменить. Я обновил код, чтобы можно было использовать только Vanilla, но есть ошибка с использованием кнопки закрытия... Кажется, я не могу избавиться от всплывающего окна.

Поведение ключевого слова "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
119
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

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

Я включил все необходимые активы, как описано в документации здесь (для версии 5.2):

https://getbootstrap.com/docs/5.2/getting-started/introduction/

И использовал точный фрагмент кода, показанный здесь, для инициализации всех всплывающих окон:

https://getbootstrap.com/docs/5.2/components/popovers/

Стратегия получения экземпляра всплывающего окна с помощью селектора CSS:

const popover1 = bootstrap.Popover.getOrCreateInstance('#popoverTest1');

Методы, которые вам интересно вызывать при отображении и скрытии соответственно:

popover1.show();
popover1.hide();

Единственное действие, которое я добавил к вашей логике, — это скрытие всех всплывающих окон при нажатии кнопки перед отображением нового, если это так.

Затем я также добавил стратегию для обработки щелчка, которая будет скрывать все видимые всплывающие окна в случае их отображения. Bootstrap полагался на атрибут data-bs-trigger, установленный как focus вместо manual, но это подразумевает, что всплывающее окно будет запускаться посредством взаимодействия с пользователем, а не явным вызовом метода .show() вручную. Итак, поскольку мы показываем всплывающие окна через .show(), мы обречены также на реализацию части .hide(), которая в данном случае обрабатывается обработчиком события клика на объекте окна.

const popoverTriggerList = document.querySelectorAll('[data-bs-toggle = "popover"]')
const popoverList = [...popoverTriggerList].map(popoverTriggerEl => new bootstrap.Popover(popoverTriggerEl))

document.getElementById("button").addEventListener("click", testMe);

window.addEventListener('click', (event)=>{    
    const popoverTest1 = bootstrap.Popover.getOrCreateInstance('#popoverTest1');
    const popoverTest2 = bootstrap.Popover.getOrCreateInstance('#popoverTest2');
    popoverTest1.hide();
    popoverTest2.hide();  
});

function testMe(event) {

  event.stopPropagation();

  const inputA = parseFloat(document.getElementById("aInput").value);
  const inputB = parseFloat(document.getElementById("bInput").value);
  const inputC = parseFloat(document.getElementById("cInput").value);
    
  const popoverTest1 = bootstrap.Popover.getOrCreateInstance('#popoverTest1');
  const popoverTest2 = bootstrap.Popover.getOrCreateInstance('#popoverTest2');

  popoverTest1.hide();
  popoverTest2.hide();

  if (inputA === 0) {    
    popoverTest1.show();
  } else if (inputB === inputC) {    
    popoverTest2.show();
  }
}
<!doctype html>
<html lang = "en">
  <head>
    <meta charset = "utf-8">
    <meta name = "viewport" content = "width=device-width, initial-scale=1">
    <title>Bootstrap demo</title>
    <link
      href = "https://cdn.jsdelivr.net/npm/[email protected]/dist/css/bootstrap.min.css"
      rel = "stylesheet"
      integrity = "sha384-rbsA2VBKQhggwzxH7pPCaAqO46MgnOM80zW1RWuH61DGLwZJEdK2Kadq2F9CUG65" 
      crossorigin = "anonymous">      
  </head>
  <body>

    <label for = "aInput">A Input</label>
    <input type = "number" id = "aInput">

    <!-- popoverTest1 -->
    <span      
      id = "popoverTest1"
      data-bs-container = "body"
      data-bs-toggle = "popover"      
      data-bs-trigger = "manual"      
      data-bs-title = "This is zero"
      data-bs-content = "Change it to something non-zero"></span>

    <br><br>

    <label for = "bInput">B Input</label>
    <input type = "number" id = "bInput">

    <!-- popoverTest2 -->

    <span
      id = "popoverTest2"
      data-bs-container = "body"
      data-bs-toggle = "popover"      
      data-bs-trigger = "manual"      
      data-bs-title = "This is the same as Input C"
      data-bs-content = "Change it so it's not the same as Input C"></span>

    <br><br>
    <label for = "cInput">C Input</label>
    <input type = "number" id = "cInput">

    <button type = "button" class = "btn btn-warning" id = "button">Hit Me</button>
    
    <script
      src = "https://cdn.jsdelivr.net/npm/[email protected]/dist/js/bootstrap.bundle.min.js" 
      integrity = "sha384-kenU1KFdBIe4zVF0s0G1M5b4hcpxyD9F7jL+jjXkk+Q2h455rYXK/7HAuoJl+0I4" 
      crossorigin = "anonymous"></script>
      
  </body>
</html>

У меня тоже что-то подобное работает, но я пытался отказаться от использования jQuery.

Paul Davis 23.11.2022 16:57

Я пробовал это раньше: popoverTest1.popover('show'); (используя те же переменные), но это не сработало.

Paul Davis 23.11.2022 17:01

код, которым я поделился ранее, работал для меня, но он не полностью соответствовал используемым версиям. Я только что обновил ответ, чтобы включить именно то, что требуется для работы с загрузкой 5.2. В качестве примечания: для всплывающих окон требуется библиотека popper.js, которая в данном случае включена в bootstrap.bundle.min.js.

Diego D 24.11.2022 15:58

Я использую полный пакет на своем сайте и JSBin, единственное, с чем у меня возникают проблемы, это то, что всплывающее окно не закрывается при следующем щелчке. Я изменил data-bs-trigger = "manual" на data-bs-trigger = "focus", но это не сработало.

Paul Davis 24.11.2022 16:17

это, вероятно, потому, что всплывающее окно должно быть вызвано действием пользователя. Вот почему атрибут называется триггером, и его значение должно быть ручным или фокусным (или чем-то еще). Журналы для закрытия всплывающего окна основаны на том факте, что первый щелчок вызвал его появление. Поскольку эта стратегия не может работать с использованием .show-подхода, я реализовал свою .hide часть истории, добавив прослушиватель для события щелчка на объекте окна.

Diego D 24.11.2022 16:47

* логика закрытия всплывающего окна зависит от... (исправление типа, который я сделал ранее) ... может быть, этот комментарий был слишком большим ... в любом случае, теперь код работает, как ожидалось. Я только добавлю, что в любом случае у закрываемого всплывающего окна были дополнительные требования, такие как использование элемента привязки и tabindex, поэтому использование hide() в этом случае было гораздо более подходящим в любом случае.

Diego D 24.11.2022 17:09

Спасибо... Собираюсь работать по его методу, похоже, он удовлетворит мои потребности. Я ценю вашу помощь здесь.

Paul Davis 24.11.2022 19:08

Давайте продолжим обсуждение в чате.

Paul Davis 24.11.2022 19:39

Вам нужно получить экземпляр соответствующего Popover и показать его.

function testMe() {
    let inputA = parseFloat(document.getElementById("aInput").value);
    let inputB = parseFloat(document.getElementById("bInput").value);
    let inputC = parseFloat(document.getElementById("cInput").value);
    let popoverTest1 = document.getElementById("popoverTest1");
    let popoverTest2 = document.getElementById("popoverTest2");
    if (inputA === 0) {
        // Make popoverTest1 come up here
        // alert("This is when popoverTest1 should fire");
        // document.getElementById("popoverTest1").popover('show')
        bootstrap.Popover.getOrCreateInstance('#popoverTest1').show()
    }
    else if (inputB === inputC) {
        // Make popoverTest2 come up here
        //ert("This is when popoverTest2 should fire");
        bootstrap.Popover.getOrCreateInstance('#popoverTest2').show()
    }
 }

Демо

оооо... спасибо. Я пробовал это, но не совсем этот синтаксис. Я пытаюсь сейчас.

Paul Davis 23.11.2022 17:40

Теперь это просто заставляет его снова исчезнуть после .. но это волшебная помощь! Спасибо.

Paul Davis 23.11.2022 17:41

У вас есть идеи, как сделать всплывающее окно понятным при следующем нажатии? Я пытался изменить data-bs-trigger = "manual" на data-bs-trigger = "focus", но это не сработало. Любая подсказка?

Paul Davis 24.11.2022 16:18

Это отдельный вопрос. Пожалуйста, сначала примите этот ответ на исходный вопрос.

Zim 24.11.2022 16:56

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