HTML怎么做随机键盘组件_html随机排列安全键盘实现【示例】

雨雪酱_7241

雨雪酱_7241

2026-05-23

924人浏览

原创

不能用 math.random() 直接 shuffle dom 节点,因浏览器排序算法实现不同且伪随机比较函数违反一致性前提;应使用 fisher-yates 算法预生成固定数组再批量渲染。

html怎么做随机键盘组件_html随机排列安全键盘实现【示例】

为什么不能用 Math.random() 直接 shuffle 键盘 DOM 节点

直接对 document.querySelectorAll('.key') 结果调用 Array.prototype.sort(() => Math.random() - 0.5) 看似简单,但会导致键盘布局在不同浏览器中分布不均——Chrome 可能偏左密集,Firefox 偏右,Safari 甚至出现重复或缺失。这不是 bug,而是 V8、SpiderMonkey、JavaScriptCore 对 sort 算法实现不同(快排 vs 插入排序),而伪随机比较函数违反了排序算法的「一致性」前提。

真正安全的做法是:先生成固定长度的键值数组(如 10 个数字 + 26 个字母 + 符号),再用 Fisher-Yates 洗牌算法重排,最后批量渲染 DOM。

  • 洗牌前固定种子(如用时间戳 + 用户操作延迟哈希)可提升可复现性,方便测试
  • 避免在每次 focus 输入框时都重新洗牌——应缓存一次结果,直到用户主动刷新或超时(如 90 秒)
  • DOM 渲染必须用 document.createDocumentFragment() 批量插入,否则每 shuffle 一次触发 40+ 次重排

如何保证每次生成的键盘都“视觉随机”但“逻辑可控”

用户看到的是按钮位置乱序,但背后每个 button 的 data-value 必须严格对应真实字符,且不能暴露映射关系。常见错误是把字符直接写死在 innerHTML 里,导致 DevTools 一眼可见全部键值。

正确做法是:渲染时只写占位符(如 ​ 零宽空格),通过 CSS ::before 伪元素 + content 动态注入字符,并用 pointer-events: none 阻止选中;真实值仅存在 JS 内存中,点击时查表返回。

Html2md
Html2md

使用 Readability + Turndown 将 HTML 页面转换为干净的、Agent 友好的 Markdown。去除导航栏、广告、页脚、Cookie 横幅、社交按钮等干扰元素。支持 URL...

下载
  • 禁用右键菜单和文本选择:user-select: none; -webkit-user-select: none;
  • 所有按键宽度/高度设为固定值(如 40px),避免因字体渲染差异导致错位
  • 用 touch-action: manipulation 提升移动端点击响应速度

怎么防止键盘被自动化脚本识别和点击

单纯加 class 名混淆或随机 ID 不起作用——Puppeteer 和 Playwright 可轻松遍历所有 button 并触发 click()。关键在于切断「坐标 → 字符」的确定性映射。

推荐组合策略:① 每次加载时动态生成 3–5 个备用键盘容器(div.keyboard-set),只显示其中一个,其余 display: none;② 真实按键事件监听绑定在 document 级,通过 event.target.closest('.keyboard-button') 获取点击源;③ 在事件处理器内做二次校验:检查该按钮是否属于当前激活的键盘容器,且其 data-timestamp 未过期(如生成后 60s 内)。

  • 不要依赖 event.clientX/Y 坐标反查字符——高 DPI 屏幕下像素偏移会导致误判
  • 禁用 tabindex 和键盘导航,防止绕过鼠标点击
  • 对连续快速点击(如 3 次/秒以上)加入简单节流,过滤掉自动化高频行为

示例:一个可直接运行的最小可行键盘组件

以下代码不含样式,仅聚焦核心逻辑。复制到 HTML 文件中即可运行,生成 4×3 数字+符号安全键盘:

