Метод делегата 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);
    }); 

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

спасибо Пол Сперанца!--3-->

5 ответов


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

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

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


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

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

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


попробуй такое

$('#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);
}); 

за кулисами 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);
    }); 

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


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