2011-11-06 21 views
9

que utilizo para deslizador logarítmica este código jQuery UI:jQuery UI regulador de escala logarítmica

var minVal = 10; var maxVal = 100; $("#slider").slider({ 
    range: true, 
    min: minVal, 
    max: maxVal/2, 
    values: [ minVal, maxVal ], 
    slide: function(event, ui) { 
     $("#amount_min").val(Number(expon(ui.values[ 0 ], minVal, maxVal)).toFixed(0)); 
     $("#amount_max").val(Number(expon(ui.values[ 1 ], minVal, maxVal)).toFixed(0)); 

    } 
}); 

La función expon:

function expon(val, min,max) 
{ 

     var minv = Math.log(min); 
     var maxv = Math.log(max); 
     max = max/2; 

     // calculate adjustment factor 
     var scale = (maxv-minv)/(max-min); 

     return Math.exp(minv + scale*(val-min)); 

} 

Y #amount_min y #amount_max son elementos de entrada HTML. El código anterior funciona bien para obtener valores del control deslizante y para ponerlo en los elementos de entrada.

Pero ahora necesito la función opuesta a expon() - para cambiar el control deslizante cuando cambio el valor de la entrada. ¿Puede alguien ayudarme con esto?

+0

¿Alguna vez resolvió esto? – Homan

+0

yep:) ... funcionó –

+0

posible duplicación de [JQuery UI Slider con pasos no lineales/exponenciales/logarítmicos] (http://stackoverflow.com/questions/7484695/jquery-ui-slider-with-non -prolongar-exponencial-pasos logarítmicos) – gaitat

Respuesta

10

he encontrado la solución aquí: Logarithmic slider

He utilizado el código de gran ayuda para un proyecto ... esto es lo que tengo:

var gMinPrice = 100; 
var gMaxPrice = 1000; //in my project these are dynamic 

function expon(val){ 
    var minv = Math.log(gMinPrice); 
    var maxv = Math.log(gMaxPrice); 
    var scale = (maxv-minv)/(gMaxPrice-gMinPrice); 
    return Math.exp(minv + scale*(val-gMinPrice)); 

} 
function logposition(val){ 
    var minv = Math.log(gMinPrice); 
    var maxv = Math.log(gMaxPrice); 
    var scale = (maxv-minv)/(gMaxPrice-gMinPrice); 
    return (Math.log(val)-minv)/scale + gMinPrice; 
} 

luego de que cambie de posiciones de los deslizadores de utilizar este código:

var gBudgetBottom, gBudgetTop; 
$('#priceSlider').slider({ 
    change: function(event, ui){ // inside your slider instance 
     gBudgetBottom = Number(expon(ui.values[0])).toFixed(0); 
     gBudgetTop = Number(expon(ui.values[1])).toFixed(0); 
    } 
} 

$('#priceSlider').slider({ values: [Number(logposition(gBudgetBottom)).toFixed(0), Number(logposition(gBudgetTop)).toFixed(0)] }); 

espero que funcione para usted :)

+1

Debe marcar su respuesta como "aceptada", para que quede claro para las personas que se encuentran con la pregunta que esta fue la solución. – IMSoP

+1

Esta debería ser la solución. Simple y elegante. – BBagi

3

Esto es lo que hice:

var resStepValues = [0, .01, .02, .03, .04, .05, 1, 1.5, 2, 3, 4, 5, 10, 20, 30, 40, 50, 60, 70, 80, 90, 100, 150, 200, 250, 300, 500, 750, 1000, 1500]; 

var slider = $("#resolution_slider").slider({ 
    animate: true, 
    min: 0, 
    max: 29, 
    range: 'min', 
    values: [0, 29], 
    slide: function (event, ui) { 

     if (ui.values[0] > ui.values[1]) { 
      $("#txtMaxRes").val(resStepValues[ui.values[1]]); 
      $("#txtMinRes").val(resStepValues[ui.values[0]]); 

     } else { 
      $("#txtMaxRes").val(resStepValues[ui.values[0]]); 
      $("#txtMinRes").val(resStepValues[ui.values[1]]); 
     } 
    } 

});