2011-05-09 57 views
1

我在我的網站上有最小 - 最大價格範圍的範圍滑塊。滑塊兩側有兩個文本輸入框。我用滑塊創建了一個回調函數,該函數根據滑塊內的val變化來調整文本框的值。與相關文本輸入事件(失敗)的Jquery UI範圍滑塊

同時,我還想根據對文本框的閾值的更改來調整滑塊的值。現在,我在文本輸入上綁定的更改(也是嘗試過的按鍵)事件不會改變兩個範圍滑塊指針的值(位置)。這裏有什麼問題?

$('.price_slider').slider({orientation:"horizontal",range:true, animate:200,min:0,max:10000, step:100,value:0,values:[{{min_rent}},{{max_rent}}], slide:function(event,ui){ 
    $('input#lower_bound').val(ui.values[0]); 
    $('input#upper_bound').val(ui.values[1]); 
    } 
    }); 


$('input#lower_bound').change(function(){ 
    $('.price_slider').slider("values",[$(this).val(),$('input#upper_bound').val()]); 
}); 


$('input#upper_bound').change(function(){ 
    $('.price_slider').slider("values",[$('input#lower_bound').val(),$(this).val()]); 
}); 

EDIT--

馬特,我看到了你的修訂。只是好奇,如果你的版本比我的效率更高。礦似乎是工作,但顯然我不是專家:

$lower.add($upper).change(function() { 
    var lowEnd=parseInt($lower.val()); 
    var highEnd=parseInt($upper.val()); 

    if(highEnd>lowEnd){ 
     $slider.slider('values', 0, parseInt($lower.val(), 10)); 
     $slider.slider('values', 1, parseInt($upper.val(), 10)); 
    } 
    else{ 
     $slider.slider('values', 0, parseInt($lower.val(), 10)); 
     $slider.slider('values', 1, parseInt($lower.val(), 10)); 
     $upper.val([$lower.val()]); 
    } 
}); 

回答

3
  • 因爲,你需要使用'values',而不是'value'(你在做這)多處理滑塊但'values'藉此格式:

    .slider("values" , index , [value]) 
    
  • 你可能想設置基於文本框的滑塊值時,執行max >= min

  • 您正在將錯誤的初始值傳遞給.slider(),我不知道{{...}}廢話是從哪裏來的(是一個jQuery模板?)。
  • 一般是not a great idea to use underscores in class names。使用-而不是_

的修正:

var $slider = $('.price-slider'), 
    $lower = $('#lower_bound'), 
    $upper = $('#upper_bound'), 
    min_rent = 1000, 
    max_rent = 9000; 

$lower.val(min_rent); 
$upper.val(max_rent); 

$('.price-slider').slider({ 
    orientation: 'horizontal', 
    range: true, 
    animate: 200, 
    min: 0, 
    max: 10000, 
    step: 100, 
    value: 0, 
    values: [min_rent, max_rent], 
    slide: function(event,ui) { 
     $lower.val(ui.values[0]); 
     $upper.val(ui.values[1]); 
    } 
}); 

$lower.change(function() { 
    var low = $lower.val(), 
     high = $upper.val(); 
    low = Math.min(low, high); 
    $lower.val(low); 
    $slider.slider('values', 0, low); 
}); 

$upper.change(function() { 
    var low = $lower.val(), 
     high = $upper.val(); 
    high = Math.max(low, high); 
    $upper.val(high); 
    $slider.slider('values', 1, high); 
}); 

演示:http://jsfiddle.net/mattball/pLP2e/

+0

嗨馬特,這是一個很好的答案水平。它的工作,但有一些有趣的評論。首先,parseInt是沒有必要的。其次,{{括號是Django模板變量。我根據用戶以前的搜索設置範圍值。最後,我在文本輸入事件處理程序中創建了一個額外的條件。如果$ lower.val()> $ upper.val() - > $ upper.val([$ lower.val()])。否則,滑塊重疊在錯誤的方向和質樸的行爲導致 – Ben 2011-05-09 15:34:07

+0

我改變了文本輸入處理程序的邏輯,你看到最新版本? – 2011-05-09 15:38:28

+0

嗨馬特,我剛纔看到了變化。我看到你的工作原理,但我的(見上面的編輯)似乎需要更少的代碼。一般很好奇爲什麼一個人會優先於另一個人。 – Ben 2011-05-09 15:45:12

4

按照jQuery UI documentationslider('values')取索引作爲第二PARAM和值作爲所述第三。試試這個:

$('input#lower_bound').change(function(){ 
    $('.price_slider').slider("values",0,$(this).val()); 
    $('.price_slider').slider("values",1,$('input#upper_bound').val()); 
}); 


$('input#upper_bound').change(function(){ 
    $('.price_slider').slider("values",0,$('input#lower_bound').val()); 
    $('.price_slider').slider("values",1,$(this).val()); 
}); 
+0

謝謝達思。我認爲馬特用頭髮打你一拳。但是,這是一個很好的信息,無論 – Ben 2011-05-09 15:35:54

+0

是的,他是這樣做的,就像我要點擊提交按鈕一樣,但是既然我已經輸入了它,不過我仍然會發布它。 :) – DarthJDG 2011-05-09 15:43:59