我在div中有一些数据表,我想通过单击图像来".thoggle()"隐藏或显示这些表(这很有效)。在初始化数据表之后,我的点击处理程序仍然每次都会触发,但$(this)只在最后一个元素上是正确的。每隔一个元素$(this)都是"prevObject",它不适用于.thoggle().
<div class='toggle'>
<img src='/some/path/foo.jpg'>
<table class='dt'>
...
</table>
</div>
<div class='toggle'>
<img src='/some/path/foo.jpg'>
<table class='dt'>
...
</table>
</div>
<div class='toggle'>
<img src='/some/path/foo.jpg'>
<table class='dt'>
...
</table>
</div>
//This works if I don't initialize datatables
$(".toggle").on("click", "img", function(event) {
$(this).siblings(".dt").toggle();
});
你知道$(这个)是怎么回事吗?
EDIT:如果数据表没有初始化,上面的jQuery选择器"$(this)"可以正常工作。初始化后,"$(this)"对除一个元素外的所有元素返回"prevObject"。因此,一个元素在单击时可以正常工作,而其他元素则不能正常工作。
第二版:这里有一个jsfiddle来说明这个问题:http://jsfiddle.net/S6bhL/10/
第三版:在我实际的应用程序中,我不得不使用以下修改后的解决方案:
$(this).parent().parent().find(".dt");
$(this).parent().parent().find(".dataTables_wrapper");
更新JSFIDDLE演示
看起来,每当您单击初始化数据表时,它都会被div dataTables_wrapper
包装。所以处理这两个案件。
$(document).ready(function () {
$(".toggle").on("click", "img", function (event) {
var $nextDT = $(this).next('.dt');
var $nextDTWrap = $(this).next('.dataTables_wrapper');
if ($nextDT.length) {
$nextDT.toggle();
} else if ($nextDTWrap.length) {
$nextDTWrap.toggle();
}
});
});
function doit() {
$(".dt").each(function () {
$(this).dataTable();
});
}