【问题标题】:How can I divide a string and assign a variable for each one?如何划分字符串并为每个字符串分配一个变量?
【发布时间】:2021-06-24 23:54:47
【问题描述】:

我正在构建一个图像编辑器。为了进行预设,我为每个按钮分配了一个自定义 data 值。每个按钮在单击时会将其内部值设置为文档中所有范围滑块的值。

我首先为每个 filter-container 分配一个 onclick 函数来解决这个问题,该函数会删除字符串并构建一个新函数。我将此功能分配给现有按钮。 最后,我点击了这个按钮。

function setPreset(inp) {
    const key = inp.getAttribute("data-preset-key");
    document.getElementById("newbut").setAttribute("onclick", "useKey('" + key.replaceAll("-", "', '") + "')");
    document.getElementById("newbut").click()
}

分配给按钮的函数很长,每次引入新输入时我都必须添加一个新变量。这就是为什么我来寻求你的帮助。函数可以将字符串分隔成唯一值吗?

我希望我的意思明白了。

//编辑,codepen sn-p:

//------------------------------- set preset
function keyReaderActivate() {
  var inputs = document.querySelectorAll(".user-input");
  for (var i = 0; i < inputs.length; i++) {
    inputs[i].addEventListener("input", function() {
      logVals();
    });
  }
  var setter = document.querySelectorAll(".filter-container");
  for (var i = 0; i < setter.length; i++) {
    setter[i].addEventListener("click", function() {
      setPreset(this);
    });
  }
}

function setPreset(inp) {
  const key = inp.getAttribute("data-preset-key");
  document.getElementById("demo").innerHTML = key.replaceAll("-", ", ");
  document.getElementById("newbut").setAttribute("onclick", "useKey('" + key.replaceAll("-", "', '") + "')");
  document.getElementById("newbut").click()
}

function useKey(a, b, c, d, e, f) {
  var list = document.querySelectorAll(".user-input");
  list[0].value = a;
  list[1].value = b;
  list[2].value = c;
  list[3].value = d;
  list[4].value = e;
  list[5].value = f;
}

function logVals() {
  var list = document.querySelectorAll(".user-input");
  const arr = [];
  for (var i = 0; i < list.length; i++) {
    const computers = list[i].value;
    arr.push(computers);
  }
  document.getElementById("demo").innerHTML = arr.join("-");
}
nav {
  display: flex;
  justify-content: space-around
}

nav * {
  border: solid;
  width: 20%;
  text-align: center;
  border-radius: 5px;
}
<body onload="keyReaderActivate()">
  <div id="demo-intro"></div>
  <div id="demo"></div>
  <nav>
    <div data-preset-key="20-14-70-62-100-50" id="1" class="filter-container">A</div>
    <div data-preset-key="10-50-11-50-100-30" id="2" class="filter-container">B</div>
    <div data-preset-key="80-100-11-62-50-50" id="3" class="filter-container">C</div>
    <div data-preset-key="50-50-100-62-100-70" id="4" class="filter-container">D</div>
  </nav>

  <div id="demo-name"></div>
  <ul>
    <li><input type="range" class="user-input"></li>
    <li><input type="range" class="user-input"></li>
    <li><input type="range" class="user-input"></li>
    <li><input type="range" class="user-input"></li>
    <li><input type="range" class="user-input"></li>
    <li><input type="range" class="user-input"></li>
  </ul>
  <button id="newbut">Check it</button>
</body>
function useKey(a, b, c, d, e, f) {
    var list = document.querySelectorAll(".user-input");
    list[0].value = a;
    list[1].value = b;
    list[2].value = c;
    list[3].value = d;
    list[4].value = e;
    list[5].value = f;
}

