2012-09-07 5 views
2

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
et
2000
dst
...
9000
a
undefined
Uncaught TypeError: Cannot read property 'style' of null p-ano.html:142
8 Uncaught TypeError: Cannot call method 'click' of null

에서, delaykey_ 값이 완벽하게 정확합니다. 하지만 여전히 이것을 실행하면 1 초 후에 (즉, 타임 아웃) 모든 키가 한 번에 재생 된 것처럼 보이고 아무 일도 일어나지 않습니다.

내가 뭘 잘못하고 있니?

P.S는 : 나는 당신이 실행중인 정확히 무엇을 당신이 게시 한 코드를 가정하고 this one 같은 다른 질문을 보았고 아무 소용이

답변

0

에 구글과 다른 포럼을 검색했습니다. 이 경우 세 점은 불법입니다.

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

는 끝으로, 청소기 자바 스크립트를 작성하려고

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

처럼 그들을 제거하십시오. 변수를 선언하기 전에 var을 사용하십시오. 성명서를 ; 세미콜론으로 끝내십시오.

+0

할당 전에 'var'을 추가했습니다. 감사. –

+0

왜, 할당 전에 'var' _required_가 아닌가요? 콘솔에서 실행할 때처럼 병렬 할당을 허용하기 위해 출력이 달라집니다. –

+0

그리고 세미콜론, 코드 가독성 (또는 오히려 코드 _validity_)이 중요하다는 것을 기억합니다 ... –

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(); 
})(); 
+0

'클로저 '에 대한 절박한 생각을 할 수 있어요? (나는 제대로 잤지 않았고 Google에 지금은 원하지 않는다.) –

+0

내가 많이 좋아한다. http://www.javascriptkit.com/javatutors/closures.shtml –

+0

아직 코드를 테스트하지는 않았지만 괜찮습니다. 작동하지만 왜 _my_ 코드가 작동하지 않는지 설명 할 수 있습니까? –

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) 
} 
+0

@TinaCGHeehr 이해가 안됩니다. 'playstr'은 무엇이고 내장 된 것이라면 여기에 무엇을 보여주고 있습니까? –

+0

'playkbd'는 키 누름을 시뮬레이션합니까? –

+0

'cb'는 무엇입니까? 'keystr'은 무엇이고 var'k'는 어떻게 그것과 관련이 있습니까? –