]> source.dussan.org Git - jquery-ui.git/commitdiff
Slider: Fix max calculation, when step is float
authorJyoti Deka <dekajp@gmail.com>
Sat, 10 Jan 2015 01:06:32 +0000 (20:06 -0500)
committerScott González <scott.gonzalez@gmail.com>
Mon, 9 Feb 2015 16:59:38 +0000 (11:59 -0500)
Fixes #10721
Closes gh-1398
(cherry picked from commit ae1d6d5f90236405023964bb3061eccd6c625e39)

tests/unit/slider/slider_options.js
ui/slider.js

index defb6f3b0fb8cac5bd586b1b092499e4a79e3cdf..2badcc566f90f23dc515dc563fc8bcc6f62382f4 100644 (file)
@@ -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() {
index c96180dd275f0330a8f73a52b41e922383f43858..edc8b4027297c11989a0934f9db8bc3f1f88c01f 100644 (file)
@@ -547,8 +547,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() {