jQuery范围滑块 - 获取表单提交的范围值?

Posted

技术标签:

【中文标题】jQuery范围滑块 - 获取表单提交的范围值?【英文标题】:jQuery range slider - get range values on form submission? 【发布时间】:2011-08-23 19:06:06 【问题描述】:

我设置了一个 jQuery UI 范围滑块。当滑块控件移动时,我的代码将较低范围值插入隐藏输入,并将较高范围值插入隐藏输入。这些值随着滑块的移动而不断变化,但有一个问题。例如,如果较低的值停在 60,000 英镑,则插入隐藏 div 的值将是 40,000 英镑。它始终是 1 个位置不同步。这是我需要解决的第一个问题。这些值在我的代码中设置为 #minPrice 和 #maxPrice。

第二个问题出现在表单提交上。我需要获取隐藏输入的值并(在表单提交后的页面加载上)将它们传递回显示滑块范围的文本输入,例如40,000 到 60,000。此输入在代码中的 ID 为#amount。

这是我的代码:

// Set increments for sale slider prices
    var increments = ['0', '20,000', '40,000', '60,000', '80,000', '100,000', '120,000', '140,000', '160,000', '180,000', '200,000', '220,000', '240,000', '260,000', '280,000', '300,000', '320,000', '340,000', '360,000', '380,000', '400,000', '420,000', '440,000', '460,000', '480,000', '500,000', '520,000', '540,000', '560,000', '580,000', '600,000', '620,000', '640,000', '660,000', '680,000', '700,000', '720,000', '740,000', '760,000', '780,000', '800,000', '820,000', '840,000', '860,000', '880,000', '900,000', '920,000', '940,000', '960,000', '980,000', '1,000,000', '1,100,000', '1,200,000', '1,300,000', '1,400,000', '1,500,000', '1,600,000', '1,700,000', '1,800,000', '2,000,000']

$('#sliderPriceSale').slider(
    range: true,
    min: 0,
    step: 1,
    max: 59,
    values: [4, 15],
    slide: function (event, ui) 
        $('#amount').val(increments[ui.values[0]] + " to " + increments[ui.values[1]]);

        var minPrice = $("#sliderPriceSale").slider("values", 0);
        $('#minPrice').val(increments[minPrice]);
        var maxPrice = $("#sliderPriceSale").slider("values", 1);
        $('#maxPrice').val(increments[maxPrice]);
    
);
$('#amount').val(increments[$('#sliderPriceSale').slider("values", 0)] + " to " + increments[$('#sliderPriceSale').slider("values", 1)]);   

任何帮助将不胜感激。

【问题讨论】:

【参考方案1】:

对于第一个问题,您使用不同的方法来设置 #minPrice/#maxPrice 和 #amount 输入。我清理了代码,使其更具可读性,并将 DOM 对象和其他重要数据存储到变量中。这提高了性能并使代码更容易调试。此重构代码始终从滑块报告正确的值。

<script type="text/javascript">
$(document).ready(function()  
    // Set increments for sale slider prices
    var increments = ['0', '20,000', '40,000', '60,000', '80,000', '100,000', '120,000', '140,000', '160,000', '180,000', '200,000', '220,000', '240,000', '260,000', '280,000', '300,000', '320,000', '340,000', '360,000', '380,000', '400,000', '420,000', '440,000', '460,000', '480,000', '500,000', '520,000', '540,000', '560,000', '580,000', '600,000', '620,000', '640,000', '660,000', '680,000', '700,000', '720,000', '740,000', '760,000', '780,000', '800,000', '820,000', '840,000', '860,000', '880,000', '900,000', '920,000', '940,000', '960,000', '980,000', '1,000,000', '1,100,000', '1,200,000', '1,300,000', '1,400,000', '1,500,000', '1,600,000', '1,700,000', '1,800,000', '2,000,000'];
    var amount = $('#amount');
    var minPrice = $('#minPrice');
    var maxPrice = $('#maxPrice');
    var slider = $('#sliderPriceSale');
    var initValuesMinIndex = $.inArray(minPrice.val(), increments); // Get index of value in #minPrice
    var initValuesMaxIndex = $.inArray(maxPrice.val(), increments); // Get index of value in #maxPrice
    var minPriceString = '';
    var maxPriceString = '';

    // Setup slider. Initialize #amount on creation.
    slider.slider(
        range: true,
        min: 0,
        max: 59,
        step: 1,
        values: [initValuesMinIndex, initValuesMaxIndex],
        create: function() 
            amount.val(increments[initValuesMinIndex] + " to " + increments[initValuesMaxIndex]);
        ,
        slide: function (event, ui) 
            // Get max/min price strings. If max price is == largest value append "+" sign.
            minPriceString = increments[ui.values[0]];
            maxPriceString = (increments[ui.values[1]] == increments[increments.length-1]) ? increments[ui.values[1]] + "+" : increments[ui.values[1]];

            amount.val(minPriceString + " to " + maxPriceString);
            minPrice.val( increments[ui.values[0]] );
            maxPrice.val( increments[ui.values[1]] );                 
        
    );
);
</script>

至于第二个问题,如果不查看其余代码,很难确切说明您应该如何完成,但通常您所要做的就是确保将 #maxPrice 和 #minPrice 隐藏变量设置为正确的值当页面加载时,滑块将在实例化时自动显示正确的信息,因为它会在构造时检查这些值。例如,如果您使用 php 并通过 POST 提交表单,那么您可以对这些隐藏变量使用以下代码:

<!-- Output minPrice & maxPrice values. Default to 80,000 and 300,000 respectively -->
<input type="hidden" id="minPrice" name="minPrice" value="<?php echo (isset($_POST['minPrice'])) ? $_POST['minPrice'] : '80,000'; ?>" />
<input type="hidden" id="maxPrice" name="maxPrice" value="<?php echo (isset($_POST['maxPrice'])) ? $_POST['maxPrice'] : '300,000'; ?>" />

【讨论】:

没问题!很高兴我能帮上忙。 只是一个简单的问题,如果我想在数组的最后一个值的末尾添加一个 + 符号,例如 2,000,000+,我该怎么做?我不能将 + 符号添加到隐藏输入中的值的末尾 - 它只需要添加到 #amount 中的值?同样,任何帮助都会很棒。 我对代码做了几个快速编辑来实现这一点。基本上,我为创建#amount 框的最大/最小价格创建了变量。如果最大变量 == 增量数组中的最大值,那么我会附加一个加号。 谢谢!你怎么知道这些东西?!?!嫉妒:-( 多年的最后期限和满满一壶咖啡!继续努力克服困难,你最终会到达那里。此外,当您遇到困难时,请尝试重构代码以使其更简单易读。例如,我通过预先定义我需要的所有变量来启动这个脚本。这使得逻辑更容易理解(也提高了性能!)。尽管我喜欢花哨的 jQuery 单行代码,但我宁愿让我的代码正常工作。

以上是关于jQuery范围滑块 - 获取表单提交的范围值?的主要内容,如果未能解决你的问题,请参考以下文章

从输入类型=范围中获取值

JQuery UI 范围滑块值

是否可以根据其他表单的输入来更改 HTML5 范围滑块的最小值和最大值?

jQuery滑块范围:应用范围作为表格行的过滤器

具有每小时美元价值的 jquery 范围滑块

带有两个范围滑块过滤器的 jQuery 数据表