You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何动态获取Input的max值并在checkMaxInput函数中应用?

问题解决:动态获取输入框max属性替代硬编码

问题说明

当前checkMaxInput函数中硬编码了App-Benutzer输入框的max值100和Backend-Benutzer输入框的max值15,希望动态获取这两个输入框的max属性值,避免手动修改代码。此前尝试this.max未生效,需修正实现逻辑。

问题原因

  1. 代码中存在两个同名的checkMaxInput函数,后定义的函数覆盖了前一个,导致最初的逻辑失效
  2. 调用checkMaxInput()时未传递正确的上下文,this指向不是目标输入框
  3. 输入框的value和max属性均为字符串类型,直接用===比较可能出现类型不匹配问题

解决方案

以下是修改后的完整代码,核心改动包括:

  • 移除重复的checkMaxInput函数,实现动态获取max属性的逻辑
  • 统一将输入框的值和max属性转为数字后比较,避免类型问题
  • 同步修改输入框oninput事件中的硬编码限制,改为动态获取this.max

修改后的JavaScript代码

var percent = 1; // 年度默认值
var percentmonthly = 1.2; // 月度默认值

// 页面加载完成后执行
document.addEventListener("DOMContentLoaded", function (event) {
  // 滑块颜色更新逻辑
  document.querySelectorAll(".updatecolor").forEach(updateinputs =>
    updateinputs.addEventListener("input", function () {
      var percent = calcPercent(this.value, this.min, this.max);
      const bg = getComputedStyle(this).getPropertyValue('--background');
      const slider = getComputedStyle(this).getPropertyValue('--slider');
      var colorchanger = this.getAttribute('rangecolorid');
      var sliderselect = document.querySelector('#' + colorchanger);
      sliderselect.setAttribute(
        'style',
        ` background:linear-gradient(to right,${slider},${slider} ${percent}%,${bg} ${percent}%) `
      )
    })
  );

  // 初始化数据显示
  calcSum();
});

// 检查输入是否达到最大值,控制按钮显示/隐藏
function checkMaxInput() {
  var hidden = document.getElementById("hiddenMax");
  if (!hidden) return;

  // 获取两个输入框元素
  const appInput = document.getElementById("AppInput");
  const backendInput = document.getElementById("BackendInput");

  // 动态获取max值并转为数字,与当前值比较
  const appReachMax = Number(appInput.value) === Number(appInput.max);
  const backendReachMax = Number(backendInput.value) === Number(backendInput.max);

  // 控制按钮可见性
  hidden.style.visibility = (appReachMax || backendReachMax) ? "visible" : "hidden";
}

// 同步滑块与输入框的值
function updateUser(val, inputtype) {
  if (inputtype === 'Appuserrangecolor') {
    document.getElementById('AppInput').value = val;
  }
  if (inputtype === 'AppInput') {
    document.getElementById('Appuserrangecolor').value = val;
  }
  if (inputtype === 'Backendrangecolor') {
    document.getElementById('BackendInput').value = val;
  }
  if (inputtype === 'BackendInput') {
    document.getElementById('Backendrangecolor').value = val;
  }
  calcSum();
  checkMaxInput();
}

// 计算当前值在min-max区间内的百分比
function calcPercent(curval, min, max) {
  return ((curval - min) / (max - min)) * 100;
}

// 计算用户总数(可补充具体逻辑)
function calcSum() {

}

修改后的HTML代码(主要修改输入框的oninput逻辑)

