diff options
author | Jyoti Deka <dekajp@gmail.com> | 2015-01-09 20:06:32 -0500 |
---|---|---|
committer | Scott González <scott.gonzalez@gmail.com> | 2015-01-12 12:20:57 -0500 |
commit | ae1d6d5f90236405023964bb3061eccd6c625e39 (patch) | |
tree | fdc626c82a6531046ad2257e39fc3141c8977784 | |
parent | a3b43eeb58a290f9447ac4127d145ef121ca255c (diff) | |
download | jquery-ui-ae1d6d5f90236405023964bb3061eccd6c625e39.tar.gz jquery-ui-ae1d6d5f90236405023964bb3061eccd6c625e39.zip |
Slider: Fix max calculation, when step is float
Fixes #10721
Closes gh-1398
-rw-r--r-- | tests/unit/slider/slider_options.js | 14 | ||||
-rw-r--r-- | ui/slider.js | 22 |
2 files changed, 33 insertions, 3 deletions
diff --git a/tests/unit/slider/slider_options.js b/tests/unit/slider/slider_options.js index defb6f3b0..2badcc566 100644 --- a/tests/unit/slider/slider_options.js +++ b/tests/unit/slider/slider_options.js @@ -40,7 +40,7 @@ test( "disabled", function(){ }); test( "max", function() { - expect( 4 ); + expect( 5 ); element = $( "<div></div>" ); options = { @@ -72,6 +72,18 @@ test( "max", function() { ok( element.slider( "value" ) === options.max, "value method will max, step is changed" ); element.slider( "destroy" ); + options = { + max: 60, + min: 50, + orientation: "horizontal", + step: 0.1, + value: 60 + }; + + element.slider( options ); + ok( element.slider( "value" ) === options.max, "value method will max, step is changed and step is float" ); + element.slider( "destroy" ); + }); test( "min", function() { diff --git a/ui/slider.js b/ui/slider.js index 9cb088c88..33eb55b3e 100644 --- a/ui/slider.js +++ b/ui/slider.js @@ -552,8 +552,26 @@ return $.widget( "ui.slider", $.ui.mouse, { }, _calculateNewMax: function() { - var remainder = ( this.options.max - this._valueMin() ) % this.options.step; - this.max = this.options.max - remainder; + var max = this.options.max, + min = this._valueMin(), + step = this.options.step, + aboveMin = Math.floor( ( max - min ) / step ) * step; + max = aboveMin + min; + this.max = parseFloat( max.toFixed( this._precision() ) ); + }, + + _precision: function() { + var precision = this._precisionOf( this.options.step ); + if ( this.options.min !== null ) { + precision = Math.max( precision, this._precisionOf( this.options.min ) ); + } + return precision; + }, + + _precisionOf: function( num ) { + var str = num.toString(), + decimal = str.indexOf( "." ); + return decimal === -1 ? 0 : str.length - decimal - 1; }, _valueMin: function() { |