У меня проблема с событиями jQuery.jQuery событие срабатывает несколько раз
Прежде всего позвольте мне объяснить настройку страницы:
Главный-page.php состоит из:
а) заголовок (где логотип)
б) в навигационной панели (где различные варианты:)
с) динамическим контентом площадь (где будет загружено содержание щелкнутого элемента на панели навигации)
г) нижний колонтитул
Допустим, что navbar состоит из | ГЛАВНАЯ | СООБЩЕНИЯ | О КОМПАНИИ | ...
Содержимое HOME - это отдельный PHP-файл с отдельным CSS и JS-файлом. То же самое касается всех выборов.
Как только я выбираю HOME (например), я удаляю любой контент из области DYNAMIC CONTENT, и я размещаю содержимое HOME с помощью AJAX. В то же время я удаляю файлы CSS/JS, связанные с предыдущим контентом, и я связываю файлы CSS/JS, связанные с загруженным. Эта часть работает отлично.
Теперь, если я переключаюсь с одного выбора на другой (можно сказать, из HOME -> СООБЩЕНИЯ -> О НАС, а затем обратно в ДОМОЙ), если я нажму на кнопку внутри ДОМОЙ, он убьет событие несколько раз. Это еще хуже, если это событие вызывает вызов AJAX на сервере (предположим, что вы вызываете сервер 5 раз вместо 1).
** Причина, по которой я использую событие on() для элемента с классом радиоэлемента, является потому, что это будущий элемент DOM. Первоначально этот элемент отсутствует на странице.
Образец JS кода:
$(document).on('click', '.radio-element', function(){
$.ajax({
url: "js/ajax/ajaxcall.php",
success: function(output){
$('#ajaxcall-container').html(output);
}
});
});
Что я сделать это, как только я нажимаю элемент с классом радио-элемента, я иду на сервере, и я принести выход ajaxcall. скрипт php.
Наблюдая вкладку NETWORK внутри INSPECT ELEMENT, я вижу, что событие click вызывает вызов AJAX несколько раз. Несколько раз 2, другой 3 или даже 5.
Что я сделал, чтобы решить эту проблему (не из них работает 100%):
A) синхронизироваться событие, прежде чем его связывания с использованием «от»
$(document).off('click','.radio-element').on('click', '.radio-element', function(){ .... });
B) Использование события. stopImmediatePropagation()
$(document).on('click', '.radio-element', function(event){
event.stopImmediatePropagation();
//rest of code
});
Ниже решение, которое я еще не пробовал, так как я прочитал в статье, что это не остановит процесс связывания событий, он просто будет предотвратить многократное выполнение событий (не знаю, если это вызовет другие проблемы).
$(document).on('click', '.radio-element', function(event){
if(event.handled !== true)
{
//Code goes here
event.handled = true;
}
});
Проблема с многократным обжигом событий является то, что есть AJAX вызовы, которые выполняют действия, которые не должны выполняться более одного раза (например, отправить по электронной почте клиентам).
Кроме того, это поведение (срабатывание нескольких событий) не является чем-то, что я могу предсказать. Иногда он отлично работает, некоторые другие он запускает событие 5 раз подряд.
Я искал в сети в течение недели, но все, что я пробовал, не решило проблему. Любое решение будет высоко оценено :)
Спасибо!
вы пробовали '.one ('нажмите')' вместо '.on ('нажмите')' ? –
это SPA? Похоже, у вас может быть некоторый кешированный javascript. Попытайтесь обновить страницу и нажмите и посмотрите, сколько раз вы вызываете элемент. В основном мне интересно, если файл, который связывает эту функцию щелчка, отображается на странице более одного раза. – ajmajmajma
Нет, я не пробовал один(), потому что я хочу, чтобы иметь возможность выбрать его снова и выполнить одно и то же действие. Например, если это событие привязано к выбору переключателя .. – christostsang