提供旧数据的JQuery函数

时间:2012-05-29 09:24:08

标签: jquery

我有以下JQuery,允许用户选择/取消选择项目/价格列表作为创建自动报价的方式。代码如下所示:

$('table.products > tbody > tr').click(function(){
    if ($(this).find('div.price').is(":visible")) {
        $(this).find('div.price, img.selected').fadeOut(100);
    } else {
        $(this).siblings('div.price, img.selected').fadeIn(100);                    
    }
    recalc();
});

它实际上比那更复杂(因此我没有使用toggle()的原因,但上面只是一个简化的例子,用于这个问题。

无论如何,上面的代码工作正常。如果单击表格行,则根据价格是否已经显示的价格和图像进行选择/取消选择。

然后我在最后调用了一个名为recalc();的函数..它看起来像这样(再次,这是一个简化版本):

function recalc() {
    var numOfProducts = $('table.products div.price:visible').length;
    alert(numOfProducts);
}

我遇到的问题是警报总是返回在更改任何内容之前本来正确的值。

例如,如果没有div.price可见且我选择了一个,则会看到一个,但警报会显示0。然后,如果我选择另一个,则会显示2,但警报仅显示1,因为这就是我点击时的状态。如果我单击其中一个已单击的项目以取消选择它,则会显示2

所以,我的问题是我应该如何确保函数调用在其他所有事情完成后发生?

2 个答案:

答案 0 :(得分:1)

这是因为在动画完成之前调用了recalc(),因此元素仍然可见。

您有两种选择。首先是摆脱动画:

$('table.products > tbody > tr').click(function(){
    if ($(this).find('div.price').is(":visible")) {
        $(this).find('div.price, img.selected').hide();
    } 
    else {
        $(this).siblings('div.price, img.selected').show();                    
    }
    recalc();
});

第二种是在每个淡入淡出的回调中调用recalc(),以便在动画完成后发生:

$('table.products > tbody > tr').click(function(){
    if ($(this).find('div.price').is(":visible")) {
        $(this).find('div.price, img.selected').fadeOut(100, recalc);
    }
    else {
        $(this).siblings('div.price, img.selected').fadeIn(100, recalc);                    
    }        
});

答案 1 :(得分:0)

我得出的结论是我的做法完全错了。我的部分原因是,没有多少人提出这个问题的答案,部分原因是我收到的答案没有完成我想要做的事情。也许我的解释也不够明确。

因此,我对获得所选产品行数量的准确报告的原始问题的解决方案是在JS中创建一个全局变量:

window.config =
    {
        products : 0,
    };

然后,在if语句中添加行,根据发生的事情递增或递减变量:

$('table.products > tbody > tr').click(function(){
    window.config.products = window.config.products - 1; // Decrement
    if ($(this).find('div.price').is(":visible")) {
        $(this).find('div.price, img.selected').fadeOut(100);
    } else {
        window.config.products = window.config.products + 1; // Increment
        $(this).siblings('div.price, img.selected').fadeIn(100);                    
    }
});

现在,我可以准确记录全局变量中所选产品的数量,我可以随时访问该变量以继续开发我的应用程序。