1

基本 Javascript 问题 - 当前全局方法的替代方案?

我首先要说我没有大量的 Javascript 经验,但是多年来一直“涉猎”它(主要是做基本的 jquery 驱动的事情和一些表单计算)。

目前我正在把一个计算器和一个基于 jquery.ui 的滑块放在一起。我让它运行良好,但昨晚遇到了一个问题,我不得不使用全局变量来解决这个问题,虽然它现在可以工作,但我觉得这不是正确的解决方案。

我从滑块外部的 Calculation 函数中的这样一行开始,在滑块内的幻灯片事件上被调用。我本可以在滑块内向上移动数学,但它用于其他事情,我更愿意将其保留为我可以在需要时调用的外部函数:

savings = Math.round(cost[$('.selectable-div.selected').attr('id')] * $( "#slider-gallons" ).slider( "value" ); );

...但它总是会根据滑块“开始”的位置而不是当前位置来计算,大概是因为“值”仅在滑块移动后才更改,而不是在移动期间?因此,如果我在位置 1 并移动到 2,它会显示 1 的结果。当我从位置 2 移动到位置 3 时,它会显示位置 2 的结果。当我从 3 移回 2 时,它将向我显示位置 3 的结果(无论我是“最后一个”)。

我在滑块中有另一段使用 ui.value 的小代码,它将实时更新,位置 1 显示 1,位置 2 显示 2,等等。这就是我的问题所在,我不知道如何在滑块函数本身之外调用“滑块加仑” ui.value(即在我的计算函数中)。

作为一种解决方法,我将 ui.value 定义为全局变量“var_slider_gallons_pos”,并像这样调用它:

savings = Math.round(cost[$('.selectable-div.selected').attr('id')] * var_slider_gallons_pos );

它工作得很好,但我对此并不满意。还有另一种方法可以做到这一点,IE(我知道下面的代码不起作用,只是我正在寻找的一个梦幻般的例子)。我只想要一些可以直接调用滑块 ui.value 的东西,而不需要那些额外的变量。

savings = Math.round(cost[$('.selectable-div.selected').attr('id')] * $( "#slider-gallons" ).slider( ui.value ); );

我不知道这是否有意义,但我试图调用滑块元素的 ui.value 而不必首先从滑块事件中创建一个变量。

我确定这是我忽略的一些基本元素,因为我不精通 javascript,所以希望有人可以帮助我。

编辑:为了完整起见,这是我目前使用的完整滑块和计算器代码。

滑块:

$( "#slider-gallons" ).slider({
        value:250,
        min: 250,
        max: 3000,
        step: 250,
        slide: function( event, ui ) {
            var_slider_gallons_pos = ui.value;
            $( "#slider-gallons-amount" ).html( "Your facility produces <span>" + var_slider_gallons_pos + "</span> Gallons of waste oil each year");
            recalculateSavings();
        }
    });

    /* these lines exist to populate the text values on load */
    /* I could probably do the var_slider_gallons_pos part differently here as well */

    var_slider_gallons_pos = $( "#slider-gallons" ).slider( "value" );
    $( "#slider-gallons-amount" ).html( "Your facility produces <span>" + $( "#slider-gallons" ).slider( "value" ) + "</span> Gallons of waste oil each year");

和计算功能:

function recalculateSavings() {
        var cost = {
            'calc-choice-natural-gas': 1.53,
            'calc-choice-electric': 4.86,
            'calc-choice-propane': 4.37,
            'calc-choice-fuel-oil': 3.74
        };

            /* this is the line causing me grief */
        savings = Math.round(cost[$('.selectable-div.selected').attr('id')] * var_slider_gallons_pos );
    $('#savings-calculator .calc-savings-one-year .savings').html('$' + formatNumber(savings));
    $('#savings-calculator .calc-savings-multiple-years .savings').html('$' + formatNumber(savings * var_slider_years_pos ));
}
4

1 回答 1

1

我找到了另一种方法!

我仍然不确定这是否是最好的方法,但我对此感到满意。

我在幻灯片函数中添加了以下代码,就在“recalculateSavings();”上方

$(this).slider('value', ui.value);

然后在数学函数中使用。

$( "#slider-gallons" ).slider( "value" );

这必须强制将值更新为 ui.value 在继续进行重新计算之前,这似乎可以实时更新计算结果。这让我摆脱了所有的全局函数。

于 2013-02-07T23:32:17.640 回答