Encontré dos excelentes artículos que hablan sobre la nueva función .on()
: jquery4u.com , elijahmanor.com .
¿Hay alguna forma .bind()
de usar el alambique mejor que .on()
?
Por ejemplo, tengo un código de muestra que se ve así:
$("#container").click( function( e ) {} )
Puede notar que solo tengo un elemento recuperado por el selector y, en mi caso, el <div>
nombre #container
ya existe cuando se cargó mi página; no agregado dinámicamente. Es importante mencionar que uso la última versión de jQuery: 1.7.2.
Para esa muestra, ¿debería .on()
usarse en lugar de .bind()
incluso si no uso las otras características proporcionadas por la .on()
función?
javascript
jquery
jquery-selectors
Samuel
fuente
fuente
.bind()
es malo enlazar múltiples elementos, pero no menciona cómo.on()
cuando se usa en modo de enlace hace exactamente lo mismo.Respuestas:
Internamente, se
.bind
asigna directamente a.on
la versión actual de jQuery. (Lo mismo se aplica.live
). Por lo tanto, hay un pequeño pero prácticamente insignificante éxito de rendimiento si lo usas.bind
.Sin embargo,
.bind
puede eliminarse de futuras versiones en cualquier momento. No hay razón para seguir usando.bind
y cada razón para preferir en su.on
lugar.fuente
.bind
y.on
son idénticos para eventos no delegados;.bind
no proporciona ningún tipo de acceso directo como lo$.getJSON
haceTodos estos fragmentos realizan exactamente lo mismo:
Sin embargo, son muy diferentes de estos, que todos realizan lo mismo:
El segundo conjunto de controladores de eventos utiliza la delegación de eventos y funcionará para elementos agregados dinámicamente. Los controladores de eventos que usan delegación también son mucho más eficaces. El primer conjunto no funcionará para elementos agregados dinámicamente, y son mucho peores para el rendimiento.
La
on()
función de jQuery no introduce ninguna funcionalidad nueva que aún no existía, es solo un intento de estandarizar el manejo de eventos en jQuery (ya no tiene que decidir entre live, bind o delegate).fuente
$('selector').live('click', function () { ... });
así que mantienes el resultado lo más idéntico posible.Los métodos directos y
.delegate
son API superiores.on
y no hay intención de desaprobarlos.Los métodos directos son preferibles porque su código se escribirá con menos cadenas. Recibirá un error inmediato cuando escriba mal el nombre de un evento en lugar de un error silencioso. En mi opinión, también es más fácil escribir y leer
click
queon("click"
El
.delegate
es superior a.on
debido al orden del argumento:Sabes de inmediato que está delegado porque, bueno, dice delegado. También ves al instante el selector.
Con
.on
no está claro de inmediato si incluso se delega y hay que mirar al final para el selector:Ahora, la denominación de
.bind
es realmente terrible y tiene un valor nominal peor que.on
. Pero.delegate
no puede hacer eventos no delegados y hay eventos que no tienen un método directo, por lo que en un caso raro como este podría usarse, pero solo porque desea hacer una separación clara entre eventos delegados y no delegados.fuente
Si busca en el código fuente
$.fn.bind
, encontrará que es solo una función de reescritura paraon
:http://james.padolsey.com/jquery/#v=1.7.2&fn=$.fn.bind
fuente
De la documentación de jQuery:
http://api.jquery.com/bind/
fuente
A partir de Jquery 3.0 y superior .bind ha quedado en desuso y prefieren usar .on en su lugar. Como @Blazemonger respondió anteriormente que se puede eliminar y es seguro que se eliminará. Para las versiones anteriores .bind también llamaría a .on internamente y no hay diferencia entre ellas. Consulte también la API para obtener más detalles.
Documentación de la API jQuery para .bind ()
fuente