Set*_*eth 3 jquery event-delegation
我在页面上显示来自用户的一堆帖子.我有一个主要的父div,类名为'posts',每个帖子都输入一个div,里面有类名'row'.所以在div.posts里面有很多div.row.每个看起来都像这样.
<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>
Run Code Online (Sandbox Code Playgroud)
通过CSS,actions-column默认设置为display:none.当用户将鼠标悬停在帖子(div.row)上时,我想显示actions-column.我最初的做法是通过为每一行设置一个鼠标悬停,这会对浏览器产生影响并减慢速度.我做了一些研究,偶然发现了事件授权,并决定尝试一下.到目前为止,我能够确定哪一行是目标,但是,我无法弄清楚如何使用类'actions-column'来定位它的child-div.
代码到目前为止......
$(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
});
});
Run Code Online (Sandbox Code Playgroud)
你可以使用live:
$('div.row').live('mouseover', function() {
$(this).find('div.actions-column').show();
}).live('mouseout', function() {
$(this).find('div.actions-column').hide();
});
Run Code Online (Sandbox Code Playgroud)
正如文档说明:
绑定"实时"事件时,它将绑定到页面上的所有当前和未来元素(使用事件委派).
还有几点说明:
$(window).load()活动.你可能想要$(document).ready()$('.posts')两次,你可以在最后添加第二个调用(就像我在上面的例子中所做的那样) - 这样做效率更高,是对1个选择器做多个事情的首选方式在jQuery中.div.rowHTML树的下一个代码的代码已经由jQuery的closest()方法实现.你可以用它做这样的事情:
$('div.posts').hover(function(e) {
var row = $(e.target).closest('div.row');
$row.find('div.actions-column').show();
}, function(e) {
var row = $(e.target).closest('div.row');
$row.find('div.actions-column').hide();
});
Run Code Online (Sandbox Code Playgroud)
但由于live我在上面展示的功能,这不是必需的.
<div>帖子类,请考虑给它一个id属性.这是迄今为止在文档中选择元素的最有效方法,将它赋予仅出现一次的元素是有意义的..row,而是养成寻找的习惯div.row代替.它只是更快.| 归档时间: |
|
| 查看次数: |
2223 次 |
| 最近记录: |