2010-08-15 7 views
8

मैं एक पृष्ठ को लागू करने की कोशिश कर रहा हूं जहां 4 jQuery-UI स्लाइडर हैं, और मैं इसे बनाना चाहता हूं ताकि सभी 4 स्लाइडर्स का संयुक्त कुल 400 से अधिक न हो।एकाधिक jQuery-UI स्लाइडर्स के लिए संयुक्त कुल

मुझे कोई फर्क नहीं पड़ता कि यह किस तरह कार्यान्वित किया गया है, यह 0 प्रारंभ से हो सकता है, और जैसे ही आप 1 स्लाइडर बदलते हैं, शेष उपलब्ध कुल अधिकतम स्लाइडर को कम करता है या अधिकतम स्लाइडर सेट करता है, अन्य स्लाइडर्स पर मान कम करता है ।

पीएस स्लाइडर्स 10 की वृद्धि में जाते हैं।

सभी विचार & सुझावों का स्वागत है, और यदि आप परीक्षण करना चाहते हैं तो मैंने jsFiddle स्थापित किया है।

उत्तर

13

खैर यहाँ फिर जाना:

var sliders = $("#sliders .slider"); 

sliders.each(function() { 
    var value = parseInt($(this).text(), 10), 
     availableTotal = 400; 

    $(this).empty().slider({ 
     value: 0, 
     min: 0, 
     max: 400, 
     range: "max", 
     step: 10, 
     slide: function(event, ui) { 
      // Update display to current value 
      $(this).siblings().text(ui.value); 

      // Get current total 
      var total = 0; 

      sliders.not(this).each(function() { 
       total += $(this).slider("option", "value"); 
      }); 

      // Need to do this because apparently jQ UI 
      // does not update value until this event completes 
      total += ui.value; 

      var max = availableTotal - total; 

      // Update each slider 
      sliders.not(this).each(function() { 
       var t = $(this), 
        value = t.slider("option", "value"); 

       t.slider("option", "max", max + value) 
        .siblings().text(value + '/' + (max + value)); 
       t.slider('value', value); 
      }); 
     } 
    }); 
}); 

यहाँ इस का एक सरल डेमो है: http://jsfiddle.net/yijiang/Y5ZLL/4/

+0

यह बहुत बढ़िया है, बहुत बहुत धन्यवाद! – Marko

9

100% के प्रतिशत को दिखाने के लिए ऊपर जवाब का एक अद्यतन संस्करण बनाया। इसलिए जब आप एक स्लाइडर को समायोजित करते हैं, तो प्रत्येक स्लाइडर का प्रतिशत बनाने में दो अन्य कमी 100% तक बढ़ जाती है। इसके अलावा यह आसान प्रारंभिक मान

JSfiddle

var sliders = $("#sliders .slider"); 
var availableTotal = 100; 

sliders.each(function() { 
    var init_value = parseInt($(this).text()); 

    $(this).siblings('.value').text(init_value); 

    $(this).empty().slider({ 
     value: init_value, 
     min: 0, 
     max: availableTotal, 
     range: "max", 
     step: 2, 
     animate: 0, 
     slide: function(event, ui) { 

      // Update display to current value 
      $(this).siblings('.value').text(ui.value); 

      // Get current total 
      var total = 0; 

      sliders.not(this).each(function() { 
       total += $(this).slider("option", "value"); 
      }); 

      // Need to do this because apparently jQ UI 
      // does not update value until this event completes 
      total += ui.value; 

      var delta = availableTotal - total; 

      // Update each slider 
      sliders.not(this).each(function() { 
       var t = $(this), 
        value = t.slider("option", "value"); 

       var new_value = value + (delta/2); 

       if (new_value < 0 || ui.value == 100) 
        new_value = 0; 
       if (new_value > 100) 
        new_value = 100; 

       t.siblings('.value').text(new_value); 
       t.slider('value', new_value); 
      }); 
     } 
    }); 
}); 
+0

मेरे अनुभव से यह केवल तभी काम करता है जब आप चरण 1 सेट करते हैं और 'var new_value = value + (डेल्टा/2) पंक्ति बदलते हैं; 'var var_value = value + (डेल्टा);' –

+0

@ ZZ5 जो आपके पास काम करता है कुल मिलाकर केवल 2 स्लाइडर, जबकि यह उत्तर केवल तभी काम करता है जब आपके पास 3. एन स्लाइडर्स के साथ एक सामान्य समाधान अधिक जटिल होगा। इसके अलावा, यूएक्स कुल मिलाकर बहुत खराब है (यानी 70% - 15% - 15% का चयन करने का प्रयास करें)। – alexcasalboni

