如何动态获取Input的max值并在checkMaxInput函数中应用?
问题解决:动态获取输入框max属性替代硬编码
问题说明
当前checkMaxInput函数中硬编码了App-Benutzer输入框的max值100和Backend-Benutzer输入框的max值15,希望动态获取这两个输入框的max属性值,避免手动修改代码。此前尝试this.max未生效,需修正实现逻辑。
问题原因
- 代码中存在两个同名的
checkMaxInput函数,后定义的函数覆盖了前一个,导致最初的逻辑失效 - 调用
checkMaxInput()时未传递正确的上下文,this指向不是目标输入框 - 输入框的
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); }
关键改动说明
- 动态获取max值:在
checkMaxInput中通过appInput.max和backendInput.max直接获取输入框的max属性,无需硬编码 - 类型转换:用
Number()将输入框的value和max转为数字,避免字符串比较导致的错误 - 优化输入限制:将输入框
oninput中的硬编码最大值改为this.max,彻底实现动态限制 - 移除重复函数:删除重复定义的
checkMaxInput,确保逻辑唯一
内容的提问来源于stack exchange,提问作者programmnoob
相关产品推荐
相关产品推荐

