2017-12-18 271 views
0

我需要製作一個函數,用於檢測在函數(reqKeysToFunc)的第一個參數(keyset)中指定的onkeydown事件。一旦檢測到,這將調用函數的第二個參數(myFunc)中指定的函數。下面JavaScript:如何在按下兩個按鈕後得到警報

我當前的代碼顯示當按下任一ž中號警報,但我想提醒展示後他們兩個被按下,而不只是一個。另外,我希望能夠爲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); 

回答

-3

聲明一個變量並保存指望上按一下按鈕,然後檢查按鈕獲得點擊次數和變量值1,則顯示警告

+0

會是什麼代碼看起來象是什麼? –

+0

如果Z或M被按下兩次,而不是隻有兩個按鍵被按下,纔會顯示警報。 – freginold

+0

是的,哎呀抱歉,我沒有想到這個? –

0

像這樣的東西應該做的工作。 將按鍵存儲在對象中。並檢查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); 
0

我希望告警顯示兩個人都被壓制,而不只是一個後。

你可以使用你想檢測的每個鍵的標誌來做到這一點。當按下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

這個例子讓你定義序列來查找的陣列。它存儲用戶在全局調用的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

0

我已經做到了這一點,這似乎已經奏效:

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);