Подтвердить что ты не робот

Использование функции jQuery.on Как получить исходный элемент для события?

У меня был код вроде этого:

$('.remove-group').click(function () {
    $(this).closest('tr').remove();
});

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

$(document).on('click', '.remove-group', function () {
    $(this).closest('tr').remove();
});

Это больше не работает, потому что ключевое слово this не относится к исходному элементу.

Любые идеи?

Update

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

var $removeGroup = $('.remove-group');
$(document).on('click', $removeGroup, function () {
    $(this).closest('tr').remove();
});

Это не работает, когда я делаю так.

4b9b3361

Ответ 1

Надеюсь, это поможет кому-то:

$('#container').on('click', '.remove-group', function(event) {
  $(this);          // returns $('.remove-group') equivalent
  $(event.target);  // returns $('.remove-group') equivalent

  $(event.delegateTarget);  // returns $('#container') equivalent
});

Ссылка: http://api.jquery.com/event.delegateTarget/

Изменить автор вопроса:

Я просто хочу уточнить некоторые из ошибок, которые я изначально сделал.

Казалось бы, обработчик .on() в jQuery имеет определенное использование, которое явно не указано в документации.

  • Вы можете использовать .on() непосредственно на селекторе:

    $('button').on('click', function () { $(this).css('border', 'solid 1px red'); });
    

    Он будет работать, но он будет НЕ применяться к любым будущим элементам, динамически добавленным на страницу с тем же селектором. Это отличается от способа работы .live(). Вы должны привязываться к объекту документа, чтобы улавливать будущие элементы, а также текущие. Это потому, что селектор теперь является элементом, который вы слушаете, и он поймает все события кликов, которые пузырятся до этого элемента (документ является одним из самых верхних элементов для прослушивания). Затем вы передаете селектор для интересующего вас элемента в качестве второго аргумента после имени события.

    $(document).on('click', 'button', function () { $(this).css('border', 'solid 1px red'); });
    

    Теперь слушатель отфильтровывает события кликов, пока не найдет тот, который был первоначально запущен на 'button' и вздулся до документа.

  • Вы должны указать селектор строк, а не завернутый набор. Это не сработает:

    var $buttons = $('button');
    $(document).on('click', $button, function () { $(this).css('border', 'solid 1px red'); });
    

Для примеров см. этот jsbin.

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

Ответ 2

Чтобы получить "исходный элемент для события", вы должны использовать свойство target объекта события:

$(document).on('click', '.remove-group', function (e) {
    $(e.target).closest('tr').remove();
});

Однако, этот подход, вероятно, не тот, который вы на самом деле хотите, так как исходный элемент может быть потомок .remove-group, событие 'click' просто пузырило целевой объект, что означает, что вы может удалить неправильную строку в случае вложенной таблицы. В контексте обработчика .on() this действительно ссылается на элемент, сопоставляемый .remove-group. Для привязки к делегированному событию этого элемента с помощью .on() синтаксис выглядит следующим образом:

$(static-parent-element).on(event, selector-string, handler)

Например, это правильный синтаксис:

$(document).on('click', '.remove-group', function () {
    $(this).closest('tr').remove();
});

Это будет соответствовать текущим и будущим элементам .remove-group и удалить ближайшего предка tr. Вы можете (и должны) заменить document здесь на ближайший родительский элемент .remove-group, который существует в DOM во время привязки, и будет существовать всякий раз, когда ожидается, что это событие будет запущено (т.е. Является статическим). Выполнение этого минимизирует расстояние, на которое событие должно пузырить дерево DOM до запуска события.

Ответ 3

$(this) должен работать нормально, но попробуйте event.target в любом случае.

$(document).on('click', '.remove-group', function (event) {
    $(event.target).closest('tr').remove();
});

Демо: http://jsbin.com/inewoc/1/edit