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

输入特定数字时修改元素样式的实现及JS报错修复问询

问题修复:输入特定数字时修改页面样式的报错解决

问题描述

我希望实现当<input>中输入特定数字(如"5214")而非任意文本时,修改<body>这类元素的样式。但当前代码触发报错:Uncaught TypeError: Cannot set properties of undefined (setting 'innerText'),错误位于第3行。我曾在ADT安防系统面板上见过类似功能,当时使用的是<input type="hidden">和4个<span>元素。

原代码如下:

原JS代码

const inputField = document.getElementsByClassName("doSomething");

if(inputField[0].innerText = "5214") {
  document.getElementsByTagName("body").style.backgroundColor = "lime";
}

原CSS代码

input {
  background-color: #ffffff;
}

原HTML代码

<label>Numbers only:</label><input type="text" onkeypress="return (event.charCode !=8 && event.charCode ==0 || (event.charCode >= 48 && event.charCode <= 57))" />
<br>
<label>Numbers and decimal points only:</label>
<input type="text" onkeypress="return (event.charCode !=8 && event.charCode ==0 || ( event.charCode == 46 || (event.charCode >= 48 && event.charCode <= 57)))" />

错误原因及修复步骤

  • 元素选择器不匹配:JS中用getElementsByClassName("doSomething")获取元素,但HTML里的<input>没有添加doSomething类,导致inputField[0]为undefined,访问其属性就会报错。需给目标<input>添加对应的类名。
  • input内容获取错误:<input>是表单元素,用户输入的内容存储在value属性中,而非innerText,需改用value获取输入值。
  • 条件判断运算符错误:原代码中用了赋值运算符=,这会把"5214"赋值给元素属性,而非判断相等。需改用严格相等运算符===进行条件判断。
  • body元素获取错误:getElementsByTagName("body")返回的是HTMLCollection集合,需通过[0]取出唯一的<body>元素才能访问其style属性。
  • 缺少输入监听:原代码是页面加载时一次性执行,无法实时检测用户输入。需给<input>添加input或keyup事件监听,实时触发判断逻辑。

修复后的完整代码

HTML

<label>Numbers only:</label><input type="text" class="doSomething" onkeypress="return (event.charCode !=8 && event.charCode ==0 || (event.charCode >= 48 && event.charCode <= 57))" />
<br>
<label>Numbers and decimal points only:</label>
<input type="text" onkeypress="return (event.charCode !=8 && event.charCode ==0 || ( event.charCode == 46 || (event.charCode >= 48 && event.charCode <= 57)))" />

CSS

input {
  background-color: #ffffff;
}

JS

const inputField = document.querySelector(".doSomething");

// 监听输入事件,实时检测内容
inputField.addEventListener("input", function() {
  if (this.value === "5214") {
    document.querySelector("body").style.backgroundColor = "lime";
  } else {
    // 输入不符合时恢复原样式
    document.querySelector("body").style.backgroundColor = "";
  }
});

补充:类似ADT面板的4位数字输入实现

如果想模拟ADT安防面板那种4个独立输入位的样式,可以用隐藏input加span的方式,代码示例如下:

HTML

<div class="code-input">
  <span class="input-digit" data-index="0"></span>
  <span class="input-digit" data-index="1"></span>
  <span class="input-digit" data-index="2"></span>
  <span class="input-digit" data-index="3"></span>
  <input type="hidden" id="hidden-code" />
</div>

CSS

.code-input {
  display: flex;
  gap: 8px;
}

.input-digit {
  width: 40px;
  height: 40px;
  border: 1px solid #ccc;
  display: flex;
  align-items: center;
  justify-content: center;
  font-size: 20px;
}

.input-digit:focus {
  outline: 2px solid #2196F3;
}

JS

const digitSpans = document.querySelectorAll(".input-digit");
const hiddenInput = document.getElementById("hidden-code");
let currentIndex = 0;

// 给每个span绑定点击事件,切换焦点
digitSpans.forEach((span, index) => {
  span.addEventListener("click", () => {
    currentIndex = index;
    span.setAttribute("tabindex", "0");
    span.focus();
  });
  
  // 监听键盘输入
  span.addEventListener("keydown", (e) => {
    // 只允许数字输入
    if (e.key >= "0" && e.key <= "9") {
      e.preventDefault();
      span.textContent = e.key;
      // 更新隐藏input的值
      const code = Array.from(digitSpans).map(s => s.textContent).join("");
      hiddenInput.value = code;
      
      // 检测是否匹配目标码
      if (code === "5214") {
        document.body.style.backgroundColor = "lime";
      } else {
        document.body.style.backgroundColor = "";
      }
      
      // 自动切换到下一个输入位
      if (currentIndex < 3) {
        currentIndex++;
        digitSpans[currentIndex].setAttribute("tabindex", "0");
        digitSpans[currentIndex].focus();
      }
    }
    // 退格键删除当前数字并返回上一位
    else if (e.key === "Backspace") {
      e.preventDefault();
      span.textContent = "";
      const code = Array.from(digitSpans).map(s => s.textContent).join("");
      hiddenInput.value = code;
      
      if (currentIndex > 0) {
        currentIndex--;
        digitSpans[currentIndex].focus();
      }
    }
  });
});

// 默认聚焦第一个输入位
digitSpans[0].setAttribute("tabindex", "0");
digitSpans[0].focus();

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.14 22:38:13