首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >基于一个级别数组协调两个范围输入

基于一个级别数组协调两个范围输入
EN

Stack Overflow用户
提问于 2016-08-02 15:37:52
回答 2查看 50关注 0票数 0

我有一个应用程序,其中两个‘滑块’(HTML范围输入)相互作用,更新一个更新另一个。我正试图用最好的高层次方法来解决我需要做的事情。最初,滑块被更新为一致的整数'16‘。例如:

范围1

代码语言:javascript
复制
<input id="range-2" type='range' min='1' max='7' step='1' />

范围2

代码语言:javascript
复制
<input type='range' min='0' max='96'  step='16' id="range-3" />

最初,更新任一滑块的增量与步骤直接相关。例如,将第一个滑块从'1‘更新到'4’将使第二个滑块也从0升级到48。现在,客户端根据用户当前的步骤需要不同的值。例如,将slider 1从“1”更改为“2”,将slider 2从“0”更改为“4”,而将slider 1从“2”更改为“3”将使slider 2从“8”变为“16”。基本上,已经没有常数了。我只是想知道什么是最好的高级方法。

新值如下所示,左列显示slider 1中的更改,以及更新slider 2的增量

代码语言:javascript
复制
1 to 2 => 4
2 to 3 => 8
3 to 4 => 16
4 to 5 => 16
5 to 6 => 24
6 to 7 => 12

我的新Range 2看起来类似于:

代码语言:javascript
复制
<input type='range' min='0' max='80'  step='4' id="range-3" />

有人对我有什么开门见山的想法吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-08-02 16:30:03

这样做可能有很多不同的方法。一种可能是预先计算两个范围之间的对应表。

代码语言:javascript
复制
var slider = [
      document.getElementById('range-1'),
      document.getElementById('range-2')
    ],
    fromSlider = [ [], [] ];

function initSliderTables(step) {
  var p = 0;

  step.concat(0).forEach(function(s, i) {
    for(var j = 0; j <= s; j++) {
      fromSlider[1][p + j] = i + 1;
    }
    fromSlider[0][i + 1] = p;
    p += s;
  });
}

function update(from) {
  slider[from ^ 1].value = fromSlider[from][slider[from].value];
  
  document.getElementById('debug0').innerHTML = slider[0].value;
  document.getElementById('debug1').innerHTML = slider[1].value;
}

initSliderTables([ 4, 8, 16, 16, 24, 12 ]);
update(0);
代码语言:javascript
复制
<input id="range-1" type='range' onchange="update(0)" min='1' max='7' step='1' />
<span id="debug0"></span><br>
<input id="range-2" type='range' onchange="update(1)" min='0' max='80' step='4' />
<span id="debug1"></span>

我们可以通过执行以下操作来避免for循环:

代码语言:javascript
复制
step.concat(1).forEach(function(s, i) {
  fromSlider[1] = fromSlider[1].concat(Array(s).fill(i + 1));
  fromSlider[0][i + 1] = p;
  p += s;
});

然而,.fill()还不是所有浏览器都支持的。

票数 1
EN

Stack Overflow用户

发布于 2016-08-02 16:27:33

一种简单的方法可以是定义一个带有增量的数组,并使用它来定义范围设置;在这个示例中,我编写了一个简单的增量,因为我不了解您的确切需求,但这就是想法,然后您可以简单地更改' change‘事件上的操作。

代码语言:javascript
复制
var increments = [0,4,8,16,16,24,12];

$('#range-3').attr('max', increments.reduce((a, b) => a + b, 0));
$('#range-3').attr('step', Math.min.apply(null,increments.slice(1,increments.length)));

$('#range-2').on('change', function() {
    $('#range-3').val($('#range-2').val() + increments[$(this).val()-1]);
});

这里有个小摆弄

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/38724899

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档