2015-07-23 3 views
1

У меня довольно стандартный вызов ajax для обновления в реальном времени, однако я говорю, что я называю ajax, все хорошо, но скажу, что я хочу позвонить ему снова, на этот раз я буду get 2 вызывает, и если я попробую еще раз, то у меня будет 3, я могу проверить это, вызывая и предупреждая и с помощью Network DevCon of Chrome, любую идею, почему это происходит?Последовательные вызовы AJAX добавляют дополнительный последовательный вызов

PS: Я использую Laravel 5.1

$('button[name=act]').click(function() { 
    var icon = $(this).closest('div.thumbnail').find('i'); 

    $(document).ajaxStart(function() { 
     icon.show(); 
    }); 

    $("form").submit(function (e) { 

     e.preventDefault(); 

     var formData = new FormData($(this)[0]); 

     $.ajax({ 
      url: "ajax/acttdb", 
      data: formData, 
      dataType: "json", 
      type: "POST", 
      cache: false, 
      contentType: false, 
      processData: false, 
      success: function (data, status, jqXhr) { 
       $(icon).fadeIn(function() { 
        $(this).removeClass('fa-spinner fa-spin').addClass('fa-check text-success').fadeOut(1000, function() { 
         $(this).removeClass('fa-check text-success').addClass('fa-spinner fa-spin'); 
        }); 
       }); 
      }/*, 
       error: function (jqXhr, textStatus, errorThrown) { 
       console.log("Error response:", jqXhr.responseText); 
       }*/ 
     }); 
    }); 
}); 
+1

Ваши кронштейны не сбалансированы. – Barmar

+0

На самом деле, они есть, но спасибо, что я не заметил на пасте – Jofran

ответ

1

Причина это происходит потому, что вы подмену отправки события функции каждый раз, когда нажата кнопка, которая приводит к нескольким копиям функции. Просто вытащите его из клика даже, и если вы хотите принудительно отправить отправить по клику, вы можете вызвать функцию submit() без параметров для запуска события.

Попробуйте следующее:

$(function(){ 
    $('button[name=act]').click(function(){ 
     var icon = $(this).closest('div.thumbnail').find('i'); 

     $(document).ajaxStart(function() 
     { 
      icon.show(); 
     }); 

     $("form").submit(); //This submits the form on click 
    }); 

    //This binds the function, so it should only be called once. 
    $("form").submit(function (e) 
    { 
     e.preventDefault(); 

     var formData = new FormData($(this)[0]); 

     $.ajax({ 
      url: "ajax/acttdb", 
      data: formData, 
      dataType: "json", 
      type: "POST", 
      cache: false, 
      contentType: false, 
      processData: false, 
      success: function (data, status, jqXhr) 
      { 
       //BLAH 
      } 
     }); 
    }); 
}); 

я заметил две другие вещи, которые вы, возможно, захотите обратиться. Вы хотите как-то обновить значок после его загрузки. Вам нужно будет найти другой способ поиска значка внутри функции успеха (возможно, просмотр данных, которые вернулись, может дать некоторую информацию, которая может быть полезна. Поскольку это json, ее необходимо легко обновить.)

Кроме того, способ, которым вы в настоящее время располагаете, будет привязан ко всем формам на странице. Если у вас есть несколько форм на странице, вы, вероятно, захотите изменить селектор на использование идентификатора.

Надеюсь, это поможет!

+0

Спасибо! Это заставило меня понять, что я слишком усложняю, и мне не нужна функция button.click, я мог легко найти значки, так как форма является верхней DOM, а вместо того, чтобы перейти от кнопки к форме и затем спуститься вниз , Мне просто нужно позвонить $ (это) и спуститься дважды, еще раз спасибо! – Jofran

+0

У меня также есть еще две кнопки, но мне нужен только один акт, так как я ajax'ing img, а второй 2 просто обновляют столбец, поэтому FormData не нужен, поэтому 1 тип submit и 2 типа кнопки :) , – Jofran

+1

Рад, что это помогло.Один проект, который я видел, где можно было отображать несколько значков загрузки, но только один из них будет активен одновременно - добавить класс для группировки всех значков вместе, вы применяете класс «загрузка» к тому, который загружается, а затем, когда вы закончите, вы просто выберите их все и удалите класс загрузки (jQuery не будет жаловаться, если вы удалите класс, и он не существует. – techdude

0

Основываясь на дополнительных звонках и мое гадание, я должен сказать, что вы печатаете этот код каждый раз, когда вы делаете (AJAX) вызов, что приводит к свяжите ваш form элемент снова в каждом вызове. Я прав?

JO.

+0

Извините, я вставил неправильный код, теперь он исправлен; Ajax вызывается, когда я нажимаю кнопку «Отправить», после чего я звоню, когда отправляется форма, я помешал ей отправить и THEN вызовет ajax. – Jofran

2

Проблема заключается в том, что каждый раз, когда вы нажимаете на кнопку act вы звоните $("form").submit(), which adds another представить handler to the form. So if you click on the кнопку act` 3 раза, а затем нажмите на кнопку отправки формы, он будет посылать 3 AJAX запросы.

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

var icon; 

$(document).ajaxStart(function() { 
    if (icon) { 
     icon.show(); 
    } 
}); 

$('button[name=act]').click(function() { 
    icon = $(this).closest('div.thumbnail').find('i'); 
}); 

$("form").submit(function (e) { 
    e.preventDefault(); 
    var formData = new FormData($(this)[0]); 
    $.ajax({ 
     url: "ajax/acttdb", 
     data: formData, 
     dataType: "json", 
     type: "POST", 
     cache: false, 
     contentType: false, 
     processData: false, 
     success: function (data, status, jqXhr) { 
      if (icon) { 
       icon.fadeIn(function() { 
        $(this).removeClass('fa-spinner fa-spin').addClass('fa-check text-success').fadeOut(1000, function() { 
         $(this).removeClass('fa-check text-success').addClass('fa-spinner fa-spin'); 
        }); 
       }); 
      } 
     }/*, 
      error: function (jqXhr, textStatus, errorThrown) { 
      console.log("Error response:", jqXhr.responseText); 
      }*/ 
    }); 
}); 
+0

Это хороший ответ, но techdude мне очень помог, в любом случае, спасибо! – Jofran

Смежные вопросы