Сбой события щелчка после добавления вложенного тега привязки к элементу раздела

#javascript #html

#javascript #HTML

Вопрос:

Я хотел создать своего рода модал, который открывался бы при нажатии на <li> , предлагающий дополнительную информацию о теме. Я создал popupTrigger, который реагирует на пользовательский «щелчок», а затем собирает предоставленный раздел (и все теги, вложенные внутри) и перемещает его во всплывающий div, который затем появляется на странице. Я принял необходимые меры предосторожности на случай, если раздел пуст, в котором будет звучать предупреждение. Однако предупреждение по-прежнему срабатывает, когда раздел не пуст (он содержит текст и дополнительный тег привязки). Я не уверен, почему это происходит.

Когда я регистрирую консоль, я вижу, что вложенный тег привязки просматривается браузером как отдельный объект для раздела. Я попытался дополнительно вложить тег привязки в элемент div и переписать javascript, чтобы html вложенного тега привязки был соответствующим образом оценен как часть раздела, но все безрезультатно. Этот обратный эффект возникает только тогда, когда дополнительный тег привязки включен в элемент section HTML.

HTML

 <li id="card">
   <a class="popUpTrigger" href="#">
      Get a Library Card

      <section class="hide">
          <h6> How to Obtain a Library Card:</h6>
          <p> Additional Info </p>
          <p> Additional Info </p>
          <p> Additional Info </p>
          <p> Additional Info </p>
          <a href="https://docs.wixstatic.com/ugd/858998_1fae2b5d06fa41a3ba3fcb493b349d19.pdf">
             <img src="imgs/LibraryCardVector.png" alt="library card">
          </a>
       </section>
    </a>
</li>

<div class="popUp">
  <div>
    <div id="popUpClose"> <button type="button" class="btn">X</button></div>    
  </div>
  <div id="moreInfo">
    <!--WILL BE FILLED IN WITH <section class="hide"> DATA ABOVE-->
  </div>
</div>
  

JavaScript

 $('a.popUpTrigger').on('click', function() {
    $(this).addClass('selected');
    if ($('.selected')) {
      let messageArea = $('.selected > section.hide');
      let strippedMessage = messageArea.text().replace(/(rn|n|r)/gm, "").replace(/s/g, "");
      let fullMessage = messageArea.html();

      if (strippedMessage === "") {
        alert("Sorry that page isn't available right now.");
        $(this).removeClass('selected');
      } else {
        $('.popUp').css('display', 'block');
        $('.popUp #moreInfo').html(fullMessage);
      }
    }
    $('.popUp #popUpClose').on('click', function() {
      $('.popUpTrigger').removeClass('selected');
      $('.popUp').css('display', 'none');
    });
});
  

Комментарии:

1. if ($('.selected')) { неверно, объект jQuery всегда соответствует действительности

2. У вас не может быть привязки внутри привязки. Это недопустимый HTML. ТАКИМ образом, браузер переписывает его, чтобы он был действительным. Итак, вам нужно переосмыслить, как вы пишете свой HTML>

Ответ №1:

Я удалил дочерние элементы из вашего привязки и вместо этого использовал NEXT . Также не понадобился ваш оператор if. Я оставил .выбранный в коде на всякий случай, если вы хотите изменить стиль привязки при нажатии.

 $('a.popUpTrigger').on('click', function() {
    $('a.popUpTrigger').removeClass("selected");
    $(this).addClass('selected');
    
      let messageArea = $(this).next("section");
      let strippedMessage = messageArea.text().replace(/(rn|n|r)/gm, "").replace(/s/g, "");
      let fullMessage = messageArea.html();

      if (strippedMessage === "") {
        alert("Sorry that page isn't available right now.");
        $(this).removeClass('selected');
      } else {
        $('.popUp').css('display', 'block');
        $('.popUp #moreInfo').html(fullMessage);
      }
    
    $('.popUp #popUpClose').on('click', function() {
      $('.popUpTrigger').removeClass('selected');
      $('.popUp').css('display', 'none');
    });
});  
 .selected{color:red;}
.hide{display:none;}  
 <script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<li id="card">
   <a class="popUpTrigger" href="#">
      Get a Library Card </a>

      <section class="hide">
          <h6> How to Obtain a Library Card:</h6>
          <p> Additional Info </p>
          <p> Additional Info </p>
          <p> Additional Info </p>
          <p> Additional Info </p>
          <a href="https://docs.wixstatic.com/ugd/858998_1fae2b5d06fa41a3ba3fcb493b349d19.pdf">
             <img src="imgs/LibraryCardVector.png" alt="library card">
          </a>
       </section>
   
</li>

<div class="popUp">
  <div>
    <div id="popUpClose"> <button type="button" class="btn">X</button></div>    
  </div>
  <div id="moreInfo">
    <!--WILL BE FILLED IN WITH <section class="hide"> DATA ABOVE-->
  </div>
</div>  

Ответ №2:

У вас есть следующий код

 <a href="#">
  <a href="#"></a>
</a>
  

Недопустимо иметь вложенные привязки в HTML. Таким образом, браузер разбивает его при рендеринге. Вот почему вы видите, что это странно.

Вам нужно будет вставить всплывающий код за пределы элемента.

 <a class="popUpTrigger" href="#">
   Get a Library Card
</a>
<section class="hide">
  <p>Foo</p>
  <a href="#">Bar</a>
</section>
  

и ссылайтесь на него с помощью next()

 $(".popUpTrigger").on("click", function (e) {
  e.preventDefault();
  var anchor = $(this);
  anchor.next('section').toggleClass("hide");
});