我有一张看起来像这样的表。
<table>
<thead>
<tr>
<th>Foo</th>
<th>Bar</th>
</tr>
</thead>
<tbody>
<tr class="data">
<td>Info here</th>
<td><a href"/url_here" class="edit">Edit</a></td>
</tr>
<tr class="data">
<td>More here</th>
<td><a href"/url_here" class="edit">Edit</a></td>
</tr>
</tbody>
</table>
我想在鼠标悬停在其中的任何行上时显示编辑链接。我尝试了一些方法,但仍然遇到同样的问题。假设我只是想错了方法。
这就是我现在所拥有的。
$('a[class*=edit]').hide();
$('tr[class*=data]').bind("mouseover", function(e) {
$(e.target).closest('a[class*=edit]').addClass("selected");
$('a[class*=selected]:first').show();
}).mouseout(function() {
$('a[class*=selected]').hide();
$('a[class*=edit]').removeClass("selected");
})
现有代码存在问题,除非您将鼠标悬停在编辑链接上,否则不会添加所选类。就像我上面提到的那样,当你将鼠标悬停在那一行的任何地方时,我需要它来添加所选的类。我也只希望它显示该特定行的编辑链接。
任何帮助都会非常感激我将头发拉了几个小时,我知道它可能是愚蠢的。谢谢!
答案 0 :(得分:9)
一些事情:
$()
jQuery函数的字符串可以等同于您在CSS样式表中放置的字符串。你现在使用选择器的方式除了不太清楚外,效率极低。例如,使用=*
选择器尝试在class属性中查找字符串edit
where 的所有链接。因此,与abceditabc
类的链接将匹配。这使得jQuery在尝试查找这些不存在的链接时做了大量工作。接受的用法是使用选择器字符串,例如a.edit
,jQuery可以快速确定它是什么以及如何获取它。this
指的是事件当前在函数内部执行的元素。除非您正在进行事件委托,否则您实际上不会使用e.target
。e.target
上都是兄弟td。 closest
无法将该td,tr传递到下一个td,直到链接。即使它确实如此,你可能也想避免这种情况,因为它没有必要。这与第二点有关,因为简单地查找从表格行下来的链接要容易得多。因此,记住这些事情,你可以重写你拥有的东西:
$(function() {
$('a.edit').hide(); // hide all links with a class of edit
// act upon all table rows with a class of data
$('tr.data').hover(function() {
// at this point, 'this' is the table row that is being hovered
// we can use the find function to locate the link with a class of edit
// then add a class to it and show it.
$(this).find('a.edit').addClass("selected").show();
}, function() {
// the second argument of the hover function is what should happen
// when the mouse hovers out of the table row. In this case, we want
// to find the link again, remove the class, and hide it.
$(this).find('a.edit').removeClass("selected").hide();
});
});
您可以看到此代码对您发布的HTML here起作用的代码。在FF,IE上为我工作。
进一步的建议:
console.log(this);
是一项无法低估的功能。答案 1 :(得分:0)
尝试这样的事情,假设我的逻辑正确。
$(document).ready(function() {
$('a.edit').hide();
$('tr.data').hover(function() {
$(this).addClass("selected").find('a.edit').show();
}, function() {
$(this).removeClass("selected").find('a.edit').hide();
});
}):
您的特定错误很可能与您正在使用遍历树的closest
方法有关。
更新:代码无法正常工作的另一个可能原因是您没有使用jquery document.ready功能。我用它更新了我的代码。