2014-01-29 5 views
1

배열에 split()의 문자열이 포함되어 있고 shift() 메서드를 사용하여 한 번에 한 글자를 div에 인쇄하는 변수가 있습니다. setTimeout을 사용하여 프로세스를 반복하고 전체 문자열을 인쇄합니다. 내가 겪고있는 문제는 함수가 문자열의 다음 문자로 이동하지 않고 첫 번째 문자를 반복해서 출력한다는 것입니다. 매개 변수가있는 setTimeout을 사용하여 알 수있는 유일한 방법은 아무것도 사용하지 않은 것 같습니다.setTimeout() 문제 반복 작업

여기서 코드의 문제점은 무엇입니까?

<div id='ltrType'></div> 
<script> 
function buildWord(str) { 
    var arr = str.split(''); 

    if(arr.length > 0) { 
     document.getElementById('ltrType').innerHTML += arr.shift(); 
    } else { 
     clearTimeout(timer); 
    } 

    //I've tried setTimeoout like this 
    timer = setTimeout(buildWord,100,str); 

    //and like this 
    timer = setTimeout(function(){ buildWord(str); }) 
} 

buildWord('this is another string blah blah blah'); 
+1

'str'이 (가) 호출에서 호출로 변경되지 않습니다. 항상 같은 문자열입니다. – crush

+0

새로 고침 할 때마다 처음부터 시작됩니다. –

답변

2

를 이동합니다. 그래서 기본적으로 매번 동일한 문자열을 계속 전달하며 매번 첫 번째 문자는 동일합니다. 대신에, 이런 식으로 작업을 수행합니다

function buildWord(arr) { 
    if (typeof arr === "string") { 
     arr = arr.split(''); 
    } 
    if (arr.length) { 
     document.getElementById('ltrType').innerHTML += arr.shift(); 
     setTimeout(function() { 
      buildWord(arr); 
     }, 100); 
    } 
} 

buildWord('this is another string blah blah blah'); 
1

당신이 초기 배열을 메소드 호출의 각 시간을 구축하고 있기 때문에, 당신이 이동 arr 동안 당신은, str 전달 유지 외부

function buildWord(str) 
{ 
    var arr = str.split(' '); 

    var helper = function buildWordHelper() 
    {  
     if(arr.length > 0) { 
      document.getElementById('ltrType').innerHTML += arr.shift(); 
     } else { 
      clearTimeout(timer); 
     } 

     setTimeout(helper, 100); 
    } 
    setTimeout(helper, 100); 
} 

buildWord("bla bla1 bla123"); 
+0

코드가 올바르지 않습니다. 'str'은 buildWord 함수의 매개 변수입니다. 함수 외부로 나눌 수 없습니다. 당신의 코드는'str'이 다른 곳에서 정의되었다고 가정합니다. –

+0

oops, 당신 말이 맞아요.하지만 아무도 나를 밖에서 문자열을 움직이지 못하게합니다 ... 편집되었습니다. 적어도 이제는 작동 할 것입니다. –

+0

사실 : 그것은 작동하지만, 기능은 쓸모 없게되었습니다. '매번 같은 문자열. 이 함수는 모든 문자열과 함께 사용할 수 있다는 생각이 들었습니다 :) –

0

beacuse의 편곡은 같은 값으로 매번 initalized지고, 당신은 당신이 기능을 외부에서 퍼팅 str.Try을 통과 한, 또 다시, buildword를 호출합니다.

var arr=null; 
var firsttime=0; 
function buildWord(str) 
{ 
if(firsttime==0) 
{ arr=str.split('');firsttime=1;} 
..... 
}