2010-11-15 12 views
5

Come targetizzo $ this (da 'each' context) dalla funzione 'click' all'interno. Voglio rimuovere il codice awkward .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(); 
    }); 
}); 

risposta

3

La soluzione è, naturalmente, lo stesso di chiunque altro qui, ma penso che utilizzando questa sintassi è molto più pulito e compirà la stessa il codice che stai usando adesso.

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

Invece di inserire in una stringa HTML, si può utilizzare la nuova sintassi introdotta in jQuery 1.4 per fare questo molto più pulito, e senza il gestore di eventi in linea disordinato che si sta utilizzando al momento.

+0

apprezzare il suggerimento. è meno leggibile ma probabilmente migliore. – henrijs

+0

+1 Lo userei. Meglio della creazione di un elemento, perdendo il riferimento ad esso, quindi doverlo ritrovare immediatamente nel DOM per assegnare il clic. – user113716

4

Si può semplicemente memorizzare in una variabile:

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

Da notare anche la e.preventDefault(); chiamata che fa più o meno ciò che il vostro onclick="return false;" ha fatto, ma in un modo molto più pulito.

+0

Yuck con $ dollar_named_variables. – Gareth

+1

Sembra essere una pratica comune usare $ che per oggetti jQuery. – ThiefMaster

+0

Inoltre, penso che l'OP voglia l'esterno "questo" disponibile dalla funzione interna, non in una chiamata successiva – Gareth

7

salvarla in una variabile di nome (non speciale):

$('.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

Quindi 'var area', non 'var $ area'? – henrijs

+0

Non fa alcuna differenza, ma in genere le variabili javascript non iniziano con '$'. Nota che jQuery usa il simbolo '$ 'come nome di una funzione, ma non prefissa alcun altro identificatore con' $ ' – Gareth

+0

impressionante, funziona. grazie per la condivisione. preferirà questo come in seguito è anche utile, ma per altri obiettivi. – henrijs