【问题讨论】:

  • split() 方法不是做你想做的吗?
  • 它最初是为了获取子字符串。然后呢?我如何为每个分配一个?
  • 拆分成数组后,可以循环赋值给list[i].value
  • vals = this.dataset.presetKey.split("-"); vals.forEach((val, i) =&gt; list[i].value = val);
  • 与此结合起来看起来如何:function setPreset(inp) { const key = inp.getAttribute("data-preset-key"); document.getElementById("demo").innerHTML = key.split("-"); 我要在这里添加它吗?` } ` 我的意思是:list[I]value; vals = this.dataset.presetKey.split("-"); vals.forEach((val, i) =&gt; list[i].value = val);

标签: javascript arrays string variables


【解决方案1】:

使用.split('-') 拆分数据值,然后将值分配给每个输入。

而不是每次单击预设时都为按钮分配一个新的onclick 属性,您可以使用全局变量来保存选定的预设,并在点击侦听器中引用它。

let selectedPreset;

//------------------------------- set preset
function keyReaderActivate() {
  var inputs = document.querySelectorAll(".user-input");
  for (var i = 0; i < inputs.length; i++) {
    inputs[i].addEventListener("input", function() {
      logVals();
    });
  }
  var setter = document.querySelectorAll(".filter-container");
  for (var i = 0; i < setter.length; i++) {
    setter[i].addEventListener("click", function() {
      setPreset(this);
    });
  }
  document.querySelector("#newbut").addEventListener("click", function() {
    if (selectedPreset) {
      let keys = selectedContainer.dataset.presetKey.split('-');
      keys.forEach((key, i) => inputs[i].value = key);
    }
  });
}

function setPreset(inp) {
  const key = inp.getAttribute("data-preset-key");
  document.getElementById("demo").innerHTML = key.replaceAll("-", ", ");
  selectedPreset = inp;
  document.getElementById("newbut").click()
}

function logVals() {
  var list = document.querySelectorAll(".user-input");
  const arr = [];
  for (var i = 0; i < list.length; i++) {
    const computers = list[i].value;
    arr.push(computers);
  }
  document.getElementById("demo").innerHTML = arr.join(", ");
}
nav {
  display: flex;
  justify-content: space-around
}

nav * {
  border: solid;
  width: 20%;
  text-align: center;
  border-radius: 5px;
}
<body onload="keyReaderActivate()">
  <div id="demo-intro"></div>
  <div id="demo"></div>
  <nav>
    <div data-preset-key="20-14-70-62-100-50" id="1" class="filter-container">A</div>
    <div data-preset-key="10-50-11-50-100-30" id="2" class="filter-container">B</div>
    <div data-preset-key="80-100-11-62-50-50" id="3" class="filter-container">C</div>
    <div data-preset-key="50-50-100-62-100-70" id="4" class="filter-container">D</div>
  </nav>

  <div id="demo-name"></div>
  <ul>
    <li><input type="range" class="user-input"></li>
    <li><input type="range" class="user-input"></li>
    <li><input type="range" class="user-input"></li>
    <li><input type="range" class="user-input"></li>
    <li><input type="range" class="user-input"></li>
    <li><input type="range" class="user-input"></li>
  </ul>
  <button id="newbut">Check it</button>
</body>

【讨论】:

    【解决方案2】:

    抱歉,您的代码非常复杂,每次移动 html 范围控件时都必须对其进行重构。

    我的代码是一个镜头原型(远非完美),它应该让您了解如何以更通用的方式解决这个问题:

    const profiles = [
        { value1: 20, value2: 14, value3: 70, value4: 62, value5: 100, value6: 50 },
        { value1: 10, value2: 50, value3: 11, value4: 50, value5: 100, value6: 30 },
        { value1: 80, value2: 100, value3: 11, value4: 62, value5: 50, value6: 50 },
        { value1: 50, value2: 50, value3: 100, value4: 62, value5: 100, value6: 70 }
    ];
    
    function loadProfile(number) {
      const rangeControls = document.querySelectorAll('.user-input');
      for (let i=0; i<rangeControls.length;i++) {
        rangeControls[i].value = profiles[number][rangeControls[i].id];
      }
    }
    nav {
      display: flex;
      justify-content: space-around;
    }
    
    nav * {
      border: solid;
      width: 20%;
      text-align: center;
      border-radius: 5px;
    }
    <body>
      <div id="demo-intro"></div>
      <div id="demo"></div>
      <nav>
        <div id="1" class="filter-container" onclick="loadProfile(0)">A</div>
        <div id="2" class="filter-container" onclick="loadProfile(1)">B</div>
        <div id="3" class="filter-container" onclick="loadProfile(2)">C</div>
        <div id="4" class="filter-container" onclick="loadProfile(3)">D</div>
      </nav>
    
      <div id="demo-name"></div>
      <ul>
        <li><input id="value1" type="range" class="user-input"></li>
        <li><input id="value2" type="range" class="user-input"></li>
        <li><input id="value3" type="range" class="user-input"></li>
        <li><input id="value4" type="range" class="user-input"></li>
        <li><input id="value5" type="range" class="user-input"></li>
        <li><input id="value6" type="range" class="user-input"></li>
      </ul>
      <button id="newbut">Check it</button>
    </body>

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-07-13
      • 1970-01-01
      • 2015-03-25
      相关资源
      最近更新 更多