<html>
  <head>
    <title>Preiskalkulator</title>
    <link rel="stylesheet" href="styles.css">
  </head>
  <body>
    <div class="grid-container">
      <div style="width: 270px" class="grid-item">
        <header>Preiskalkulator</header>
        <div class="slidecontainer">
          App-Benutzer: <br>
          <input id="Appuserrangecolor" value="0" type="range" rangecolorid="Appuserrangecolor" min="0" max="100" oninput="updateUser(this.value, 'Appuserrangecolor');" class='appuser updatecolor'></input>
          <input class='updatecolor' style="width: 30px;border-color: var(--form_border_color);" type="text" id="AppInput" value="0" placeholder="1-100" rangecolorid="Appuserrangecolor" min="0" max="100" oninput="this.value = Math.min(Math.abs(this.value), this.max); updateUser(this.value, 'AppInput');"></input><br>
          Bürosoftware-Benutzer: <br>
          <input id="Backendrangecolor" value="1" type="range" rangecolorid="Backendrangecolor" min="1" max="15" oninput="updateUser(this.value, 'Backendrangecolor'); " class='backenduser updatecolor'></input>
          <input class='updatecolor' style="width: 30px;border-color: var(--form_border_color);" type="text" id="BackendInput" rangecolorid="Backendrangecolor" value="1" min="1" max="15" placeholder="1-15" oninput="this.value = Math.min(Math.abs(this.value), this.max); updateUser(this.value, 'BackendInput');"></input><br>
        </div>
      </div>
      <div class="grid-item" style="width: 270px">
        <div id="hiddenMax" class="button" style="margin-left: auto;margin-right: auto;margin-top: 10px; visibility: hidden;">
          <button class="button" ><a class="button" target="blank" href="#">Größeres Packet auf Anfrage</a></button>
        </div>
      </div>
    </div>
    <script src="script.js"></script>
  </body>
</html>

CSS代码(无改动,直接保留)

html, body {
  background-color: rgb(255, 255, 255);
  height: 100%;
  margin: 0;
}

header{
  text-align: center;
  font-size: 20px;
}

body, table, select {
  font-size: 12px;
}
  

input[type=range]{
  border-radius: 32px;
  height: 10px;
  cursor: pointer;
}

*, *::before, *::after {
  box-sizing: border-box;
}

.grid-container {
    display: grid;
  grid-template-columns:600px 250px ;
  grid-auto-rows: minmax(150px, auto);
  justify-items: stretch;
  align-items: stretch;
}
.grid-item-1 {
  align-self: start;
  justify-self: center;
}

.text-grey{
  color:grey;
}

.grid-container {
  padding: 60px;
  width: 100%;
  grid-template-columns: 250px 200px;
}

#Backendrangecolor, #Appuserrangecolor, #BackendInput, #AppInput {
  --background: rgb(96,125,139,0.33);
  --slider: #00ba7a;
  background: var(--background);
  -webkit-appearance: none;
  width: 150px;
  
}
#Backendrangecolor, #Appuserrangecolor :-moz-range-thumb {
  background: purple;
}


.grid-item {
  padding: 20px;
  padding-top: 15px;
  background-color: #f8f8f8;
  color: #222;
  border: 7px solid rgba(96,125,139,0.33);
}

.grid-item:nth-child(odd) {
  background-color: #f8f8f8;
}

.target { 
  display: none; 
}
/* Base styling*/
body {
  background-color: #f8f8f8;
  max-width: 768px;
  margin: 0 auto;
  padding: 1em 0;
  font-family: "Helvetica Neue", Helvetica, Arial, sans-serif;
}


a {
  text-decoration: none;
}


}

.price-container .text {
    width: 80px;
    display: inline-block;
    text-align: right;
}

.price-container .value {
    width: 30px;
    display: inline-block;
    text-align: left;
}
.button {
  text-align: center;
  width: 75px;
  height: auto;
  font-size:8px;
  color:#f8f8f8 ;
  background-color: rgba(255,167,55,1);
  border: rgba(255,167,55,1);

  
}

关键改动说明

  1. 动态获取max值:在checkMaxInput中通过appInput.max和backendInput.max直接获取输入框的max属性,无需硬编码
  2. 类型转换:用Number()将输入框的value和max转为数字,避免字符串比较导致的错误
  3. 优化输入限制:将输入框oninput中的硬编码最大值改为this.max,彻底实现动态限制
  4. 移除重复函数:删除重复定义的checkMaxInput,确保逻辑唯一

内容的提问来源于stack exchange,提问作者programmnoob

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.20 00:50:13