使用 Luhn 算法在表单中验证信用卡号码

使用 luhn 算法在表单中验证信用卡号码

本文档旨在提供一个清晰的指南,说明如何使用 Luhn 算法在 HTML 表单中验证信用卡号码。通过结合 JavaScript 和 HTML5 的表单验证功能,我们将创建一个用户友好的表单,该表单可以实时检查信用卡号码的有效性,并在号码无效时提供反馈。本文档包含完整的代码示例,以及对代码的详细解释,帮助开发者轻松地将此功能集成到自己的项目中。

Luhn 算法简介

Luhn 算法,也称为模 10 算法,是一种简单的校验和公式,用于验证各种识别号码,如信用卡号码、IMEI 号码等。该算法可以检测出常见的输入错误,例如单个数字的错误输入或相邻数字的换位。

实现步骤

以下步骤将指导您完成使用 Luhn 算法验证信用卡号码的整个过程:

HTML 表单结构:

首先,我们需要创建一个包含信用卡号码输入字段的 HTML 表单。重要的是,该字段应具有唯一的 ID,以便我们可以使用 JavaScript 访问它。同时,添加必要的反馈元素,以便在验证失败时向用户显示错误消息。

Please provide your credit card number.
Please provide a valid credit card number.

JavaScript 代码:

a. 获取输入字段:

使用 document.querySelector() 方法获取信用卡号码输入字段的引用。

b. 绑定输入事件:

