2010-03-10 10 views
11

Estoy tratando de usar el método de delegado en una grilla que envuelvo con el complemento DataTables.Net. Originalmente tenía este código que funciona como se esperaba.El método de delegado de JQuery no funciona

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

Sin embargo, si se cambia el tamaño de paginación a continuación, las filas más nuevos no tienen el evento click llamar a la función. Decidí que el nuevo método de delegado de JQuery debería hacer exactamente lo que yo quería; sin embargo, no hace nada en absoluto en ningún elemento tr.

podría alguien explicar por qué esto no funciona:

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

He probado diferentes combinaciones de selector y ninguno conseguir que funcione.

Gracias Pablo Speranza

+3

qué es esta comunidad wiki? –

Respuesta

4

Utilice esta:

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

.live() obras para la corriente de elementos futuras.

+5

Para eso es exactamente 'delegate', excepto que tiene un mejor rendimiento, debido a que se requieren menos burbujas de eventos. –

+0

Como hace 'delegate'. Te sugiero que leas sobre ello. – miketaylr

+2

Gracias chicos, estaba evitando 'en vivo' porque pensé que se suponía que el delegado lo reemplazaría.Todavía no entiendo por qué el delegado no funciona para mí, pero Live does y todo está funcionando como se esperaba. Una vez más, ¡gracias por las rápidas respuestas! –

-4

Si las filas nuevas se agregan dinámicamente, usted tiene que utilizar live método de los elementos, cambiar el delegate a live

+2

Creo que malinterpretas lo que hace 'delegate', es solo delegación de eventos como' live'. – miketaylr

+1

'delegate' usa' live' en su núcleo, sin embargo, tiene un mejor rendimiento que en vivo al usar la delegación de eventos en un antecesor común que no es el documento base. –

15

Prueba este lugar:

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

Hay una buena probabilidad de que algunos eventos en tu cuerpo están siendo molestados y/o tu cuerpo está siendo manipulado. Dudo que toda la mesa también sufra este problema.

+0

Tenga en cuenta que esto podría ser varias veces más rápido que usar 'live', dependiendo de cómo esté estructurado su dom. –

1

probar este

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

o

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

Detrás de las escenas, bind, delegate y live todos utilizan el método on.

He tenido algunos problemas con delegate, así que comencé a usar on en su lugar. La conversión de sus llamadas delegate a on es fácil: simplemente cambie el primer y el segundo argumento.

Este:

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

Se convierte en esto:

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

Por cierto: live está en desuso en la versión más reciente de jQuery

+1

"on" está disponible solo desde 1.7 –

+0

"on" no funciona en iPhone o iPad, ni tampoco funciona. El delegado funciona si delega el elemento exacto; por lo tanto, no funcionará para los elementos actualizados de ajax. Es un verdadero dolor de cabeza, ¡y no he encontrado una buena solución para algo tan simple como hacer clic en las filas de una tabla que se actualiza a través de ajax! – Johncl

+1

Personalmente he usado 'on' en iPhones, ipads y androids 2.3 y 4, y funcionó. ¿Es posible que quizás no estés usando jQuery en estas plataformas? –