3

मैंने पाया जब अन्य स्लाइडर (एक आप जा रहे हैं के अलावा अन्य लोगों) के चारों ओर ले जाते हैं, यह ध्यान भंग है स्थापित करने के लिए बनाया है। मैंने यी जियांग फीडल को भी संशोधित किया है, जब आप कुल 400 तक पहुंचते हैं तो बस इसे रोक दें। यदि आप उस स्लाइडर को उच्चतर जाना चाहते हैं, तो आपको सबसे पहले एक दूसरे को कम करना होगा जैसे कि पहला , लेकिन यह समग्र कुल के सापेक्ष स्लाइडर रखता है।

इसका मतलब है कि जब आपके पास 25% पर एक स्लाइडर होता है और दूसरा 50% पर होता है, तो ऐसा लगता है कि वे क्रमश: 25 और 50 पर हैं।

JSfiddle

var sliders = $("#sliders .slider"); 

sliders.each(function() { 
    var value = parseInt($(this).text(), 10), 
     availableTotal = 400; 

    $(this).empty().slider({ 
     value: 0, 
     min: 0, 
     max: 400, 
     range: "max", 
     step: 10, 
     animate: 100, 
     slide: function(event, ui) { 

      // Get current total 
      var total = 0;  

      sliders.not(this).each(function() { 
       total += $(this).slider("option", "value"); 
      });  


      var max = availableTotal - total;    

      if (max - ui.value >= 0) { 
       // Need to do this because apparently jQ UI 
       // does not update value until this event completes 
       total += ui.value; 
       console.log(max-ui.value); 
       $(this).siblings().text(ui.value); 
      } else { 
       return false; 
      } 
     } 
    }); 
}); 
0

नहीं इन उत्तरों की एक एकल एक किसी भी प्रभावी तरीके से एक दूसरे के सापेक्ष में स्लाइडर को बदलने के लिए कम से कम बिट प्रभावी था ... उनमें से ज्यादातर को छोड़ दिया एक या गणना का अधिकाधिक लाभ उठाएं या समग्र सीमा का सम्मान नहीं किया, मुझे किसी उपयोगकर्ता को एचटीएमएल 5 गेम में अपने चिप्स लेने की इजाजत देने के लिए कुछ चाहिए था, इसलिए अगर मैं किसी और के पास एक समान समस्या हो तो मैं इसके साथ आया ... अगर आपको इसे टाई करने की ज़रूरत नहीं है सट्टेबाजी चिप्स को बदलने की तरह कुछ तो स्टॉप विकल्प निकालें या अपनी जरूरतों के अनुसार इसे बदलें

<div id="chip_holder" style="float:right;margin-right:20px;"> 
    <ul id="sliders"> 
    <?php 
    $chips = array("1" => array("blue", "1 Point", "1"), "5" => array("red", "5 Points", "5"), "10" => array("gold", "10 Points", "10")); 

     $t = 0; 
     $value_per_row = floor($my_points/count($chips)); 
      $totalc = 0; 
     foreach($chips as $key => $value){ 
     $value = floor($value_per_row/$value[2]); 
     $totalc = $totalc + $value_per_row; 
     ?> 
     <li style="display:inline-block;"> 
       <input type="number" style="display:none;" id="hidden_value_<?php echo $key; ?>" value="<?php echo floor($value); ?>" min="0" max="<?php echo $my_points; ?>" step="<?php echo $chips[$key][2]; ?>" /> 
       <span id="slide_<?php echo $key; ?>" title="<?php echo $key; ?>" class="chip_slider" alt="<?php echo $key/$my_points; ?>"></span> 
       <span id="chip_label_<?php echo $key; ?>" title="<?php echo $key; ?>" class="chip_label"><?php echo $value; ?></span> 
     </li> 
    <?php 
     $t++; 
     } 
     if($totalc < $my_points){ 
     $min = min(array_keys($chips)); 
     $remainder = floor(($my_points - $totalc)/$chips[$min][2]); 
    ?> 
     <script> 

      $('#hidden_value_<?php echo $min; ?>').val(parseInt($('#hidden_value_<?php echo $min; ?>').val()) + parseInt(<?php echo $remainder; ?>)); 
      $('#chip_label_<?php echo $min; ?>').text(parseInt($('#hidden_value_<?php echo $min; ?>').val())); 
     </script> 
     <?php } ?> 
      <li id="checkout_button" onclick="javascript: checkout_now();"><?php echo CASHOUT; ?></li> 

     </ul> 
     <ul id="chips_stay_put"> 
     <?php 
      $t = 0; 
      foreach($chips as $key => $value){ 
      ?> 
       <li class="chip_holder" style="width:70px;"> 
        <span id="chip_holder_<?php echo $key; ?>" class="<?php echo $value[0]; ?>" alt="<?php echo $key; ?>"></span> 
      </li> 
       <?php 
      $t++; 
      } 
     ?> 
     </ul> 
     </div> 
