使用 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)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2025年12月22日 16:06:08
下一篇 2025年12月22日 16:06:18

相关推荐

  • 解决JavaScript中数字字符串加法问题的教程

    本文旨在解决JavaScript中从HTML输入框获取数值进行加法运算时,因默认字符串类型导致意外拼接而非数学相加的问题。我们将深入探讨JavaScript的类型转换机制,特别是+运算符的特殊行为,并提供使用Number()或parseInt()进行显式类型转换的解决方案,确保正确执行数值计算。 理…

    2025年12月22日
    000
  • HTML5中新增了哪些语义化标签

    HTML5语义化标签提升了网页结构清晰度,使代码更具可读性和维护性;主要标签如、、、、、、等明确划分页面区域,增强机器与人的理解;它们改善SEO,便于搜索引擎抓取核心内容,同时提升无障碍访问体验,帮助屏幕阅读器用户快速定位;正确使用需遵循标签语义,避免滥用或混淆与,注意唯一性;尽管早期存在IE兼容问…

    2025年12月22日
    000
  • HTML中如何实现SVG图形

    在HTML中实现SVG图形主要有内联和外部引用两种方式,内联SVG便于通过CSS和JavaScript操作,适合需要交互的小型图形;外部引用利于缓存和维护,适用于重复使用的静态图标,选择应基于性能、交互需求与可维护性的权衡。 这是一个简单的蓝色圆圈,鼠标悬停时会变色。 外部SVG引用:将SVG图形保…

    2025年12月22日
    000
  • 如何设置内容的可翻译性

    答案:实现内容可翻译性需从设计开发初期融入国际化理念,通过字符串外部化、参数化处理、本地化格式支持、RTL布局适配、多媒体替换、API区域设置支持等技术手段,结合简洁中立的内容创作、上下文提供、术语表维护等管理措施,并在设计阶段预留弹性、选用支持i18n的架构、制定开发规范、实施伪本地化测试,提升团…

    2025年12月22日
    000
  • HTML中如何实现提示框

    答案:纯CSS提示框通过:hover和定位实现,JavaScript用于动态内容、复杂交互与可访问性增强。 在HTML中实现提示框,我们通常会利用CSS的伪类 :hover 来控制元素的显示与隐藏,配合HTML结构和一些基础样式就能实现一个静态提示框。而对于更复杂、动态或需要高度可访问性的场景,Ja…

    2025年12月22日
    000
  • pre和code标签怎么用

    用于标记行内代码,保留文本格式,二者结合使用可语义化地展示代码块,提升可读性、SEO及无障碍访问。最佳实践是嵌套使用并添加等宽字体、背景色、内边距和滚动处理等CSS样式。 和 标签在HTML中扮演着至关重要的角色,它们的核心作用是向浏览器和用户明确指出某段内容是代码或者预格式化的文本。简单来说, 适…

    2025年12月22日
    000
  • 如何设置HTML页面自动刷新

    答案:HTML页面自动刷新可通过meta标签或JavaScript实现,前者简单但缺乏灵活性,后者可结合定时器或条件判断实现更智能的控制。使用meta标签仅需在head中添加即可实现5秒后刷新,适用于无交互的展示页;而JavaScript通过setTimeout或setInterval实现单次或周期…

    2025年12月22日
    000
  • canvas如何绘制矩形

    答案:在HTML5 Canvas上绘制矩形需获取2D上下文,使用fillRect()填充、strokeRect()描边、clearRect()清除;通过fillStyle、strokeStyle、lineWidth等属性控制颜色与边框,结合路径方法可绘制圆角矩形,并需注意Canvas坐标系及实际尺寸…

    2025年12月22日
    000
  • HTML中如何实现代码高亮

    最常见且高效的方式是使用JavaScript库实现代码高亮,如Prism.js或Highlight.js,通过引入库文件、包裹代码块、指定语言类型并初始化,使代码在网页中清晰呈现,提升用户体验。 // 这是一个JavaScript代码示例 function greet(name) { console…

    2025年12月22日
    000
  • HTML中如何实现拖放功能

    答案:HTML5原生Drag and Drop API通过draggable属性和dragstart、dragover、drop等事件实现拖放功能,结合dataTransfer对象传递数据,并需在dragover和drop中调用preventDefault以允许放置;通过添加视觉反馈如高亮和自定义鼠…

    2025年12月22日
    000
  • HTML中如何嵌入YouTube视频

    使用YouTube提供的iframe代码可轻松嵌入视频,通过CSS宽高比盒子实现响应式显示,并利用URL参数控制播放行为,注意解决自动播放限制、性能优化及无障碍性问题。 要在HTML中嵌入YouTube视频,最直接且推荐的方法是使用YouTube提供的 <iframe> 嵌入代码。这就像…

    2025年12月22日
    000
  • 使用CSS Flexbox实现DIV元素垂直布局与对齐

    本教程将指导您如何利用CSS Flexbox实现特定DIV元素的垂直布局,例如将页脚(footer)中的图片从水平排列转换为垂直排列,同时不影响页面其他区域(如页眉header)的布局。通过设置父容器为弹性盒模型,并指定子容器的排列方向,您可以轻松实现精确的元素对齐和布局控制。 在网页开发中,我们经…

    2025年12月22日 好文分享
    000
  • 如何设置HTML文档的背景颜色

    设置HTML文档背景颜色需使用CSS的background-color属性,可通过内联样式、内部样式表或外部样式表实现,推荐使用外部样式表以提升代码可维护性;颜色表示法包括命名色、十六进制、RGB和HSL,其中HSL更便于调整色调与明暗;为不同页面区域设置背景色时,应结合语义化标签与CSS选择器,确…

    2025年12月22日
    000
  • 解决JavaScript加法运算中的字符串连接问题:类型转换指南

    本文深入探讨了JavaScript在处理HTML表单输入时,加法运算符(+)可能导致的字符串连接问题。当从input元素获取的值为字符串类型时,即使内容是数字,+运算符也会执行字符串拼接而非数学加法。教程将详细解释这一机制,并提供使用Number()、parseInt()等函数进行显式类型转换的解决…

    2025年12月22日
    000
  • HTML中如何实现对话框

    最推荐使用原生元素实现对话框,因其语义化、内置可访问性、支持模态与非模态模式,且API简单;通过showModal()打开模态框并自动管理焦点与ESC关闭,结合::backdrop可定制样式;虽在动画定制和老旧浏览器兼容性上存在局限,但现代项目中已足够使用;其他方式如手动构建或UI框架组件适用于高定…

    2025年12月22日
    000
  • HTML中如何设置网页的语言属性

    最直接的方式是在标签上使用lang属性,如或,以明确网页主语言。该属性提升屏幕阅读器可访问性、增强SEO、优化浏览器渲染,并为多语言网站奠定基础。通过ISO标准选择语言代码,结合hreflang声明多语言页面关系,避免搜索引擎混淆和用户体验问题。忽略此属性可能导致辅助技术失效、搜索排名下降、翻译功能…

    2025年12月22日
    000
  • 整合Luhn算法实现信用卡号表单验证

    本文旨在指导开发者如何在基于HTML5和JavaScript的表单验证系统中,集成Luhn算法对信用卡号进行实时验证。文章将详细阐述如何正确获取输入字段、应用Luhn算法逻辑,并通过setCustomValidity API管理自定义验证状态及错误提示,确保表单提交前所有字段的有效性,提升用户体验。…

    2025年12月22日
    000
  • footer标签通常包含哪些信息

    页脚是用户体验和SEO的重要组成部分,它提供版权、联系信息、辅助导航等必要内容,增强网站信任度并帮助搜索引擎索引页面。 页脚( 标签)通常承载着网站的“幕后”信息,那些对用户浏览核心内容不是最关键,但又必不可少、或能提供额外支持和信任度的内容。它像是网站的“名片背面”,包含了版权声明、联系方式、辅助…

    2025年12月22日
    000
  • img标签插入图片时需要哪些属性

    img标签核心属性包括src、alt、width、height、loading、srcset和sizes。src定义图片路径,是显示图片的基础;alt提供替代文本,对无障碍访问和SEO至关重要,帮助视障用户和搜索引擎理解图片内容;width和height预先声明尺寸,避免布局偏移,提升用户体验;lo…

    2025年12月22日 好文分享
    000
  • Flexbox布局中flex: 1的宽度分配机制解析

    在Flexbox布局中,当所有子元素均设置flex: 1时,为何实际宽度可能不相等,特别是当某些子元素包含大量不可折行内容时。文章解释了flex属性的工作原理,阐明了内容最小宽度对Flex项尺寸的影响,并提供了通过优化内容结构、调整flex属性值以及采用CSS Grid布局来精确控制元素宽度的解决方…

    2025年12月22日
    000

发表回复

登录后才能评论
关注微信