空选择上的jQuery hide()不会触发回调
我正在尝试使用jQuery筛选页面上的表。我想淡出当前显示的行,淡入与新选择匹配的行。我的jQuery代码如下所示:空选择上的jQuery hide()不会触发回调,jquery,jquery-selectors,Jquery,Jquery Selectors,我正在尝试使用jQuery筛选页面上的表。我想淡出当前显示的行,淡入与新选择匹配的行。我的jQuery代码如下所示: $('#details-table tr').hide(); var previousFilterResult = $(); var selects = $('#search-panel > select'); selects.change(function () { selects.attr('disabled', 'disabled'); var fil
$('#details-table tr').hide();
var previousFilterResult = $();
var selects = $('#search-panel > select');
selects.change(function () {
selects.attr('disabled', 'disabled');
var filterResult = filterTable();
previousFilterResult.hide('slow', function () {
filterResult.fadeIn('slow', function () {
selects.removeAttr('disabled');
});
});
previousFilterResult = filterResult;
});
我的问题是,当我使用$()初始化previousFilterResult时,代码不起作用,因为它似乎从未命中previousFilterResult.hide调用的回调。如果我在页面中放置一个虚拟div,并使用$(“#dummyDiv”)初始化previousFilterResult,它就可以正常工作
是否有任何方法可以初始化previousFilterResult,而无需在页面上放置一个虚拟div,以便上述代码仍然有效
谢谢。不,你不能
发件人:
需要注意的是,回调对每个匹配的元素执行一次,而不是对整个动画执行一次
但是您可以轻松地将代码更改为
$('#details-table tr').hide();
var previousFilterResult = null;
var selects = $('#search-panel > select');
selects.change(function () {
selects.attr('disabled', 'disabled');
var filterResult = filterTable();
var callback = function () {
filterResult.fadeIn('slow', function () {
selects.removeAttr('disabled');
});
};
if (previousFilterResult) previousFilterResult.hide('slow', callback);
else callback();
previousFilterResult = filterResult;
});
这比使用$()
更干净,在我看来,这就像是一种黑客行为 不,你不能
发件人:
需要注意的是,回调对每个匹配的元素执行一次,而不是对整个动画执行一次
但是您可以轻松地将代码更改为
$('#details-table tr').hide();
var previousFilterResult = null;
var selects = $('#search-panel > select');
selects.change(function () {
selects.attr('disabled', 'disabled');
var filterResult = filterTable();
var callback = function () {
filterResult.fadeIn('slow', function () {
selects.removeAttr('disabled');
});
};
if (previousFilterResult) previousFilterResult.hide('slow', callback);
else callback();
previousFilterResult = filterResult;
});
这比使用$()
更干净,在我看来,这就像是一种黑客行为 请注意:
如果已提供,则在动画完成后将触发回调如果为多个元素设置了动画,请务必注意,回调对每个匹配的元素执行一次,而不是对整个动画执行一次。
(我的重点)
因此,如果您想调用该函数一次,则需要以另一种方式处理该函数。例如:
selects.change(function () {
var fired = false; // Remember whether we've fired the callback
selects.attr('disabled', 'disabled');
var filterResult = filterTable();
// Do we have any previous result?
if (previousFilterResult && previousFilterResult[0]) {
// Yes, and there's at least one element in the set,
// hide it/them and schedule a callback
previousFilterResult.hide('slow', done);
}
else {
// No, go ahead and fire our callback directly
done();
}
previousFilterResult = filterResult;
function done() {
// If there were multiple results, we might get multiple calls,
// so keep track of whether we've been called (fired)
if (!fired) {
fired = true;
filterResult.fadeIn('slow', function () {
selects.removeAttr('disabled');
});
}
}
});
请注意:
如果已提供,则在动画完成后将触发回调如果为多个元素设置了动画,请务必注意,回调对每个匹配的元素执行一次,而不是对整个动画执行一次。
(我的重点)
因此,如果您想调用该函数一次,则需要以另一种方式处理该函数。例如:
selects.change(function () {
var fired = false; // Remember whether we've fired the callback
selects.attr('disabled', 'disabled');
var filterResult = filterTable();
// Do we have any previous result?
if (previousFilterResult && previousFilterResult[0]) {
// Yes, and there's at least one element in the set,
// hide it/them and schedule a callback
previousFilterResult.hide('slow', done);
}
else {
// No, go ahead and fire our callback directly
done();
}
previousFilterResult = filterResult;
function done() {
// If there were multiple results, we might get multiple calls,
// so keep track of whether we've been called (fired)
if (!fired) {
fired = true;
filterResult.fadeIn('slow', function () {
selects.removeAttr('disabled');
});
}
}
});
谢谢我的代码以前看起来像这样,但我认为我可以通过“以某种方式”初始化先前的FilterResult来摆脱if/else。在我看来,这段代码的意图更清楚。如果你关心性能,你必须考虑这个代码>如果与在