<script> 
function drop_chips(id, chips){ 

$('.chip_label').each(function(){ 

     id =$(this).attr('id'); 
     idx =$('#' + id).attr('title'); 
    chips = parseInt($('#chip_label_' + idx).text()); 
    cls = $('#chip_holder_' + idx).attr('class'); 

    $('#chip_holder_' + idx).html(''); 

    m = minMaxTitle($('.chip.' + cls)); 

    if(m>0){ 
     start = 0; 
    }else{ 
     start = m; 
    } 
    htmlH = ''; 

     while(m<=chips){ 
     start= start + m; 
      zIndex = parseInt(start) + parseInt(100); 

      htmlH += '<span id="chip_' + idx + '_' + m + '" class="chip ' + cls + '" style="position:absolute;top:-'+ (m * 3) + 'px;z-index:' + zIndex + ';" alt="' + cls + '" title="' +m+ '">' + idx + '</span>'; 

      m++; 

    } 

    $('#chip_holder_' + idx).html(htmlH); 


     $('.chip').draggable({ 
      drag: function(event, ui) { 
       var snapTolerance = $(this).draggable('option', 'snapTolerance'); 
       var topRemainder = ui.position.top % 20; 
       var leftRemainder = ui.position.left % 20; 

       if (topRemainder <= snapTolerance) { 
       ui.position.top = ui.position.top - topRemainder; 
       } 

       if (leftRemainder <= snapTolerance) { 
       ui.position.left = ui.position.left - leftRemainder; 
       } 
      } , 

      revert : function(event, ui) { 
       // on older version of jQuery use "draggable" 
        // $(this).data("draggable") 
        // on 2.x versions of jQuery use "ui-draggable" 
        // $(this).data("ui-draggable") 
        $(this).data("uiDraggable").originalPosition = { 
        top : 0, 
        left : 0 
        }; 
        // return boolean 
        return !event; 
        // that evaluate like this: 
        // return event !== false ? false : true; 
       } 

     }); 
    }); 

} 
var sliders = $("#sliders .chip_slider"); 

sliders.each(function() { 
    var slider_id; 
    var value = parseInt($(this).text(), 10), 
     availableTotal = parseInt($('#my_points_hidden').val()); 

    $(this).empty().slider({ 
     value: parseInt($('#' + $(this).attr('id')).prev('input').val()), 
     min: 0, 
     max: parseInt($('#' + $(this).attr('id')).prev('input').attr('max')), 
     range:parseInt($('#' + $(this).attr('id')).prev('input').attr('max')), 
     orientation:"vertical", 
     step: 1, 
     animate: 100, 
     stop: function(event, ui) { drop_chips() }, 
     slide: function(event, ui) { 

     // Update display to current value 
      $(this).siblings('.value').text(ui.value); 

      // Get current total 
      var total = 0; 

     var slider_id = $(this).attr('title'); 

      sliders.not(this).each(function() { 
       total += $(this).slider("option", "value"); 
      }); 

      // Need to do this because apparently jQ UI 
      // does not update value until this event completes 
      total += ui.value; 

      var delta = availableTotal - total; 

      // Update each slider 
      sliders.not(this).each(function() { 
       var t = $(this), 
        value = t.slider("option", "value"); 

       var new_value = value + (delta/2); 

       if (new_value < 0 || ui.value == 100) 
        new_value = 0; 
       if (new_value > 100) 
        new_value = 100; 

       t.siblings('.value').text(new_value); 
       t.slider('value', new_value); 
       id = $(this).attr('id'); 

       title = $('#' + id).attr('title'); 
       initial_slider = total - new_value; 
       console.log(slider_id); 
     $('#chip_label_' + slider_id).text(parseInt(parseInt(ui.value)/parseInt($('#hidden_value_' + slider_id).attr('step')))); 
       $('#chip_label_' + title).text(parseInt(parseInt(new_value)/parseInt($('#hidden_value_' + title).attr('step')))); 
       }); 

     } 

    }); 
}); 

</script> 
संबंधित मुद्दे