Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jquery/75.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/jenkins/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
空选择上的jQuery hide()不会触发回调_Jquery_Jquery Selectors - Fatal编程技术网

空选择上的jQuery hide()不会触发回调

空选择上的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

我正在尝试使用jQuery筛选页面上的表。我想淡出当前显示的行,淡入与新选择匹配的行。我的jQuery代码如下所示:

$('#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。在我看来,这段代码的意图更清楚。如果你关心性能,你必须考虑这个代码>如果与在 List和周围发生的相比很小。我改变了代码,我也使用约定()(DONE())做了一些改变,所以回调只执行一次。谢谢。我的代码以前看起来像这样,但我认为我可以通过“以某种方式”初始化先前的FilterResult来摆脱if/else。在我看来,这段代码的意图更清楚。如果你关心性能,你必须考虑这个代码>如果与在 List和周围发生的事情相比很小。我改变了代码,我也使用约定()。DONE()进行了一些更改,所以回调只执行一次。