在JavaScript延迟后弹钢琴键

时间:2012-09-07 13:45:52

标签: javascript arrays keypress

我正在尝试编写一个脚本来“播放”this online keyboard上的某些键,方法是使用JavaScript为我“点击”键。

代码

//sample array to iterate over
var keys_ = ['et', 'dst', 'et', 'dst', 'et', 'b', 'dt', 'ct', 'a', ...];

//handles the clicking only
function playKey(id_) {
    key_ = document.getElementById(id_);
    key_.click(); }

//iterates over the array
function playKeys(keys_) {
    delay = 1000;
    for (i = 0; i < keys_.length; i++) {
        console.log(delay);
        key_ = keys_[i];
        console.log(key_);
        window.setTimeout('playKey(key_)', delay);
        delay += 1000; 
        } 
    }

输出

控制台抛出以下错误:

  

1000
  等
  2000
  DST
  ...
  9000
  一个
  未定义
  未捕获的TypeError:无法读取null p-ano.html的属性'style':142
  8未捕获的TypeError:无法调用方法'click'of null

如您所见,delaykey_值完全正确。但是当我执行此操作时,经过一秒钟(即1 st 超时)后,所有键似乎立即播放,然后没有任何反应。

我做错了什么?

P.S。:我看过其他问题,例如this one并搜索了谷歌和其他论坛,但无济于事

3 个答案:

答案 0 :(得分:2)

了解闭包。

window.setTimeout(function(){ playKey(key_); }, delay);

你有全局和本地的问题。使用var!

我写它的方式是

( function() {
    var keys_ = ['et', 'dst', 'et', 'dst', 'et', 'b', 'dt', 'ct', 'a'],
        delay = 250,
        currentIndex = 0,
        playKeys = function () {
            document.getElementById(keys_[currentIndex]).click();        
            currentIndex++;
            if (currentIndex<keys_.length) {
                window.setTimeout(playKeys,delay);
            }    
        };    
    playKeys();
})();

答案 1 :(得分:1)

咦?已经有一个名为playstr()的内置函数。

function playstr(instr) {
    keystr = instr;
    time = 0;
    k = 0;
    for (i = 0; i < keystr.length; i++) {
        setTimeout("playkbd(keystr[k])", time += 50);
        setTimeout("k++", time + 50);
        setTimeout("cb()", time += 200);
    }
}​

尝试按“z”,“x”或“m”运行它们。

if (key=="z")
  playstr("wetyuyuju     ujo..juyyuj..uyttfy..yuytft     ujp..o;poko     opoj..uy\
  uju     ujo..juyyuj..uyttfy..yuytft     w e t y u y uoj u ")

if (key=="x")
  playstr("tgtdtgtdtgghhgtdd              tgtdtgtdtgghhgtdd              djjjkjhh\
  jhghjhg djjjkjhhjhghjhg djjjkjhhjhghjhg djjjkjhhjh     tgtdtgtdtgghhgtdd")

if (key=="m")
  playstr("         k j y j k j y f e f e a e f y j k j y j k j y f e f e a e f y\
   j k j y j k j y f e f e a e f y j k j y j k j y f e f e a e f y j ")

我正在运行mirror并想知道如何自动演奏和弦。

// F F 1 F A N F A R E 

if (key==".") {
  setTimeout("playstr('u y u yo ok ok ku y g yf   u y u yo ok ok ku y u op ')",100)
}

答案 2 :(得分:0)

我假设您发布的代码正是您正在运行的代码。在这种情况下,三个点是非法的。

keys_ = ['et', 'dst', 'et', 'dst', 'et', 'b', 'dt', 'ct', 'a', ...]

尝试删除它们,如

keys_ = ['et', 'dst', 'et', 'dst', 'et', 'b', 'dt', 'ct', 'a']

另外,作为提示,请尝试编写更清晰的JavaScript。在声明变量之前使用var。用;分号结束你的陈述。