Обеспечить динамический клик и избежать дублирования вызова событий - PullRequest
1 голос
/ 25 февраля 2020

Я пытаюсь добавить элемент, как в следующем примере: https://codepen.io/Gobi_Ilai/pen/LLQdqJ

var addToMenu = function () {
  var newName = $("#addInputName").val();
  var newSlug = $("#addInputSlug").val();
  var newId = 'new-' + newIdCount;

  nestableList.append(
    '<li class="dd-item" ' +
    'data-id="' + newId + '" ' +
    'data-name="' + newName + '" ' +
    'data-slug="' + newSlug + '" ' +
    'data-new="1" ' +
    'data-deleted="0">' +
    '<div class="dd-handle">' + newName + '</div> ' +
    '<span class="button-delete btn btn-danger btn-xs pull-right" ' +
    'data-owner-id="' + newId + '"> ' +
    '<i class="fa fa-times" aria-hidden="true"></i> ' +
    '</span>' +
    '<span class="button-edit btn btn-success btn-xs pull-right" ' +
    'data-owner-id="' + newId + '">' +
    '<i class="fa fa-pencil" aria-hidden="true"></i>' +
    '</span>' +
    '</li>'
  );

  newIdCount++;

  // update JSON
  updateOutput($('#nestable').data('output', $('#json-output')));

  // set events
  $("#nestable .button-delete").on("click", deleteFromMenu);
  $("#nestable .button-edit").on("click", prepareEdit);
};


 var deleteFromMenu = function () {
            var targetId = $(this).data('owner-id');
            var target = $('[data-id="' + targetId + '"]');
            var textConfirm = "Are you sure to delete" + target.data('name') + " ?";

                var result = confirm(textConfirm);
                if (!result) {
                    return;
                }

            // Remove children (if any)
            target.find("li").each(function () {
                deleteFromMenuHelper($(this));
            });

            // Remove parent
            deleteFromMenuHelper(target);

            // update JSON
            updateOutput($('#nestable').data('output', $('#json-output')));

        };

И после этого пытаюсь удалить одну из записей. На странице просят подтвердить вопрос (1 + добавленная запись) раз. Например, если вы попытаетесь добавить 2 записи и попытаетесь удалить один элемент (не последний добавленный элемент), появится сообщение о подтверждении 3.

Как мне можно $("#nestable .button-delete").on("click", deleteFromMenu); увидеть только один вопрос подтверждения. Благодаря.

Ответы [ 2 ]

1 голос
/ 25 февраля 2020

Вы можете использовать removeEventListener или off(), чтобы удалить прослушиватель событий раньше.

$("#nestable .button-delete").off().on("click", deleteFromMenu);
$("#nestable .button-edit").off().on("click", deleteFromMenu);

Обновлено (Дайте лучшее решение)

Если #nestable имеет значение c, вы должны переместить событие слушателя за пределы метода addToMenu.

Формат: $(staticAncestors).on(eventName, dynamicChild, function() {});

Так что в вашем случае

// set events
  $("#nestable").on("click", '.button-delete', deleteFromMenu);
  $("#nestable").on("click", '.button-edit', prepareEdit);

var addToMenu = function () {
  ....
  // update JSON
  updateOutput($('#nestable').data('output', $('#json-output')));
};

Прочитайте следующий пост, чтобы лучше понять.

Привязка событий к динамически создаваемым элементам?

1 голос
/ 25 февраля 2020

Используйте .off(). Метод .off() удаляет обработчики событий, которые были присоединены с помощью .on().

Так в вашем случае:

 $("#nestable .button-delete").off().on("click", deleteFromMenu);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...