如何解决如何使用 JavaScript 欺骗打字测试来输入字母
我正在尝试想出一个解决方案来虚拟按键进行打字测试。我想要的是获取文本并将单个字母存储在一个数组中,然后在每次按下之间有一些延迟按下所有键。
这是文本布局的 HTML。想象一下它有 hello
这个词。
<div class="digit-container">
<div>
<span>h</span>
</div>
</div>
<div class="digit-container">
<div>
<span>e</span>
</div>
</div>
<div class="digit-container">
<div>
<span>l</span>
</div>
</div>
<div class="digit-container">
<div>
<span>l</span>
</div>
</div>
<div class="digit-container">
<div>
<span>o</span>
</div>
</div>
这是我想出的 JavaScript 代码。我已经设法将这些字母存储在一个数组中。
const elements = document.querySelectorAll(".digit-container > div > span");
const chars = Array.from(elements).map((item) => item.textContent);
const delay = 1000;
let i = 0;
const pressKey = () => {
setTimeout(() => {
const char = chars[i];
const event = new KeyboardEvent("keyup",{
key: char
});
document.body.dispatchEvent(event);
if (i !== chars.length - 1) {
i++;
pressKey();
}
},delay);
};
pressKey();
document.body.addEventListener("keyup",(e) => {
console.log(e.key);
});
然而,这仅在控制台中显示 hello
字样。现在,我希望 JavaScript 为这个字母数组 { "h","e","l","o" } 发送按键。基本上,当我粘贴此代码并在控制台中按 Enter 键时,我希望 JavaScript 在两次击键之间有几毫秒的延迟按“Hello”。这样我就可以完成打字测试了。如何让 JavaScript 进入按键?
解决方法
您被否决了很多,因为一般来说,人们不喜欢关于如何破解的问题...但我检查了是否可以回答您的问题并发现if the question focusses on the technical aspect and includes a reasonnable effort,it is okay。
我不得不承认我正在寻找一个完整的理由来结束你的问题(!)......但是因为无论如何你都非常接近找到解决方案,这里是如何做到这一点以及如何防止它(对于一个网站所有者)。
正如评论中提到的,您需要将事件分派到用户应该输入的正确元素......所以,而不是 document.body
。
但是关于要调度哪些事件,这很简单。输入输入时,触发的事件是(按顺序):keydown
、keypress
、input
和 keyup
。见下文:
let targetInput = document.querySelector("#test");
let targetEvents = ["blur","focus","input","keydown","keyup","keypress","select"];
targetEvents.forEach(function (evt) {
targetInput.addEventListener(evt,(event) => {
console.log(`${event.type}`)
setTimeout(()=>console.clear(),1600)
});
})
<input type="txt" id="test">
因此,如果您想几乎完美模拟用户键盘操作,我的建议是模拟这四个...并且您还必须将键值附加到输入值。
如何防止这种黑客方法
也就是说……我也是非常不喜欢鼓励黑客攻击的人之一。因此,我还提供了了解键盘操作是否通过 JS 模拟的方法。 真正的键盘操作具有设置为 tro istrusted
的 true
属性。浏览器提供该信息,并且不能通过 JS 覆盖。因此,如果您是需要测试真实用户操作的网站的所有者,您需要检查事件的 isTrusted
属性。
let targetInput = document.querySelector("#test");
let targetEvents = ["keydown","keyup"];
targetEvents.forEach(function (evt) {
targetInput.addEventListener(evt,(event) => {
console.log(`${(event.isTrusted)?"Real user ":"JavaScript"} - ${event.type}: ${event.key}`)
if(event.isTrusted){
setTimeout(()=>console.clear(),3000)
}
});
})
let chars = ["H","e","l","o"];
let i = 0;
const pressKey = () => {
setTimeout(() => {
const char = chars[i];
// Dispatch all the events
targetEvents.forEach(function (evt) {
let event = new KeyboardEvent(evt,{
key: char,isTrusted: true // Useless attempt overriding the isTrusted property
});
targetInput.dispatchEvent(event);
});
// Add the letter to the input value
targetInput.value += char;
if (i !== chars.length - 1) {
i++;
pressKey();
}
},150);
};
pressKey();
<input type="txt" id="test">
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。