blackseabreathe
@blackseabreathe
brackets

Почему неправильно работает функция jQuery?

Что я делаю:
у меня есть страница поиска пользователей, когда тыкаю на какого-то пользователя, то показываю инфу о нем

if($(document).find('.usersforu').length>0){ // проверка ну существование юзеров
getUserInfo_var = false, // false
complaint_var = false; // false
$(document).on('click', '.usersforu', function(){ // при клике на юзера
var username = $(this).find('.ufuName').text(); // создадим переменную с его именем
getUserInfo(username); // вызываем функцию с поиском информации о выбраним юзере, отправляем в php
}


То есть я кликнул на юзера, создал переменную с его именем и отправляю данные на php

function getUserInfo(username){ // сама ф-ия
if(getUserInfo_var) return false; // если не false, то ничего не делаем
$.ajax({ // запуск ajax
url: '/theme/userMore/userMore.php',  // путь до php
type: 'post', //post
dataType: 'json', //json
data: {username:username}, //data с именем искомого юзера из переменной username, создаваемой при клике на юзера
success: function(json){ //при успехе
if(typeof json.success !== 'undefined'){ // если из php пришло echo json_encode(['success' => '...'],
$(document).find('.innerTwo').empty(); // очистим div, в которой подгружаем инфу о юзере
$(document).find('.innerTwo').html(json.success); // вставим эту инфу
compl(); // вызов ф-ии жалобы на юзера
} else if(typeof json.error !== 'undefined'){
return $.jGrowl(json.error); // а так будем получать ответы с ошибками echo json_encode(['error' => '...'],
}
},
error: function(json, jqXHR, status, errorThrown, exception){
alert(JSON.stringify(json));
return $.jGrowl('ОШИБКА AJAX запроса: ' + status, jqXHR, json);
}
});
}


Теперь php подгрузил инфу о выбранном юзере в div, в этом div есть кнопка "пожаловаться на пользователя", функцию для этой кнопки compl() вызывали в success getUserInfo();

//жалоба на пользователя
function compl(){ // сама ф-ия
if($(document).find('#complaint').length>0){
usernameTocomplaint = $(document).find('.tuName').text(); //найдем имя пользователя из div, подгруженного первым ajax
$(document).on('click', '#complaint', function(){ // при клике на кнопку "жалоба"
$('#complaintForm').find('input[name="usernameTocomplaint"]').val(usernameTocomplaint); // в скрытый инпут формы вставим имя пользователя для отправки админу
$('#complaintForm').arcticmodal(); // вызовем модальное окно
alert($(document).find('#complaintForm').length); // вот тут интересное начиание проблемы, ниже об этом
});
}

if($(document).find('#complaintBtn').length>0){
$(document).on('click', '#complaintBtn', function(){ // при клике на кнопку "отправить жалобу"
complaintFunc(usernameTocomplaint); //вызовем ф-ию
});
}
}


//жалоба на юзера и его блокировка юзером
function complaintFunc(usernameTocomplaint){ //сама ф-ия
if(complaint_var) return false;
$.ajax({
url: '/theme/complaint/complaint.php',
type: 'post',
dataType: 'json',
data: $('form[name="complaint"]').serialize(), // сериализуем поля формы, их два (скрытое поле с ником юзера на которого жалуются и textarea с причиной жалобы)
success: function(json){
if(typeof json.success !== 'undefined'){ // если успех
complUserHide(); // то вызовем ф-ия, которая спрячет юзера, на которого пожаловались на странице, типа $('#user').hide();
$.jGrowl(json.success);
} else if(typeof json.error !== 'undefined'){
$.jGrowl(json.error);
}
},
error: function(json, jqXHR, status, errorThrown, exception){
alert(JSON.stringify(json));
return $.jGrowl('ОШИБКА AJAX запроса: ' + status, jqXHR, json);
}
});
}


Проблема в следующем, я при тестах php увидел что любое сообщение об ошибке/успехе появляется несколько раз, затем я вверху php написал exit();, далее пошел в jquery и тут обнаружил следующее:

Я тыкнул на юзера, все ок, далее тыкаю "пожаловаться", и при клике на "пожаловаться", сделал alert('кол-во форм пожаловаться на юзера');. Alert всегда показывает 1. НО. Alert будет показываться ровно столько раз сколько ты кликнул на юзера, не важно на одного и того же или разных.

Тыкаешь на юзера->тыкаешь пожаловаться->alert 1 раз,
Тыкаешь на юзера другого или этого же 2-ой раз->тыкаешь пожаловаться->alert 2 раза,
Тыкаешь на юзера другого или этого же 3-ой раз->тыкаешь пожаловаться->alert 3 раза,
и до бесконечности

Подскажите где я ошибаюсь?
  • Вопрос задан
  • 142 просмотра
Решения вопроса 1
blackseabreathe
@blackseabreathe Автор вопроса
brackets
Благодаря ответам ребят пришел к правильной мысли, в общем решил так:

при клике на юзера на странице определяю переменную
usernameTocomplaint = false;

теперь

function compl(){
if(usernameTocomplaint) return false;
usernameTocomplaint = username; // применили уже готовое свойство в новой переменной чтобы два раза один и тот же код не писать
...
}


Все работает как часы.

Всем спасибо за Ваше терпение, оно многого стоит
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 2
@r_g_b_a
У вас после выполнения ajax-запроса вызывается функция compl(); в которой каждый раз регистрируется новый обработчик.
Ответ написан
SilenceOfWinter
@SilenceOfWinter
та еще зажигалка...
нужно вешать события на класс, а не на id и прикреплять их к контейнеру с ajax контентом, например
$('.container').on('click', '.btn-class', function () {
 ...
});
$('body').on('click', '.nav-link', function (event) {
 ...
});

тогда не нужно будет каждый раз по новой вешать события
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы