JQuery onClick работает только один раз

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

Группа кнопок выглядит так:

<div class = "btn-toolbar" role = "toolbar" aria-label = "Voting Toolbar">
    <div class = "leanVote_target">
        <div class = "btn-group mr-2" role = "group" aria-label = "Lean Votes">
            <button type = "button" id = "2_-3" {% if vote.leanVote == -3 %} class = "voteButton btn-sm btn-success"{% else %} class = "voteButton btn-sm btn-primary"{% endif %}>Left</button>
            <button type = "button" id = "2_-2" {% if vote.leanVote == -2 %} class = "voteButton btn-sm btn-success"{% else %} class = "voteButton btn-sm btn-primary"{% endif %}>2</button>
            <button type = "button" id = "2_-1" {% if vote.leanVote == -1 %} class = "voteButton btn-sm btn-success"{% else %} class = "voteButton btn-sm btn-primary"{% endif %}>1</button>
            <button type = "button" id = "2_0" {% if vote.leanVote == 0 %} class = "voteButton btn-sm btn-success"{% else %} class = "voteButton btn-sm btn-primary"{% endif %}>Center</button>
            <button type = "button" id = "2_1" {% if vote.leanVote == 1 %} class = "voteButton btn-sm btn-success"{% else %} class = "voteButton btn-sm btn-primary"{% endif %}>1</button>
            <button type = "button" id = "2_2" {% if vote.leanVote == 2 %} class = "voteButton btn-sm btn-success"{% else %} class = "voteButton btn-sm btn-primary"{% endif %}>2</button>
            <button type = "button" id = "2_3" {% if vote.leanVote == 3 %} class = "voteButton btn-sm btn-success"{% else %} class = "voteButton btn-sm btn-primary"{% endif %}>Right</button>
        </div>
    </div>
</div>

Таким образом, это будет основная кнопка, если она не выбрана, и кнопка успеха, если она выбрана. Затем у меня есть следующий код JQuery:

<script>
    function sendVote(id, type, vote) {
        $.ajax({
            url:'/webproxy/v/?i=c&pk=' + id + '&t='+type+'&v='+vote,
            type:'get',
            dataType:'html',
            crossDomain:true,
            success:function(data) {
                if (type == 2) {
                    $(".leanVote_target").html(data);
                } else if (type == 1) {
                    $(".credVote_target").html(data);
                } else if (type == 3) {
                    $(".controlVote_target").html(data);            
                }
            },
            error: function(data) {
                return data;
                //$(".leanVote_target").html(data);
            }
        });
    }

    $(document).ready(function(){
        $(".btn-group").on("click", '.voteButton', function( event ) {
            var parts = event.target.id.split("_");
            sendVote({{comment.id}}, parts[0], parts[1]);
        });
    });
</script>

Это правильно отправляет голос / webproxy / v / при первом щелчке. Затем сценарий в / webproxy / v / возвращает идентичный btn-group, но с обновленным цветом, чтобы показать последнее голосование. Я могу подтвердить, что это работает, обновления цвета, обновления базы данных, и я вижу запрос в журналах моего веб-сервера. При втором щелчке событие не срабатывает. Я попытался выполнить console.info('hello world') внутри события on-click, и поэтому я уверен, что именно на том уровне, на котором у меня возникла ошибка. Событие on-click не срабатывает при втором щелчке, поэтому, если я выберу 1, а затем выберу 2, я должен увидеть 2 запроса к серверу и 2 срабатывания событий щелчка, но это не так.

Вот результат возврата сценария / webproxy / v / после нажатия на 2:

<div class = "btn-group mr-2" role = "group" aria-label = "Lean Votes">
    <button type = "button" id = "2_-3"  class = "voteButton btn-sm btn-primary">Left</button>
    <button type = "button" id = "2_-2"  class = "voteButton btn-sm btn-primary">2</button>
    <button type = "button" id = "2_-1"  class = "voteButton btn-sm btn-primary">1</button>
    <button type = "button" id = "2_0"  class = "voteButton btn-sm btn-primary">Center</button>
    <button type = "button" id = "2_1"  class = "voteButton btn-sm btn-primary">1</button>
    <button type = "button" id = "2_2"  class = "voteButton btn-sm btn-success">2</button>
    <button type = "button" id = "2_3"  class = "voteButton btn-sm btn-primary">Right</button>
</div>

Почему при этом не регистрируется .on('click') и как заставить его отвечать неограниченное количество раз?

Спасибо.

Когда вы заменяете элементы DOM новыми элементами DOM, вы также удаляете привязки, которые были на исходных элементах DOM.

Daniel Beck 18.05.2018 19:40
Поведение ключевого слова "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) для оценки ваших знаний,...
0
1
56
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий
$(".btn-group").on("click", '.voteButton', function( event ) {

Привязка вашего делегата находится в группе btn, но похоже, что вы динамически создаете группы btn. Делегат привязывает выше к чему-то, что не создается динамически.

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

$(".leanVote_target, .credVote_target, .controlVote_target").on("click", '.btn-group .voteButton', function( event ) {

$ (". voteButton"). on ("click", function (event) {должно работать

Akhil Aravind 18.05.2018 19:11

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

Taplar 18.05.2018 19:11

$ ("body"). on ("click", '.btn-group .voteButton', function (event) что насчет этого? он будет работать?

Akhil Aravind 18.05.2018 19:13

Конечно, это один из вариантов. Выбор более высокого элемента для привязки зависит от OP. Однако это решение должно объяснить проблему. Он также может делегировать привязку к трем элементам, которые он добавляет в html.

Taplar 18.05.2018 19:13
if (type == 2) {
    $(".leanVote_target").html(data);
} else if (type == 1) {
    $(".credVote_target").html(data);
} else if (type == 3) {
    $(".controlVote_target").html(data);            
}

Условие, приведенное выше, заменяет группу btn с помощью .html (), поэтому $ (". Btn-group"), в которую вы поместили слушателя, заменяется новой группой btn. вы можете исправить свою проблему, поместив слушателя на элемент, который не заменяется в DOM.

$(".btn-toolbar").on("click", '.voteButton', function( event ) {

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