2014-02-10 4 views
0

Я написал основную систему комментариев, которая представляет собой простую форму для записи в базу данных, и она также использует ajax.Остановить запрос ajax от публикации данных до получения ответа?

Проблема в том, что если я введу свое сообщение, а затем отправлю спам/ключ ввода, он, кажется, складывается, а затем все записывается в базу данных несколько раз.

Мой Аякс, как так:

$(document).ready(function(){ 
$(document).on('submit', '.addcomment', function() { 
    var $targetForm = $(this); 

$.ajax({ 
type: "POST", 
url: "process/addcomment.php", 
data: $targetForm.serialize(), 
dataType: "json", 
success: function(response){ 
    if (response.databaseSuccess == true) { 
     $("#container").load("#container"); 
     $targetForm.find('#addcommentbutton').attr("disabled", true); 
    } 
    else { 
     $ckEditor.after('<div class="error">Something went wrong!</div>'); 
    } 
} 
}); 

    return false; 
    }); 
}); 

Кнопка представить действительно стала инвалидом, но форма еще может быть введена с помощью ввода кнопки клавиатуры или даже еще с массовым спамом на кнопке отправки (которая должен быть отключен)

Есть ли способ 100% отключить эту форму с помощью jquery, пока не будет получено сообщение об успешном JSON?

Больше коментарий просто дайте мне знать!

+0

Вы можете использовать JQuery представить событие и проверить, чтобы увидеть, если переменная с вашего AJAX было установлен на «true», и если он затем разрешит submit(); проходить через. –

+2

, вы отключите кнопку отправки слишком поздно, для одного. –

ответ

1

В этом случае я бы не использовал делегирование. Вместо этого я привяжу событие непосредственно к форме с помощью .one, так как каждая форма должна быть отправлена ​​только один раз (если это так). Если у вас вместо этого есть только одна форма addComment, я задаю вопрос, почему вы используете делегирование в первую очередь.

$(commentForm).appendTo(selector).one("submit",function(e){ 
    e.preventDefault(); // prevent this submit 
    $(this).submit(false); // prevent future submits 
    // submit data to server 

}) 
+0

Этот метод, вероятно, лучший, поскольку событие будет запускаться только один раз.Единственное, о чем не упоминал @KevinB, вам нужно будет добавить событие снова после запроса ajax. – tftd

+0

хорошо пункт. Я был в предположении, что форма будет удалена в этот момент, но это не указано в коде в вопросе. Если вы добавляете форму комментария при нажатии «добавить комментарий», я ожидаю, что он исчезнет после добавления комментария. –

+0

Бинго! Спасибо, используется так: $ ('. Formclass'). One ("submit, function (e) { Я также поместил код отключенного атрибута сразу после этого, чтобы физически показать, что форма была отключена. Затем, когда комментарии загруженный через .load(), он запускается снова и активируется. Еще один вопрос: было бы целесообразно добавить sleep(), скажем, 2 секунды в PHP-код, чтобы предотвратить попытки спама furthur? – Lovelock

0

Просто следить, если запрос находится в процессе:

$(document).ready(function(){ 
    var isSubmitting = false; 
    $(document).on('submit', '.addcomment', function() { 
    var $targetForm = $(this); 
    if (!isSubmitting) { 
     isSubmitting = true; 
     $.ajax({ 
     ... 
     success: function(response){ 
      ... 
     }, 
     complete: function() { isSubmitting = false; } 
     }); 
    } 
    }); 
0

Есть много способов, чтобы справиться с этим, но лучше всего включает в себя проверку данных на стороне сервера. Вы хотите, чтобы люди не перегружали базу данных непреднамеренно (проблема «толстого пальца») или преднамеренно (скучный сценарий kiddie, который решает сбой вашего сервера или заполнять вашу базу данных мусором).

Лучшее решение:

  • Генерация одноразовой фишки при запросе страницы (так называемой «одноразовым»)
  • сообщением, что нонс когда вы размещаете данные
  • только принять его на на стороне сервера, если nonce никогда не использовался

Это, очевидно, требует от вас отслеживания списка допустимых несетов, но это предотвращает любые сбои или злоупотребление кнопкой отправки.

Кроме того, как указывали другие, отключите кнопку намного раньше и только запустите обработчик событий отправки один раз. Это поможет с непреднамеренными двойными щелчками и т. Д., Но вам также необходимо использовать nonce для предотвращения компульсивных кликов или преднамеренного неправильного использования.

0

Вы можете сделать это, как показано ниже:

$(document).ready(function(){ 
var isAjaxInProgress = null; 
$(document).on('submit', '.addcomment', function() { 
    var $targetForm = $(this); 
    if(isAjaxInProgress === null || !$isAjaxInProgress){ 
     isAjaxInProgress = true; 
     $.ajax({ 
      type: "POST", 
      url: "process/addcomment.php", 
      data: $targetForm.serialize(), 
      dataType: "json", 
      success: function(response){ 
       if (response.databaseSuccess == true) { 
        $("#container").load("#container"); 
        $targetForm.find('#addcommentbutton').attr("disabled", true); 
       } 
       else { 
        $ckEditor.after('<div class="error">Something went wrong!</div>'); 
       } 
       isAjaxInProgress = false; 
      } 
     }); 
    } 

    return false; 
    }); 
}); 
0

// объявить глобальный АЯКС переменную запроса

var is_request_sent = false; 
function send_msg() 
{ 
    if(is_request_sent == false) 
    { 
     $.ajax({ 
      type: "POST", 
      url: "process/addcomment.php", 
      data: $targetForm.serialize(), 
      dataType: "json", 
      success: function(result){ 
       //alert(result); 
       is_request_sent = false; 
      }, 
      error: function(a,b,c) 
      { 
       is_request_sent = false; 
      }, 
      beforeSend: function(jqXHR, plain_jqXHR){ 
       // set request object 
       is_request_sent = jqXHR; 
       // Handle the beforeSend event   
      }, 
      complete: function(){ 
       // update global request variable 
       is_request_sent = false; 
      // Handle the complete event 
      } 
     }); 
    } 
} 
Смежные вопросы