我需要创建一个函数来检测在函数的第一个参数(onkeydown
)中指定的keyset
事件(reqKeysToFunc
)。一旦检测到,这将调用函数的第二个参数(myFunc
)中指定的函数。
当我按下Z或M时,我当前的代码会显示警告,但是我希望在按下它们之后显示警报,而不是仅显示警报。另外,我希望能够为keyset
参数添加不同的字母,但我不知道如何在函数中定义它。
function reqKeysToFunc( keySet, myFunc) {
document.onkeydown = function(event) {
"use strict";
var myKey = event.key.toUpperCase();
var keySet = 'ZM';
if (keySet.search(myKey) > -1 ) {
document.onkeydown = null;
myFunc();
}
}
}
function tmp() {
alert('hello');
}
reqKeysToFunc('ZM', tmp);
此示例允许您定义要查找的序列数组。它存储用户在名为currentSequence的全局中键入的部分序列。如果成功输入整个序列,则使用键入的序列调用myFunc。
var sequences = ['ZM', 'AB'];
var currentSequence = "";
document.onkeydown = function(event) {
"use strict";
var myKey = event.key.toUpperCase();
// see if the current sequence is valid
var valid = sequences.filter(function (el) {
return el.indexOf(currentSequence + myKey) === 0;
});
if (!valid.length) {
// current sequence is not valid, start over
currentSequence = "";
} else {
currentSequence += myKey;
// see if the current sequence is complete
var found = valid.indexOf(currentSequence);
if (found > -1) {
// user typed a complete sequence
myFunc(currentSequence);
currentSequence = "";
}
}
}
function myFunc(sequence) {
alert("You typed " + sequence);
}
Type stuff
像这样的东西应该做的工作。您将按下的键存储在对象中。并检查来自set的不同按键的数量是否等于set中的字母数。
function reqKeysToFunc( keySet, myFunc) {
var pressedKeys = {};
document.onkeydown = function(event) {
"use strict";
var myKey = event.key.toUpperCase();
//var keySet = 'ZM'; //remove this line - keySet is defined as an argument
if (keySet.search(myKey) > -1 ) {
pressedKeys[myKey] = true;
document.onkeydown = null;
if(pressedKeys.entries().filter((key, val) => val).length === keySet.length) {
myFunc();
}
}
}
}
function tmp() {
alert('hello');
}
reqKeysToFunc('ZM', tmp);
我做过这个似乎有效的方法:
function reqKeysToFunc( keySet, myFunc) {
document.onkeydown = function(event) {
"use strict";
var myKey = event.key.toUpperCase();
if (keySet.search(myKey) > -1 ) {
keySet = keySet.replace(myKey, '');
if(keySet === '') {
document.onkeydown = null;
myFunc();
}
}
}
}
function tmp() {
alert('hello');
}
reqKeysToFunc('ZM', tmp);
我希望在按下它们之后显示警报,而不仅仅是一个。
您可以使用要检测的每个键的标志来执行此操作。当按下Z时,zFlag
变量设置为true
。当按下M时,mFlag
变量设置为true
。只有设置了两个标志才会调用alert
函数。
看这个例子:
var zFlag = false,
mFlag = false;
function reqKeysToFunc(keySet, myFunc) {
document.onkeydown = function(event) {
"use strict";
var myKey = event.key.toUpperCase();
var keySet = 'ZM';
if (keySet.search(myKey) > -1) {
if (myKey == 'Z') { // if Z was pressed
zFlag = true;
} else { // if M was pressed
mFlag = true;
}
if (zFlag && mFlag) { // if both keys have been pressed
document.onkeydown = null;
myFunc();
}
}
}
}
function tmp() {
alert('hello');
}
reqKeysToFunc('ZM', tmp);
document.body.focus(); // so you don't have to click before typing
此外,我希望能够为键集参数添加不同的字母,但我不知道如何在函数中定义它。
您有动态定义键集的基础:将其作为参数传递给reqKeysToFunc()
。您只需要删除函数内部的静态var keyset
声明,创建一个数组来存储哪些键已被按下,哪些键没有,然后检查按下的每个键。
请参阅此解决方案(将ZMD
作为键集传入):
var zFlag = false,
mFlag = false;
function reqKeysToFunc(keySet, myFunc) {
var keySetArray = keySet.split(''); // get an array of keys
document.onkeydown = function(event) {
"use strict";
var myKey = event.key.toUpperCase();
if (keySetArray.indexOf(myKey) > -1) {
keySetArray.splice(keySetArray.indexOf(myKey), 1); // remove the pressed key from the array
if (!keySetArray.length) { // if all keys have been pressed
document.onkeydown = null;
myFunc();
}
}
}
}
function tmp() {
alert('hello');
}
reqKeysToFunc('ZMD', tmp);
document.body.focus(); // so you don't have to click before typing
在按钮单击时声明变量并保存计数,然后检查按钮是否获得单击,变量是否为值1然后显示警报