使用 $(‘#cc’).on(‘input’, function(){ … }); 监听输入字段的 input 事件。每次用户在输入字段中输入内容时,都会触发此事件。

c. Luhn 算法验证:

在事件处理程序中,调用 checkLuhn() 函数来验证信用卡号码。

d. 设置自定义有效性:

根据 checkLuhn() 函数的结果,使用 field.setCustomValidity() 方法设置输入字段的自定义有效性。如果号码有效,则将自定义有效性设置为空字符串(””),否则设置为错误消息(例如 “Invalid field.”)。

$('#cc').on('input', function(){  const field = document.querySelector('#cardContainer input')  if (checkLuhn($('#cc').val())) {    field.setCustomValidity("");  } else {    field.setCustomValidity("Invalid field.");  }});function checkLuhn(value) {  // accept only digits, dashes or spaces    if (/[^0-9-\s]+/.test(value)) return false;// The Luhn Algorithm. It's so pretty.    var nCheck = 0, nDigit = 0, bEven = false;    value = value.replace(/\D/g, "");    for (var n = value.length - 1; n >= 0; n--) {        var cDigit = value.charAt(n),            nDigit = parseInt(cDigit, 10);        if (bEven) {            if ((nDigit *= 2) > 9) nDigit -= 9;        }        nCheck += nDigit;        bEven = !bEven;    }    return (nCheck % 10) == 0;}

CSS 样式:

使用 CSS 样式来显示或隐藏错误消息,并根据验证结果更改输入字段的边框颜色。

.invalid-feedback,.empty-feedback {  display: none;}.was-validated :placeholder-shown:invalid ~ .empty-feedback {  display: block;}.was-validated :not(:placeholder-shown):invalid ~ .invalid-feedback {  display: block;}.is-invalid,.was-validated :invalid {  border-color: #dc3545;}

完整代码:

Contact Us

Fill up the form below to send us a message.

Please provide your first name.
<input type="email" name="email" id="email" placeholder="[email protected]" required class="w-full px-3 py-2 placeholder-gray-300 border-2 border-gray-200 rounded-md focus:outline-none focus:ring focus:ring-indigo-100 focus:border-indigo-300" />
Please provide your email address.
Please provide a valid email address.
Please provide your credit card number.
Please provide a valid credit card number.

(function () {  "use strict";  /*   * Form Validation   */  // Fetch all the forms we want to apply custom validation styles to  const forms = document.querySelectorAll(".needs-validation");  const result = document.getElementById("result");  // Loop over them and prevent submission  Array.prototype.slice.call(forms).forEach(function (form) {    form.addEventListener(      "submit",      function (event) {        if (!form.checkValidity() ) {          event.preventDefault();          event.stopPropagation();          form.querySelectorAll(":invalid")[0].focus();        } else {          /*           * Form Submission using fetch()           */          const formData = new FormData(form);          event.preventDefault();          event.stopPropagation();          const object = {};          formData.forEach((value, key) => {            object[key] = value;          });          const json = JSON.stringify(object);          result.innerHTML = "Please wait...";          fetch("https://api.web3forms.com/submit", {            method: "POST",            headers: {              "Content-Type": "application/json",              Accept: "application/json"            },            body: json          })            .then(async (response) => {              let json = await response.json();              if (response.status == 200) {                result.innerHTML = json.message;                result.classList.remove("text-gray-500");                result.classList.add("text-green-500");              } else {                console.log(response);                result.innerHTML = json.message;                result.classList.remove("text-gray-500");                result.classList.add("text-red-500");              }            })            .catch((error) => {              console.log(error);              result.innerHTML = "Something went wrong!";            })            .then(function () {              form.reset();              form.classList.remove("was-validated");              setTimeout(() => {                result.style.display = "none";              }, 5000);            });        }        form.classList.add("was-validated");      },      false    );  });})();$('#cc').on('input', function(){  const field = document.querySelector('#cardContainer input')  if (checkLuhn($('#cc').val())) {    field.setCustomValidity("");  } else {    field.setCustomValidity("Invalid field.");  }});function checkLuhn(value) {  // accept only digits, dashes or spaces    if (/[^0-9-\s]+/.test(value)) return false;// The Luhn Algorithm. It's so pretty.    var nCheck = 0, nDigit = 0, bEven = false;    value = value.replace(/\D/g, "");    for (var n = value.length - 1; n >= 0; n--) {        var cDigit = value.charAt(n),            nDigit = parseInt(cDigit, 10);        if (bEven) {            if ((nDigit *= 2) > 9) nDigit -= 9;        }        nCheck += nDigit;        bEven = !bEven;    }    return (nCheck % 10) == 0;}
.invalid-feedback,.empty-feedback {  display: none;}.was-validated :placeholder-shown:invalid ~ .empty-feedback {  display: block;}.was-validated :not(:placeholder-shown):invalid ~ .invalid-feedback {  display: block;}.is-invalid,.was-validated :invalid {  border-color: #dc3545;}

注意事项

安全性: 此代码仅用于客户端验证。为了确保安全性,您仍然需要在服务器端执行验证。用户体验: 考虑添加额外的用户体验功能,例如在用户输入时格式化信用卡号码。兼容性: 确保您的代码在所有目标浏览器中都能正常工作。

总结

通过结合 HTML 表单、JavaScript 和 Luhn 算法,我们可以创建一个用户友好的表单,该表单可以实时验证信用卡号码的有效性。这可以帮助减少输入错误,并提高用户体验。请记住,客户端验证只是安全措施的一部分,您仍然需要在服务器端执行验证。

以上就是使用 Luhn 算法在表单中验证信用卡号码的详细内容,更多请关注创想鸟其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/1574191.html

赞 (0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
解决JavaScript中数字字符串加法问题的教程
上一篇 2025年12月22日 16:06:08
使用 Luhn 算法实现表单信用卡号验证
下一篇 2025年12月22日 16:06:18

相关推荐

  • uc浏览器如何开启阅读模式_UC浏览器网页纯净阅读模式使用方法

    uc浏览器如何开启阅读模式_UC浏览器网页纯净阅读模式使用方法uc浏览器如何开启阅读模式_UC浏览器网页纯净阅读模式使用方法uc浏览器如何开启阅读模式_UC浏览器网页纯净阅读模式使用方法uc浏览器如何开启阅读模式_UC浏览器网页纯净阅读模式使用方法

    开启UC浏览器阅读模式可去除广告并优化排版,具体操作包括:通过地址栏书本图标一键启用、从菜单手动开启,或在设置中开启自动进入功能,提升阅读体验。 如果您在浏览网页时希望减少广告和无关内容的干扰,可以启用UC浏览器的阅读模式来获得更清晰的阅读体验。该功能会自动提取网页正文并优化排版,使文字更加易读。 …

    2026年9月27日 • 用户投稿
    100
  • Java Swing 实现带复选框和图像的逻辑门

    Java Swing 实现带复选框和图像的逻辑门Java Swing 实现带复选框和图像的逻辑门Java Swing 实现带复选框和图像的逻辑门Java Swing 实现带复选框和图像的逻辑门

    本文介绍了如何使用 Java Swing 创建一个简单的 AND 逻辑门 GUI,该 GUI 包含两个复选框和一个图像。当两个复选框都被选中时,图像变为绿色;否则,图像变为红色。我们将使用 JCheckBox、JLabel 和 ChangeListener 来实现这一功能,并提供完整的代码示例。 创…

    2026年9月27日 • 用户投稿
    000
  • 解决Spring REST API 406 Not Acceptable错误

    解决Spring REST API 406 Not Acceptable错误解决Spring REST API 406 Not Acceptable错误解决Spring REST API 406 Not Acceptable错误解决Spring REST API 406 Not Acceptable错误

    本文旨在帮助开发者解决在使用Spring REST API时遇到的“406 Not Acceptable”错误。该错误通常表示服务器无法找到客户端可接受的表示形式。我们将详细介绍错误的原因、解决方案,并通过示例代码演示如何配置produces属性来指定API的响应类型,确保客户端能够正确接收和处理数…

    2026年9月27日 • 用户投稿
    000
  • uc浏览器首页的新闻怎么关闭_UC浏览器关闭首页新闻资讯教程

    uc浏览器首页的新闻怎么关闭_UC浏览器关闭首页新闻资讯教程uc浏览器首页的新闻怎么关闭_UC浏览器关闭首页新闻资讯教程uc浏览器首页的新闻怎么关闭_UC浏览器关闭首页新闻资讯教程uc浏览器首页的新闻怎么关闭_UC浏览器关闭首页新闻资讯教程

    如果您在使用UC浏览器时,希望减少首页的新闻资讯干扰,以获得更专注的浏览体验,可以通过以下方法进行设置。 本文运行环境:小米14 Pro,Android 14 一、关闭资讯推送通知 此操作将阻止UC浏览器向您发送弹出式新闻提醒,从系统层面减少打扰。 1、打开手机上的UC浏览器应用。 2、点击屏幕右下…

    2026年9月27日 • 用户投稿
    000
  • 跨平台无纸化会议安装指南

    跨平台无纸化会议安装指南跨平台无纸化会议安装指南跨平台无纸化会议安装指南跨平台无纸化会议安装指南

    无纸化会议的投屏功能通常依赖于windows或安卓系统,但本文提供一种兼容多种操作系统的部署方案,实现跨平台应用。无论使用windows、安卓、ios还是mac设备,均可顺利安装并运行无纸化会议系统,显著提升会议的便捷性与协作效率。 1、 首先将无纸化会议服务器部署至机柜中,接通网络与电源,后续无需…

    2026年9月27日 • 用户投稿
    400
  • sublime的auto match enabled是什么意思_sublime Auto Match Enabled功能解释

    sublime的auto match enabled是什么意思_sublime Auto Match Enabled功能解释sublime的auto match enabled是什么意思_sublime Auto Match Enabled功能解释sublime的auto match enabled是什么意思_sublime Auto Match Enabled功能解释sublime的auto match enabled是什么意思_sublime Auto Match Enabled功能解释

    Auto Match Enabled 是 Sublime Text 的自动匹配功能,开启后可自动补全并高亮括号、引号及标签。输入左括号 (、[、{ 或引号时,系统自动补全右侧符号,并将光标置于中间;光标位于符号上时,配对符号会被高亮显示。在 HTML/XML 中,输入起始标签如 会自动生成闭合标签 …

    2026年9月27日 • 用户投稿
    100
  • windows蓝屏dpc_watchdog_violation如何解决_DPC_WATCHDOG_VIOLATION蓝屏错误解决方法

    windows蓝屏dpc_watchdog_violation如何解决_DPC_WATCHDOG_VIOLATION蓝屏错误解决方法windows蓝屏dpc_watchdog_violation如何解决_DPC_WATCHDOG_VIOLATION蓝屏错误解决方法windows蓝屏dpc_watchdog_violation如何解决_DPC_WATCHDOG_VIOLATION蓝屏错误解决方法windows蓝屏dpc_watchdog_violation如何解决_DPC_WATCHDOG_VIOLATION蓝屏错误解决方法

    1、DPC_WATCHDOG_VIOLATION蓝屏主因是DPC超时,常见于驱动、存储或固件问题;2、更新或回滚存储控制器驱动可解决兼容性问题;3、升级BIOS能修复硬件调度底层缺陷;4、禁用第三方杀毒软件避免内核干扰;5、运行内存诊断排除RAM故障;6、更新SSD固件或切换NVMe模式以稳定磁盘操…

    2026年9月27日 • 用户投稿
    000
  • Java:子类如何在不修改父类的情况下,通过重写方法间接利用父类私有成员

    Java:子类如何在不修改父类的情况下,通过重写方法间接利用父类私有成员Java:子类如何在不修改父类的情况下,通过重写方法间接利用父类私有成员Java:子类如何在不修改父类的情况下,通过重写方法间接利用父类私有成员Java:子类如何在不修改父类的情况下,通过重写方法间接利用父类私有成员

    在Java中,当子类需要在不修改父类的前提下,利用父类的私有成员时,直接访问是不允许的。本教程将展示如何通过调用父类的公共或保护方法(例如super.toString()),来间接利用父类内部已处理过的私有数据,尤其适用于重写方法并在此基础上扩展功能的情景。 Java封装性与私有成员:理解限制 ja…

    2026年9月27日 • 用户投稿
    000
  • Java中HashMap基本使用方法

    HashMap是Java中基于哈希表实现的键值对存储结构,属于java.util包,允许null键和null值,不保证顺序;通过put()添加元素,get()获取值,支持containsKey、remove、size等操作,并可使用keySet、values、entrySet遍历;多线程环境下不安全…

    2026年9月27日
    000
  • HTML表单动态必填字段:基于其他字段内容的条件校验

    本文将指导您如何使用JavaScript实现HTML表单中字段的条件必填校验。当一个字段(如“姓名”)有值时,另一个字段(如“位置”)才变为必填项,从而提升用户体验和数据准确性。教程将提供详细的HTML和JavaScript代码示例,并解释其工作原理,确保您能轻松掌握这种实用的前端验证技术。 在构建…

    2026年9月27日
    100
  • AI绘画工具生成的图片可以商用吗?2025解析

    AI绘画图片能否商用取决于工具版权政策和使用方式。首先需查看所用AI工具的服务条款:若明确赋予用户商业使用权,则可放心商用;若限制商用或版权归开发者,则存在法律风险。为规避风险,应选择版权政策宽松的工具,对生成图片进行二次创作以增强独创性,并保留生成记录作为证据。用于品牌Logo时更需谨慎,因AI生…

    2026年9月27日
    200
  • 机械键盘不同轴体对编程效率有影响吗?

    答案是机械键盘轴体通过影响手感、反馈和舒适度间接提升编程效率。线性轴顺滑适合快速输入,段落轴提供确认感减少误触,点击轴反馈强但噪音大,选择需结合个人习惯、环境及疲劳管理;此外,键帽、布局、自定义功能与人体工学设计也显著影响编程体验。 机械键盘的不同轴体,在我看来,确实会对编程效率产生影响,但这影响并…

    2026年9月27日
    100
  • 微软为PowerToys 键盘管理器开发新功能:可快捷启动应用 / 网站

    微软为PowerToys 键盘管理器开发新功能:可快捷启动应用 / 网站微软为PowerToys 键盘管理器开发新功能:可快捷启动应用 / 网站微软为PowerToys 键盘管理器开发新功能:可快捷启动应用 / 网站微软为PowerToys 键盘管理器开发新功能:可快捷启动应用 / 网站

    据国外科技媒体 deskmodder 的报道,微软正着手为“键盘管理器”(keyboard manager)工具添加全新功能。“键盘管理器”隶属于 powertoys 工具集,允许用户自定义全局及各应用程序内的键盘快捷键。微软计划扩展其功能,使用户能够通过自定义快捷键来启动程序,并设定程序启动时的状…

    2026年9月27日 • 用户投稿
    100
  • Java中高并发数据库同步与任务处理教程

    Java中高并发数据库同步与任务处理教程Java中高并发数据库同步与任务处理教程Java中高并发数据库同步与任务处理教程Java中高并发数据库同步与任务处理教程

    本文旨在探讨Java应用中处理高并发数据库操作的有效策略,尤其针对大量数据行的计算与状态更新场景。我们将介绍如何利用ExecutorService和任务对象实现并发处理,并通过数据库连接池优化资源管理。重点关注数据库层面的并发控制机制,如事务和行级锁,以确保数据一致性和系统性能,并提供实际的代码示例…

    2026年9月27日 • 用户投稿
    100
  • 360极速浏览器无法播放B站视频是什么原因_Bilibili视频播放失败排查方案

    360极速浏览器无法播放B站视频是什么原因_Bilibili视频播放失败排查方案360极速浏览器无法播放B站视频是什么原因_Bilibili视频播放失败排查方案360极速浏览器无法播放B站视频是什么原因_Bilibili视频播放失败排查方案360极速浏览器无法播放B站视频是什么原因_Bilibili视频播放失败排查方案

    若360极速浏览器播放B站视频黑屏或卡顿,可依次排查:1. 禁用HEVC硬件解码,强制使用AVC格式;2. 更新Widevine插件以支持DRM内容;3. 切换至兼容模式解决内核冲突;4. 清除缓存并重置浏览器设置。 如果您尝试在360极速浏览器中播放B站视频,但出现黑屏、卡顿或无法加载的情况,则可…

    2026年9月27日 • 用户投稿
    000
  • Java高并发数据库同步处理:高效任务调度与连接管理实践

    Java高并发数据库同步处理:高效任务调度与连接管理实践Java高并发数据库同步处理:高效任务调度与连接管理实践Java高并发数据库同步处理:高效任务调度与连接管理实践Java高并发数据库同步处理:高效任务调度与连接管理实践

    本文深入探讨了在Java应用中处理海量数据并发同步的策略。通过将数据库操作封装为独立任务,结合ExecutorService进行高效调度,并利用数据库连接池(如HikariCP)优化资源管理,同时强调了数据库层面事务和锁机制的重要性。文章提供了实现并发处理、标记已消费行以及确保系统高性能和数据一致性…

    2026年9月27日 • 用户投稿
    100
  • DeepSeek如何实现代码版本管理 DeepSeek与Git集成开发环境配置教程

    DeepSeek如何实现代码版本管理 DeepSeek与Git集成开发环境配置教程DeepSeek如何实现代码版本管理 DeepSeek与Git集成开发环境配置教程DeepSeek如何实现代码版本管理 DeepSeek与Git集成开发环境配置教程DeepSeek如何实现代码版本管理 DeepSeek与Git集成开发环境配置教程

    deepseek本身不实现版本管理,而是通过深度集成git来提供更智能高效的开发体验。其核心在于充分利用git功能,并通过可视化界面和增强工具提升使用效率。配置过程包括安装git、配置用户信息、安装deepseek、连接仓库、设置git参数及使用git功能。冲突解决依赖可视化标记与三方合并工具,按查…

    2026年9月27日 • 用户投稿
    100
  • 告别繁琐构造函数:使用建造者模式优化Java对象创建

    告别繁琐构造函数:使用建造者模式优化Java对象创建告别繁琐构造函数:使用建造者模式优化Java对象创建告别繁琐构造函数:使用建造者模式优化Java对象创建告别繁琐构造函数:使用建造者模式优化Java对象创建

    本文针对Java中处理多个可选参数时,传统构造函数组合繁琐的问题,详细介绍了建造者模式(Builder Pattern)。该模式通过分阶段构建对象,避免了大量参数构造函数和重复组合,提升了代码的可读性和可维护性。文章将通过代码示例深入解析建造者模式的实现原理与优势,并提供实际应用指导。 传统构造函数…

    2026年9月27日 • 用户投稿
    200
  • 怎么用豆包AI帮我生成JavaScript代码 快速生成JS代码的豆包AI使用指南

    怎么用豆包AI帮我生成JavaScript代码 快速生成JS代码的豆包AI使用指南怎么用豆包AI帮我生成JavaScript代码 快速生成JS代码的豆包AI使用指南怎么用豆包AI帮我生成JavaScript代码 快速生成JS代码的豆包AI使用指南怎么用豆包AI帮我生成JavaScript代码 快速生成JS代码的豆包AI使用指南

    使用豆包ai生成javascript代码的关键在于明确需求、提供清晰指令并进行结果优化。一要明确具体功能,如表单验证或dom操作,避免模糊提问;二要用结构化的中文指令,如“请用javascript写一个函数用来……”,并可添加兼容性等限制条件;三要检查生成代码的逻辑与语法,结合浏览器测试进行调整。实…

    2026年9月27日 • 用户投稿
    100
  • 宏碁非凡 Go Air 超轻薄本发布,轻便耐用性能强

    宏碁非凡 Go Air 超轻薄本发布,轻便耐用性能强宏碁非凡 Go Air 超轻薄本发布,轻便耐用性能强宏碁非凡 Go Air 超轻薄本发布,轻便耐用性能强宏碁非凡 Go Air 超轻薄本发布,轻便耐用性能强

    宏碁非凡go air超轻薄本惊艳上市,仅重999克,售价4999元,首发更享国家补贴,到手价仅需3999.2元!这款轻薄本采用镁铝合金机身,搭配时尚的星辰灰配色,兼顾轻便与耐用性。 性能方面,非凡Go Air搭载强劲的英特尔酷睿i7-13260H处理器,拥有10核16线程,最高睿频可达4.9GHz,…

    2026年9月27日 • 用户投稿
    100

发表回复

登录后才能评论
关注微信