Проблема с кол-вом запросов и кликов при ajax

Тема в разделе "Другие языки", создана пользователем yeaahhh, 23 июл 2011.

Модераторы: Цукер
  1. yeaahhh

    yeaahhh

    Регистр.:
    8 май 2008
    Сообщения:
    278
    Симпатии:
    11
    Друзья. В нескольких местах сайта стоит асинхронная передача данных. Возьмём актуальный пример - Удаление сообщения и дальнейший вычет 1 из общего кол-ва сообщений пользователя.

    Проблема: у некоторых пользователей чешутся руки(иногда такое бывает из-за небольших задержек в выполнении ajax) и они по несколько раз тыкают на удалить. В связи с этим скрипт выполняется 2 раза.. Соответственно, в скрипте-обработчике вычитается 2 сообщения из общего кол-ва.. При 3 кликах - 3..
    Как можно победить данную проблему? Есть ли какие-то способы?

    Пока в голову пришло только 1 - после клика сразу же скрывать кнопку, по которой кликает человек..

    Буду признателен за помощь.. Заранее спасибо!
     
  2. Monterpan

    Monterpan Постоялец

    Регистр.:
    3 мар 2008
    Сообщения:
    150
    Симпатии:
    27
    Например, можно в переменной хранить статус отправки запроса.

    Т.е. при отправке запроса ставить его в true, при получении результата в false.
    При отправке новых запросов - проверять статус на true, и такие не отправлять.
     
  3. yeaahhh

    yeaahhh

    Регистр.:
    8 май 2008
    Сообщения:
    278
    Симпатии:
    11
    Если вы про файл-обработчик, то так и делаю. Но почему-то всёравно несколько запросов делает..
     
  4. zavu

    zavu

    Регистр.:
    24 сен 2010
    Сообщения:
    180
    Симпатии:
    14
    генерация кода в сессии до и после клика и сравнение этих двух кодов. Почитайте тут последние сообщения, я как раз примерно такое пытаюсь у себя сделать: https://www.nulled.cc/showthread.php?t=213983&page=2 может, поможет =)
     
  5. NiXiN

    NiXiN Создатель

    Регистр.:
    17 июл 2011
    Сообщения:
    34
    Симпатии:
    9
    Записывать в файле обработчике в сессию какое-нить значение (например id удаляемой записи) и при каждом выполнении скрипта проверять эту сессию на пустоту.
     
  6. unsiker

    unsiker

    Регистр.:
    6 июн 2008
    Сообщения:
    465
    Симпатии:
    172
    если кнопка объявлена через button то вызывать метод disable (пример для jquery: $("#button").attr(disable , true) а когда прийдет ответ $("#button").attr(disable , false)). А если не через button то попробуй перекрывать кнопку прозрачным дивом у которого z-index больше
     
    yeaahhh нравится это.
  7. Black#FFFFFF

    Black#FFFFFF

    Регистр.:
    19 июл 2007
    Сообщения:
    174
    Симпатии:
    107
    в обработчике ajax использовать глобальный статус, определенный через window.aStatus (или просто переменную без слова var) или другую глобальную переменную, добавив к ней, например, айди сообщения в название, можно аттачить дополнительный атрибут к ссылке/кнопке со значением. Устанавливать в true в случае первого запроса, и в false в случае обработки запроса, при возвращении результата ajax в функции - обработчике устанавливать в false обратно, проверять статус. Можно просто вести глобальный массив айди обработанных сообщений, и проверять на наличие в нем данных. Если кнопка является ссылкой (html элементом а), а значение атрибута href используется, как адрес ajax запроса, сбрасывать ее на время выполнения запроса, хранить оригинальную ссылку, например, в data-href. В случае с input type button, button и т.п. использовать атрибут disabled. А также в скрипте - обработчике проверять существование самого сообщения.

    Но, лучше всего обработать ситуацию со стороны сервера:

    В скрипте - обработчике ajax запроса сделать не -1, а подсчитать актуальным запросом количество сообщений в нужной таблице. Это вернее всего поможет решить проблему. И записать обновленное значение.
     
    ILKABU нравится это.