jQuery не работает при щелчке класса элемента - PullRequest
0 голосов
/ 20 сентября 2018

Следующий скрипт не работает на моей HTML-странице, любые предложения:

$(document).ready(function() {
    $('li.nf-next-item').click(function() {
        $(".step-1").removeClass('displayBlock').addClass('displayNone');
        $(".step-2").removeClass('displayNone').addClass('displayBlock');
    });
});

Jquery также добавлен в файл. (<script type="text/javascript" src="<?php bloginfo('template_directory'); ?>/js/jquery.js"></script>)

Ниже приведен HTML-код,он находится в файле .php (на самом деле это тема WordPress):

<div class="sidebar-header">
            <div class="step-1 displayBlock">
                <h2 class="formTitle"> <?php the_field('title_step_1') ?></h2>
                <h3> <?php the_field('text_step_1') ?></h3>
            </div>
            <div class="step-2 displayNone">
                <h2 class="formTitle"><?php the_field('title_step_2') ?></h2>
                <h3> <?php the_field('text_step_2') ?></h3>
            </div>
        </div>

Ответы [ 3 ]

0 голосов
/ 20 сентября 2018

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

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

Например:

$('.sidebar-header').on('click', 'li.nf-next-item', function(){
  $(".step-1").removeClass('displayBlock').addClass('displayNone');
  $(".step-2").removeClass('displayNone').addClass('displayBlock');
})     

Вы также можете обернуть весь код в функцию, проверить, существует ли элемент, к которому вы привязываетесь, и, если нет, подождать некоторое время и запуститьфункционировать снова.Пример:

function binderCallback() {
  $(".step-1").removeClass('displayBlock').addClass('displayNone');
  $(".step-2").removeClass('displayNone').addClass('displayBlock');
}
function scriptBinder() {
  if ($('.sidebar-header').is('.sidebar-header')) {
    $('.sidebar-header').on('click', 'li.nf-next-item', binderCallback);
  } else {
    setTimeout(() => {scriptBinder()}, 1000);
  }
}
$(() => { scriptBinder() });

Однако эта конструкция потенциально опасна и ее следует избегать, так как если по какой-либо причине ожидаемый элемент никогда не добавляется на страницу, ваш скрипт будет продолжать называть себя вечно,Одна из мер безопасности заключается в том, чтобы поместить в функцию итератор и позволить ему вызывать себя конечное число раз.Пример, который прекращает попытки связывания после 10 попыток, сделанных с интервалом в 1 секунду:

let binderCounter = 0, 
    binderCallback = function() {
      $(".step-1").removeClass('displayBlock').addClass('displayNone');
      $(".step-2").removeClass('displayNone').addClass('displayBlock');
    };

function scriptBinder() {
  if ($('.sidebar-header').is('.sidebar-header')) {
    $('.sidebar-header').on('click', 'li.nf-next-item', binderCallback);
  } else {
    if (binderCounter++ < 10)
      setTimeout(() => {scriptBinder()}, 1000);
  }
}
$(() => { scriptBinder() });

Другая альтернатива вышеприведенному - привязка к элементу, который, как вы уверены, существует, когда вы делаете привязку.Например, <body>:

$('body').on('click', 'li.nf-next-item', function(){
  $(".step-1").removeClass('displayBlock').addClass('displayNone');
  $(".step-2").removeClass('displayNone').addClass('displayBlock');
})

Хотя вышеприведенное, безусловно, будет работать (если, конечно, ваш li.nf-next-item верен), он меньше оптимального.
Как указано в их документация :

Присоединение множества делегированных обработчиков событий в верхней части дерева документа может снизить производительность.Каждый раз, когда происходит событие, jQuery должен сравнивать все селекторы всех прикрепленных событий этого типа с каждым элементом в пути от цели события до верхней части документа.Для лучшей производительности прикрепляйте делегированные события в месте расположения документа как можно ближе к целевым элементам.Избегайте чрезмерного использования document или document.body для делегированных событий в больших документах.

0 голосов
/ 20 сентября 2018

Где находится HTML для кнопки или li, на который вы нажимаете кнопку?

Проверьте, является ли li.nf-next-item элементом li и этот класс (nf-next-item) добавлен к этому элементу li.Если это кнопка, не будет работать.

И если это динамический элемент, который добавляется позже, вы, вероятно, делаете это $('body').on('click', 'li.nf-next-item', function() { вместо $('li.nf-next-item').click(function() { .. И это должно работать.

0 голосов
/ 20 сентября 2018

попробуйте с:

$('li.nf-next-item').on('click', function() {
    $(".step-1").removeClass('displayBlock').addClass('displayNone');
    $(".step-2").removeClass('displayNone').addClass('displayBlock');
});

Лучше использовать .on, потому что использует меньше памяти и работает с динамически добавленными элементами.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...