2010-11-15 6 views
5

Cómo apuntar $ this (desde el contexto 'cada') desde la función 'clic'. Quiero eliminar el incómodo código .parents(). Find().

$('.layout.responsive').each(function() { 
    $('.area.optional', this).before('<a href="#" class="toggle_responsive" onClick="return false">Show details</p>').hide(); 
    $('.toggle_responsive', this).click(function() { 
     $(this).parents('.layout.responsive').find('.area.optional').toggle(); 
    }); 
}); 

Respuesta

3

La solución es, por supuesto, lo mismo que todos los demás está aquí, pero creo que con esta sintaxis es mucho más limpio y va a lograr lo mismo que el código que estás usando en este momento.

$('.layout.responsive').each(function() { 
    var ar = $(this).find('.area.optional').hide(), 
     showDetail = $('<a />', { 
     href: '#', 
     class: 'toggle_responsive', 
     text: 'Show details', 
     click: function(){ 
      ar.toggle(); 
      return false; 
     }}).insertBefore(ar); 
}); 

En lugar de insertar en una cadena HTML, podemos utilizar la nueva sintaxis introducida en jQuery 1.4 para hacer esto mucho más limpia, y sin el controlador de eventos en línea desordenado que está usando en este momento.

+0

apreciación sugerencia. es menos legible pero probablemente sea mejor. – henrijs

+0

+1 Yo usaría este. Es mejor que crear un elemento, perder referencia a él, y luego tener que encontrarlo de inmediato en el DOM para asignar el clic. – user113716

4

Simplemente puede almacenar en una variable:

$('.layout.responsive').each(function() { 
    var $elem = $('.area.optional', this).before('<a href="#" class="toggle_responsive">Show details</p>').hide(); 
    $('.toggle_responsive', this).click(function(e) { 
     e.preventDefault(); 
     $elem.toggle(); 
    }); 
}); 

También tenga en cuenta la llamada e.preventDefault(); lo que hace más o menos lo que su onclick="return false;" hicieron pero de una manera mucho más limpia.

+0

Yuck con las $ dollar_named_variables. – Gareth

+1

Parece ser una práctica común usar $ para objetos jQuery. – ThiefMaster

+0

Además, creo que el OP quiere que el "esto" externo esté disponible desde la función interna, no en una llamada posterior – Gareth

7

guardarlo en un (no especiales) variable llamada:

$('.layout.responsive').each(function() { 
    var area = $('.area.optional', this).before('<a href="#" class="toggle_responsive" onClick="return false">Show details</p>').hide(); 
    $('.toggle_responsive', this).click(function() { 
     $(area).toggle(); 
    }); 
}); 
+1

¿Entonces 'var area', no 'var $ area'? – henrijs

+0

No hace la diferencia, pero las variables javascript generalmente no comienzan con '$'. Tenga en cuenta que jQuery usa el símbolo '$' como un nombre de función, pero no prefija ningún otro identificador con '$' – Gareth

+0

awesome, funciona. gracias por compartir. preferirá esto ya que más tarde también es útil, pero para otros objetivos. – henrijs