Ich zeige eine Reihe von Beiträgen von Benutzern auf einer Seite an. Ich habe das Hauptelternteil div mit dem Klassennamen 'Beiträge' und jeder Beitrag wird in einem div mit dem Klassennamen 'row' innerhalb davon ausgegeben. Also gibt es eine Menge div.row in den div.posts. Jeder sieht so aus.jQuery Ereignisdelegation + Zielhilfe für Kinder
<div class="row clearfix">
<div class="left-column">
<img src="..." title="" />
</div>
<div class="main-column">
<div class="row-text">Post Text...</div>
<div class="row-date">Posted Date...</div>
</div>
<div class="actions-column">
<a href="#">Link</a>
<a href="#">Link 2</a>
<a href="#">Link 3 etc.</a>
</div>
</div>
Via CSS wird die Aktionen-Spalte zur Anzeige eingestellt: keine standardmäßig. Wenn ein Benutzer mouseover ein Post (div.row) ist, möchte ich die actions-column anzeigen. Meine anfängliche Art, dies zu tun, bestand darin, selbst für jede Zeile einen Mouseover zu setzen, was sich auf den Browser auswirkte und die Dinge verlangsamte. Ich recherchierte und stolperte über die Delegation von Veranstaltungen und beschloss, es zu versuchen. Bis jetzt bin ich in der Lage zu erkennen, welche Zeile anvisiert wird, aber ich kann nicht herausfinden, wie ich mit der 'actions-column' der Klasse auf die Kind-Div-Datei ausrichten soll.
-Code so weit ...
$(window).load(function(){
$('.posts').mouseover(function(e){
var $row, $tgt = $(e.target);
if ($tgt.hasClass("row")) {
$row = $tgt;
} else {
if ($tgt.parent().parent().hasClass('row'))
$row = $tgt.parent().parent();
else if ($tgt.parent().hasClass('row'))
$row = tgt.parent();
else
return false;
}
//code here to select div.actions-column and show it
});
$('.posts').mouseover(function(e){
var $row, $tgt = $(e.target);
if ($tgt.hasClass("row")) {
$row = $tgt;
} else {
if ($tgt.parent().parent().hasClass('row'))
$row = $tgt.parent().parent();
else if ($tgt.parent().hasClass('row'))
$row = tgt.parent();
else
return false;
}
//code here to select div.actions-column and hide it
});
});
Es ist erwähnenswert, dass sich die JS-Best Practices für Klassenselektoren von den CSS-Best Practices unterscheiden, da JS keinen nativen Klassenselektor besitzt. CSS tut dies jedoch und da sollte das Element-Tag weggelassen werden. Referenz: http://code.google.com/speed/page-speed/docs/rendering.html – PatrikAkerstrand
$ .live() ist eine performante Verschwendung. $ .delegate() sollte stattdessen verwendet werden. –
Einverstanden; 'live()' ist ein schlechter Weg, dies zu tun. 'delegate()' ist viel besser (wenn Sie den nächsten nicht zerstörten Vorgänger auswählen) und in letzter Zeit (lange nachdem diese Frage gestellt und der Vorgänger akzeptiert wurde), ist '.on()' mit Delegierungssyntax die bevorzugte Methode geworden. –