2

I have a jQuery UI range slider set up. When the slider controls are moved my code inserts the lower range value into a hidden input, and also the higher range value into a hidden input. These values constantly change as the slider is moving, but there is a problem. If the lower value stops on £60,000 for example, the value inserted into the hidden div will be £40,000. It is always 1 position out of sync. This is my first problem I need to fix. The values are set as #minPrice and #maxPrice in my code.

The second problem occurs on form submission. I need to get the values of the hidden inputs and (on the page load after the form submission) pass them back the to the text input that shows the range for the sliders e.g. 40,000 to 60,000. This input has the ID of #amount in the code.

Here is my code:

// 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)]);   

Any help will be much appreciated.

thecodedeveloper.com
  • 3,220
  • 5
  • 36
  • 67
Jonathan
  • 129
  • 2
  • 13

1 Answers1

4

To the first problem, you were using different means to set the #minPrice/#maxPrice and #amount inputs. I cleaned up the code a making it more readable and storing DOM objects and other important data into variables. This increases performance and makes the code much easier to debug. This refactored code always reports the correct values from the slider.

<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>

As for the second problem, it's hard to say exactly how you should accomplish that without seeing the rest of your code but in general all you have to do is make sure #maxPrice and #minPrice hidden variables are set to the correct values when the page loads and the slider will automatically display the correct information when it is instantiated because it checks for those values when it is constructed. For example, if you are using PHP and submitting the form via POST then you might use the following code for those hidden vars:

<!-- 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'; ?>" />
Joe Landsman
  • 2,177
  • 13
  • 9
  • Just a quick question, if I wanted to add a + symbol onto the end of the last value in the array, for example 2,000,000+, how would I do this? I cannot have the + symbol added to the end of the value in the hidden input though - it only needs to be added to the value in #amount? Again, any help would be great. – Jonathan Aug 25 '11 at 10:52
  • I made a couple of quick edits to the code to achieve this. Basically, I created variables for max/min price that creates the #amount box. If the max variable == the largest value in the increments array then I append a plus sign. – Joe Landsman Aug 25 '11 at 13:55
  • Thanks you! How do you know these things?!?! Jealous :-( – Jonathan Aug 25 '11 at 15:08
  • 1
    Years of last-minute deadlines and full pots of coffee! Keep working through the tough spots and you'll get there eventually. Also, when you get stuck try refactoring your code to make it simpler and easy to read. For example, I started off this script by defining all the variables i needed upfront. This made the logic easier to follow (and increased performance too!). As much as I like fancy jQuery one-liners, I'd rather have my code working properly. – Joe Landsman Aug 25 '11 at 15:21