Foro de elhacker.net

Programación => Desarrollo Web => Mensaje iniciado por: WHK en 22 Febrero 2012, 15:37 pm



Título: Es necesario hacer unbind en jQuery?
Publicado por: WHK en 22 Febrero 2012, 15:37 pm
Hola.

Tengo una sección del sitio WEB que se sobreescriben botones, no apareciendo y desapareciendo sino agregando y eliminando para ahorrar memoria ya que son muchisimos botones.

Mi duda es la siguiente:

Cáda ves que aparece un botón este debe realizar una acción al hacer click por lo tanto cómo puedo definirle la función?
Si intento darle una propiedad onclick="funcion()" no me funciona ya que funcion() está definida dentro de $(document)ready(function(){... por lo tanto no es accesible desde afuera.
Lo otro que intento es crear un $('#boton').click(function(){... pero al eliminar el botón se elimina la asociación de la función con el botón y al hacer aparecer uno nuevo queda sin asociación.

Para solucionar esto lo que hice fue una función llamada reDOM(){ ... } que incluye todas las asociaciones con los botones...

Código
  1. function reDom(){
  2. $('.boton').each(function(){
  3. $(this).click(function(){
  4. // Accion
  5. });
  6. });
  7. }

Hasta ahi todo bién, funciona de lujo porque cáda ves que elimino y agrego un botón llamo la función reDOM() y vuelve a asociar las funciones a los nuevos inputs incluyendo a los inputs que ya estaban.

Mi duda es la siguiente...
Cuando se desasocian o sea se elimina el botón y aparece otro esta asociación queda en memoria o automaticamente se elimina? es necesario hacer un unbind antes de eliminar el botón? ya que son mcuhos botones que aparecen y desaparecen y si quedan en memoria entonces va a causar que con el tiempo la web se vea lenta y me haga refrescar forzadamente.

El caso de los botones era solo un ejemplo ya que en la práctica son divisiones de una barra de busqueda que se renueva en cáda petición Ajax con $('#barra').html(request.barr) y necesito asociar las acciones a cáda división, pasar el mouse por encima, hacerle click, etc, pero me preocupa si las funciones aun están quedando en el DOM o se van eliminando solas.

Gracias para el que me pueda ayudar.


Título: Re: Es necesario hacer unbind en jQuery?
Publicado por: #!drvy en 24 Febrero 2012, 07:05 am
Hola,

Hay una pregunta mas o menos igual que la tuya en el foro de jQuery.

Pregunta
Citar
I have some pages where I'm adding elements, then attaching click
event handlers to them. Later on (based on user interaction), those
elements are being removed from the page.
Is there any benefit to calling unbind('click') on those elements
before I remove() them? Or does remove() effectively remove that
click handler from memory as well?

Respuesta
Citar
From the docs:
"Note that this function starting with 1.2.2 will also remove all event handlers and internally cached data."

http://api.jquery.com/remove/#expr


Saludos


Título: Re: Es necesario hacer unbind en jQuery?
Publicado por: WHK en 27 Febrero 2012, 13:59 pm
aaah super, o sea que habría que llamar a remove() y después sobreescribir con html(), buén tip, o sea que si sobreescribo directamente todo el contenido con html() voy a mantener en la memoria los handlers y se pondría mas pesado el sitio WEB.
De todas formas esto en Internet explorer haría que se demorar un poco mas su ejecución pero lo haría mas ligero.

El problema ahora sería eliminar todo lo que está dentro de la división antes de aplicarle .html() ya que remove() elimina una división del DOM pero completa y no solo su contenido.
Para esto tendría que usar empty() pero ahora el dilema es... empty() eliminará correctamente la memoria al igual que remove() ?, supongo que si pero de todas formas lo usaré.

Gracias drvy | BSM.

Edito:
Citar
[jQuery 1.7.1 http://jquery.com | jQuery UI 1.8.18 http://jqueryui.com | jQuery Mobile 1.0.1 http://jquerymobile.com | Docs: http://api.jquery.com | Paste your code at http://jsfiddle.net ♥ Just ask! No PMs, plz. ♥ -- Mobile support #jquerymobile | Development Channels #jquery-dev #jqueryui-dev #jquerymobile-dev | This channel is publicly logged to http://irc.jquery.com]
[10:02] == WHK [be62d7cb@gateway/web/freenode/ip.000.000.000.000] has joined #jquery
[10:02] <WHK> Helo
[10:02] <WHK> a question please
[10:02] == blackspotwiggins [~blackspot@94.169.191.90.dyn.estpak.ee] has quit [Quit: Leaving]
[10:02] <WHK> the funcion empty() delete all handlers of objects?
[10:03] <WHK> for example...
[10:04] <WHK> <div id="a"><div id="b"></div></div> ... $('#b').click(function(){ alert(0); }); $('#a').empty();
[10:04] <Cork> WHK: events are added to the dom through addEventListner
[10:04] <Cork> so the browser handles removing them when it cleans up the dom tree
[10:04] <WHK> the empty() remove click event of memory?
[10:04] <WHK> ooh
[10:05] <mattfieldy> empty() removes event handlers from the child elements before removing the elements themselves
[10:05] <WHK> Thanks :)

Si lo elimina, según dicen la función empty() elimina los eventos antes de eliminar los objetos :)