Javascript функция выполняется слишком много раз - PullRequest
0 голосов
/ 07 сентября 2018

Так я заполняю таблицу У меня возникли проблемы с плагином datatables для jquery. Таблица заполняется динамически, у меня есть 3 столбца с текстом и четвертый столбец, который состоит из кнопки удаления и редактирования. Для кнопки редактирования у меня есть модал, и если я подтверждаю изменения, это действительно меняет конкретную строку в таблице. Однако, если я нажимаю несколько кнопок редактирования и отменяю, когда я на самом деле хочу изменить одну, она изменяет все ранее отмененные строки. Вот соответствующий код:

$("#example").on("click", ".edit-button", function() {
  $("#edit-modal").modal("show");
  saveChanges(this);
});
function saveChanges(k) { 
  $("#edit-confirm").click(function() {
  $(".itm-loader-modal").show();
  setTimeout(function() {editJob(k);},1000); 
  });
}
function editJob(currentButton) {
  $(".itm-loader-modal").fadeOut("slow");
  var editedName = $("#job-name").val();
  var editedDescription = $("#job-description").val();
  var editedCompany = $("#job-company").val();
  var data = {
   "name":editedName,
   "description": editedDescription,
   "company": editedCompany
  };
  var currentLine = $(currentButton).parent().parent().children(); 
  currentLine.eq(0).text(data.name);
  currentLine.eq(1).text(data.description);
  currentLine.eq(2).text(data.company);
  $("#edit-modal").modal("hide");
}

Ответы [ 2 ]

0 голосов
/ 07 сентября 2018

поэтому, когда вы вызываете saveChanges, он назначает обработчик событий для "#edit-confirm", все эти обработчики событий выполняются одновременно,

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

$(this).find('#edit-confirm').click(function() {
/...
})
0 голосов
/ 07 сентября 2018

Трудно сказать наверняка, но одна мысль, которая выглядит неправильно, заключается в том, что каждый раз, когда вызывается saveChanges, вы регистрируете нового прослушивателя событий на кнопке #edit-confirm.

После нажатия #edit-confirm будут выполняться все зарегистрированные обработчики событий - по одному на каждый .edit-button щелчок.

Вместо этого вы, вероятно, захотите иметь один обработчик кликов #edit-confirm и найти способ передать информацию о строке, которая в данный момент редактируется.

Приветствие.

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