const safeKeys = ['1','2','3','4','5','6','7','8','9','0','*','#'];
function fisherYates(arr) {
  const shuffled = [...arr];
  for (let i = shuffled.length - 1; i > 0; i--) {
    const j = Math.floor(Math.random() * (i + 1));
    [shuffled[i], shuffled[j]] = [shuffled[j], shuffled[i]];
  }
  return shuffled;
}
function renderKeyboard(containerId) {
  const container = document.getElementById(containerId);
  const keys = fisherYates(safeKeys);
  const frag = document.createDocumentFragment();
  keys.forEach((val, idx) => {
    const btn = document.createElement('button');
    btn.type = 'button';
    btn.className = 'keyboard-button';
    btn.dataset.value = val;
    btn.dataset.index = idx;
    btn.innerHTML = '​'; // 零宽空格
    frag.appendChild(btn);
  });
  container.innerHTML = '';
  container.appendChild(frag);
}
document.addEventListener('DOMContentLoaded', () => {
  renderKeyboard('safe-keyboard');
  document.getElementById('safe-keyboard').addEventListener('click', e => {
    const btn = e.target.closest('.keyboard-button');
    if (btn && btn.dataset.value) {
      console.log('输入:', btn.dataset.value); // 替换为实际处理逻辑
    }
  });
});

注意:这个示例没加防录屏、防调试等高级对抗措施。真正在支付或登录场景使用时,需配合服务端 nonce 校验、客户端行为指纹、以及每次提交时验证按键序列与服务端预生成的映射表是否匹配——这些不是前端能独立完成的。

前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!

相关文章

HTML速学教程(入门课程)
HTML速学教程(入门课程)

HTML怎么学习?HTML怎么入门?HTML在哪学?HTML怎么学才快?不用担心,这里为大家提供了HTML速学教程(入门课程),有需要的小伙伴保存下载就能学习啦!

下载

相关标签:

html 排列

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
html版权符号
html版权符号

html版权符号是“©”,可以在html源文件中直接输入或者从word中复制粘贴过来,php中文网还为大家带来html的相关下载资源、相关课程以及相关文章等内容,供大家免费下载使用。

2023.06.14

6555

7

html在线编辑器
html在线编辑器

html在线编辑器是用于在线编辑的工具,编辑的内容是基于HTML的文档。它经常被应用于留言板留言、论坛发贴、Blog编写日志或等需要用户输入普通HTML的地方,是Web应用的常用模块之一。php中文网为大家带来了html在线编辑器的相关教程、以及相关文章等内容,供大家免费下载使用。

2023.06.21

3652

4

html网页制作
html网页制作

html网页制作是指使用超文本标记语言来设计和创建网页的过程,html是一种标记语言,它使用标记来描述文档结构和语义,并定义了网页中的各种元素和内容的呈现方式。本专题为大家提供html网页制作的相关的文章、下载、课程内容,供大家免费下载体验。

2023.07.31

3330

5

html空格
html空格

html空格是一种用于在网页中添加间隔和对齐文本的特殊字符,被用于在网页中插入额外的空间,以改变元素之间的排列和对齐方式。本专题为大家提供html空格的相关的文章、下载、课程内容,供大家免费下载体验。

2023.08.01

3339

5

html是什么
html是什么

HTML是一种标准标记语言,用于创建和呈现网页的结构和内容,是互联网发展的基石,为网页开发提供了丰富的功能和灵活性。本专题为大家提供html相关的各种文章、以及下载和课程。

2023.08.11

4999

6

html字体大小怎么设置
html字体大小怎么设置

在网页设计中,字体大小的选择是至关重要的。合理的字体大小不仅可以提升网页的可读性,还能够影响用户对网页整体布局的感知。php中文网将介绍一些常用的方法和技巧,帮助您在HTML中设置合适的字体大小。

2023.08.11

3281

3

html转txt
html转txt

html转txt的方法有使用文本编辑器、使用在线转换工具和使用Python编程。本专题为大家提供html转txt相关的文章、下载、课程内容,供大家免费下载体验。

2023.08.31

3089

3

html文本框代码怎么写
html文本框代码怎么写

html文本框代码:1、单行文本框【<input type="text" style="height:..;width:..;" />】;2、多行文本框【textarea style=";height:;"></textare】。

2023.09.01

2708

6

HTML嵌入CSS样式的方法
HTML嵌入CSS样式的方法

HTML嵌入CSS样式的方法有内联样式、内部样式表和外部样式表。本专题为大家提供CSS样式相关的文章、下载、课程内容,供大家免费下载体验。

2023.09.20

2808

5

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
GDB 17.2 官方文档集合
GDB 17.2 官方文档集合

共0课时 | 0人学习

Bootstrap 入门安装配置
Bootstrap 入门安装配置

共0课时 | 0人学习

38+ PhpStorm 提示和技巧
38+ PhpStorm 提示和技巧

共1课时 | 226人学习