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

如何让输入框接受合法信用卡号并正确切换背景颜色

问题根因
  • 核心问题:onBlurEvent 函数中无论Luhn校验结果是否通过,都执行了mythis.setCustomValidity("Invalid field")。只要setCustomValidity传入非空值,浏览器就会判定输入框为无效状态,这是输入框始终变红、表单无法提交的直接原因。
  • 次要问题1:提交事件绑定错误,button标签上的onsubmit属性书写错误且事件绑定对象错误,submit事件需要绑定在form元素上。
  • 次要问题2:信用卡输入框的oninput正则允许输入小数点,不符合卡号规则,可能导致校验异常。
修复代码

1. JavaScript部分修改

function checkLuhn(input)
{
  // 先加长度校验,符合常见信用卡号13~19位的规则,避免短字符串误判
  if(input.length <13 || input.length>19) return false;
  var sum = 0;
  var numdigits = input.length;
  var parity = numdigits % 2;
  for(var i=0; i < numdigits; i++) {
    var digit = parseInt(input.charAt(i))
    if(i % 2 == parity) digit *= 2;
    if(digit > 9) digit -= 9;
    sum += digit;
  }
  return (sum % 10) == 0;
}
let cc_number_saved = "";
function onBlurEvent(mythis) {
  cc_number_saved = mythis.value;
  mythis.value = mythis.value.replace(/[^\d]/g, '');
  if(!checkLuhn(mythis.value)) { 
    alert('Sorry, that is not a valid number - please try again!');
    // 只有校验失败时才设置自定义无效状态
    mythis.setCustomValidity("Invalid field");
  } else {
    // 校验通过时清空自定义无效状态,让浏览器判定为有效
    mythis.setCustomValidity("");
  }
}
function onFocusEvent(mythis) {
  if(mythis.value != cc_number_saved) mythis.value = cc_number_saved;
}
function onSubmitEvent(event) {
  if (!event.target.checkValidity()) {
    event.preventDefault();
  }
}

2. HTML部分修改

<!DOCTYPE html>
    <html>
      <head>
        <meta charset="utf-8">
        <meta name="viewport" content="width=device-width">
        <title>Technical Challenge</title>
        <link href="style.css" rel="stylesheet" type="text/css" />
        <script src="script.js"></script>
      </head>
      <body>
        <div class = form>
          <!-- 把submit事件绑定到form标签上 -->
          <form id = "form" action="mailto:test@test.com" method="POST" enctype="text/plain" onsubmit="onSubmitEvent(event)">
            <div class="form-group">
              <label id="name-label" for="name">Name:</label>
              <input
                type="text"
                name="name"
                id="name"
                pattern="[A-Za-z!#$%&'*+-/=?^_`{|}~]+"
                title="Please enter a valid name."
                class="form-control"
                placeholder="Enter Your Name"
                required
              />
            
            <br>
            <div class="form-group">
              <label id="email-label" for="email">Email:</label>
              <input
                type="email"
                name="email"
                id="email"
                class="form-control"
                placeholder="Enter Your Email"
                required
            />

              <br>
            <div class="form-group">
              <label id="card-label" for="card">Card:</label>
              <input
                id="cardInput" 
                type="text" 
                size="24" 
                maxlength="20" 
                <!-- 修正正则,禁止输入小数点 -->
                oninput="this.value = this.value.replace(/[^0-9]/g, '');"
                name="cc_number" 
                onblur="onBlurEvent(this)"
                onfocus="onFocusEvent(this)"
                placeholder="Enter a Proxy Credit Card Number."
                required
              />

                <br>
            <div class="form-group">
              <button type="submit" id="submit" class="submit-button">
                Submit
              </button>
          </form>
         </div> 
      </body>
    </html>
效果说明

修改后输入4111111111111111或者带分隔符的4111-1111-1111-1111,失焦后都会判定为有效,输入框变为绿色,表单可正常提交。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 00:42:01