Недопустимый метод делегата JQuery

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

    $("#myGrid tbody tr").click(function() {
        var id = $(this).children('td').eq(0).text();
        alert(id);
    });

Однако, если я изменяю размер подкачки, то более новые строки не имеют события click, вызывающего функцию. Я решил, что новый метод делегирования JQuery должен делать именно то, что я хотел; однако он ничего не делает на любом элементе tr.

Может ли кто-нибудь объяснить, почему это не работает:

    $('#myGrid tbody').delegate('tr', 'click', function() {
        var id = $(this).children('td').eq(0).text();
        alert(id);
    }); 

Я пробовал разные комбинации селектора, и никто не запустил его.

Спасибо Пол Сперанца

Ответ 1

Используйте это:

$("#myGrid tbody tr").live('click', function() {
    var id = $(this).children('td').eq(0).text();
    alert(id);
});

.live() работает для текущего будущего элементов.

Ответ 2

Попробуйте это вместо:

$('#myGrid').delegate('tr', 'click', function() {
  var id = $(this).children('td').eq(0).text();
  alert(id);
});

Там есть хорошая вероятность, что некоторые события на вашем теле становятся беспорядочными и/или твой человек получает манипулирование. Я сомневаюсь, что вся таблица тоже страдает от этой проблемы.

Ответ 3

Попробуйте это

$('#myGrid tbody').delegate('click', 'tr', function() {
    var id = $(this).children('td').eq(0).text();
    alert(id);
});

или

$('body').delegate('click', '#myGrid tbody tr', function() {
    var id = $(this).children('td').eq(0).text();
    alert(id);
}); 

Ответ 4

За кулисами bind, delegate и live все используют метод on.

У меня было несколько проблем с delegate, поэтому я начал использовать on. Преобразование вызовов delegate в on легко: просто поменяйте первый и второй аргументы.

Это:

 $('#myGrid tbody').delegate('tr', 'click', function() {
        var id = $(this).children('td').eq(0).text();
        alert(id);
    }); 

Становится следующим:

 $('#myGrid tbody').on('click', 'tr', function() {
        var id = $(this).children('td').eq(0).text();
        alert(id);
    }); 

BTW: live устарел в новой версии jQuery

Ответ 5

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