Функция Onclick не работает после добавления класса с JQuery - PullRequest
0 голосов
/ 08 ноября 2019

С JQuery я добавил класс к 8 ссылкам. Теперь я хочу, чтобы, если вы нажмете на нее, команда была выполнена. В этом проблема, потому что она не работает.

Я что-то здесь не так сделал? или это просто невозможно?

Мой JQuery:

(function ($) {
    $(document).ready(function() {
    $('ul.dropdown-menu').find('a').addClass('filterchoice');
});

  $(".filterchoice").on("click", function(event){
    event.stopPropagation();
    event.stopImmediatePropagation();
    console.log('Working');
});
})(jQuery); 

И мой HTML:

<div class="ticket-filter" id="ticket-filter-container">
  <div id="ticket-toolbar">
    <div class="dropdown" id="ticket-filters">
      <a href="#" class="list-lead dropdown-toggle" data-toggle="dropdown">
        All Tickets <i class="caret"></i>
      </a>
      <ul class="dropdown-menu " role="menu" aria-labelledby="dropdownMenu">
        <li class="selected">
        <span class="icon ticksymbol"></span>
        <a href="#" data-loading-box="#ticket-list" data-method="get" data-remote="true" data-response-type="script">All Tickets</a>
        </li>
        <li>
        <a href="#" data-loading-box="#ticket-list" data-method="get" data-remote="true" data-response-type="script">Open or Pending</a>
        </li>
        <li
        ><a href="#" data-loading-box="#ticket-list" data-method="get" data-remote="true" data-response-type="script">Resolved or Closed</a>
        </li>
      </ul>
    </div>
    <div id="ticket-sub-toolbar">
      <span id="ticket-sort" class="dropdown">
        <ul class="dropdown-menu " role="menu" aria-labelledby="dropdownMenu">
          <li class="selected">
          <span class="icon ticksymbol"></span>
          <a href="#" data-loading-box="#ticket-list" data-method="get" data-remote="true" data-response-type="script">Date Created</a>
          </li>
          <li>
          <a href="#" data-loading-box="#ticket-list" data-method="get" data-remote="true" data-response-type="script">Last Modified</a>
          </li>
          <li>
          <a href="#" data-loading-box="#ticket-list" data-method="get" data-remote="true" data-response-type="script">Status</a>
          </li>
          <li class="divider"></li>
          <li>
          <a href="#" data-loading-box="#ticket-list" data-method="get" data-remote="true" data-response-type="script">Ascending</a>
          </li>
          <li class="selected">
          <span class="icon ticksymbol"></span>
          <a href="#" data-loading-box="#ticket-list" data-method="get" data-remote="true" data-response-type="script">Descending</a>
          </li>
        </ul>
        <a class="dropdown-toggle help-text" data-toggle="dropdown" href="#">
          Sorted by <b> Date Created</b>
          <i class="caret"></i>
        </a>
      </span>
    </div>
  </div>
</div>

Я делаю этот сайт с Freshdesk, я не могу изменить этот кодсебя. Это код в Freshdesk:

{% snippet ticket_filters %}

Я не знаю, можете ли вы использовать это, но Freshdesk использует жидкий Template Engine

Я также сделал скрипку

1 Ответ

0 голосов
/ 08 ноября 2019

Если вы напишите свою функцию следующим образом: jQuery("selector").on('click', function() {}), то jQuery свяжет обработчики событий с текущими доступными объектами, которые он выбирает с помощью селектора .

Если вы хотитеобрабатывать динамически добавленные селекторы, тогда вы должны использовать немного более подробный синтаксис: jQuery("staticSelector").on('click', 'dynamicSelector', function() {}).

В вашем случае разница минимальна:

$("body").on("click", ".filterchoice", function() {
  alert("Handler for .click() called.");
});

Привязать ваш обработчик кликов к<body> (это, безусловно, существует), а затем всегда реагирует на любое событие щелчка на .filterchoice.

Это в документации jQuery: https://api.jquery.com/on/#on-events-selector-data-handler

Пример на странице, на которую ссылается страница документации jQuery:

Подход к делегированию события прикрепляет обработчик события только к одному элементу, tbody, и событие должно всплыть только на один уровень (от нажатой tr до tbody):

$ ("#dataTable tbody") .on ("click", "tr", function () {console.log ($ (this) .text ());});

Вот ваша скрипка, импортированная во фрагмент и измененная, как описано выше:

(function($) {
  $(document).ready(function() {
    $('ul.dropdown-menu').find('a').addClass('filterchoice');
  });

  $("body").on("click", ".filterchoice", function() {
    alert("Handler for .click() called.");
  });
})(jQuery);
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<div class="ticket-filter" id="ticket-filter-container">
  <div id="ticket-toolbar">
    <div class="dropdown" id="ticket-filters">
      <a href="#" class="list-lead dropdown-toggle" data-toggle="dropdown">
        All Tickets <i class="caret"></i>
      </a>
      <ul class="dropdown-menu " role="menu" aria-labelledby="dropdownMenu">
        <li class="selected">
          <span class="icon ticksymbol"></span>
          <a href="#" data-loading-box="#ticket-list" data-method="get" data-remote="true" data-response-type="script">All Tickets</a>
        </li>
        <li>
          <a href="#" data-loading-box="#ticket-list" data-method="get" data-remote="true" data-response-type="script">Open or Pending</a>
        </li>
        <li><a href="#" data-loading-box="#ticket-list" data-method="get" data-remote="true" data-response-type="script">Resolved or Closed</a>
        </li>
      </ul>
    </div>
    <div id="ticket-sub-toolbar">
      <span id="ticket-sort" class="dropdown">
        <ul class="dropdown-menu " role="menu" aria-labelledby="dropdownMenu">
          <li class="selected">
          <span class="icon ticksymbol"></span>
      <a href="#" data-loading-box="#ticket-list" data-method="get" data-remote="true" data-response-type="script">Date Created</a>
      </li>
      <li>
        <a href="#" data-loading-box="#ticket-list" data-method="get" data-remote="true" data-response-type="script">Last Modified</a>
      </li>
      <li>
        <a href="#" data-loading-box="#ticket-list" data-method="get" data-remote="true" data-response-type="script">Status</a>
      </li>
      <li class="divider"></li>
      <li>
        <a href="#" data-loading-box="#ticket-list" data-method="get" data-remote="true" data-response-type="script">Ascending</a>
      </li>
      <li class="selected">
        <span class="icon ticksymbol"></span>
        <a href="#" data-loading-box="#ticket-list" data-method="get" data-remote="true" data-response-type="script">Descending</a>
      </li>
      </ul>
      <a class="dropdown-toggle help-text" data-toggle="dropdown" href="#">
          Sorted by <b> Date Created</b>
          <i class="caret"></i>
        </a>
      </span>
    </div>
  </div>
</div>

Вам не нужно реструктурировать свой код.

Хотя я думаю, что @RoryMcCrossan прав - ваш код должен быть немного реструктурирован,это не из-за этой проблемы. Когда вы динамически загружаете данные или добавляете элемент DOM, реструктуризация не решит вашу «неработающую» проблему, но делегированный обработчик будет (поэтому вам придется использовать более подробный синтаксис).

...