2011-08-27 1 views
2

주어진 단어의 순열을 생성하는 알고리즘을 가지고 있습니다. 나는 setInterval()을 사용하여 다음 순열을 생성하려고 시도하지만 함수는 한 번만 실행됩니다! 나는 이유를 알 수 없다. 오류 메시지가 표시되지 않습니다. 코드가 계속자바에서 작동하도록 setInterval()을 사용할 수 없습니다.

$를 호출 ('#의 StopBtn이') (클릭) :

<div id="content"> 
<input id="anagram" type="text" placeholder="Insert your text here" maxlength="80"/>     <br /> 
<input id="SubmitBtn" type="submit" value="submit" /> 
<br /> 
<textarea id="AnagramTxtArea" readonly="readonly"></textarea> 

</div> 

편집 : 아직, 또 다른 문제가. 여기에 내 코드

var splitted; 
var t; 
$(document).ready(function() { 
$('#SubmitBtn').click(function() { 
    //change Start to Stop and change button id 
    $('#SubmitBtn').attr('id','StopBtn').attr('value','Stop'); 
    //and add click event to it 
    $('#StopBtn').click(function() { 
     clearInterval(t); 
     $('#StopBtn').attr('value','Submit'); 
     $('StopBtn').attr('id','SubmitBtn'); 
    }); 
    if ($('#AnagramTxtArea').val().length>0) 
      $('#AnagramTxtArea').text(''); 
    var inputTxt = $('#anagram').val(); 
    splitted = inputTxt.split(""); 
    splitted.sort(); //first sort the array in order to generate permutations 
    $('#AnagramTxtArea').append(splitted.join("") + " "); 
    t= setInterval(GeneratePermutation(),10); 
}); 
}); 

var AnagramObj = new Anagram(); 
function GeneratePermutation() { 
     splitted = AnagramObj.NextPermutation(splitted); 
     if (splitted!=null) 
      $('#AnagramTxtArea').append(splitted.join("") + " ");  
     else 
      $('#StopBtn').click(); 

    } 

및 HTML입니다 기존의 click 이벤트 함수 다음에 실행하십시오. 그래서 저는 무한 루프에 있습니다. 간격 여부를 확인, 당신이 할 수있는 것은 두 번째 질문에 있습니다 :

편집
t = setInterval(GeneratePermutation,10); 
           //^No parentheses 

:

답변

12

당신은, setInterval()에 함수 객체 자체를 전달하는 함수를 호출하지 않는 결과를 필요 실행 중입니다. 이 경우, 취소 : 여기

var splitted; 
var t; 
$(document).ready(function() { 
$('#SubmitBtn').click(function() { 
    if (t !== undefined) { //interval is already running 
     clearInterval(t); 
     t = undefined; 
     $('#SubmitBtn').attr('value','Submit'); 
    } else { 
     //change Start to Stop 
     $('#SubmitBtn').attr('value','Stop'); 
     if ($('#AnagramTxtArea').val().length>0) 
       $('#AnagramTxtArea').text(''); 
     var inputTxt = $('#anagram').val(); 
     splitted = inputTxt.split(""); 
     splitted.sort(); //first sort the array in order to generate permutations 
     $('#AnagramTxtArea').append(splitted.join("") + " "); 
     t = setInterval(GeneratePermutation,10); 
    } 
}); 
}); 
+0

감사합니다.나는 1 시간 동안 여기에서 찔렀다. :) –

+0

@ DanDinu : 두 번째 문제에 대한 해결책으로 내 대답을 업데이트했다. –

+0

위대한 작품이지만 정말 이유를 이해할 수 없다. 버튼 ID를 StopBtn으로 변경하고 $ ('# StopBtn')을 호출합니다. GeneratePermtation()에서 click()을 클릭합니다. SubmitBtn.click()이 여전히 실행되는 이유는 무엇입니까? 그것은 다른 ID입니다. –

4

당신은 실제로 당신이 setInterval을 호출 시간()에서 GeneratePermutation()을 실행

t = setInterval(GeneratePermutation(),10); 

당신은 setInterval을에 함수를 통과해야(). 대신이 작업을 수행합니다 : 당신은 함수 이름 또는 setInterval을위한 첫 번째 인수로 익명 함수에 통과해야합니다

t = setInterval(GeneratePermutation, 10); 
3

. MDN 참조하여 setInterval에 대한 https://developer.mozilla.org/en/window.setInterval

t = setInterval(GeneratePermutation,10); 

또는

t = setInterval(function() { /* code */ }, 10); 

올바른 구문을 참조하십시오 :

  • intervalID을 위해 clearInterval에 전달할 수있는 고유 간격 ID가 (이다

    var intervalID = window.setInterval(func, delay[, param1, param2, ...]); 
    var intervalID = window.setInterval(code, delay); 
    

    ).

  • func는 반복적으로 호출하려는 함수입니다. 코드에서
  • 대체 구문은 반복적으로 실행하려는 코드 문자열입니다. (이 구문을 사용하면 eval()을 사용하는 것과 동일한 이유는 권장되지 않습니다. delay는 func을 호출하기 전에 setInterval() 함수가 을 기다려야하는 밀리 초 수로 (천분의 1 초)입니다. setTimeout과 마찬가지로 최소 지연 시간은 입니다.

편집 : 이 당신이 클릭을 발사하려고하는 가정, 문제가 될 수 있습니다.

function GeneratePermutation() { 
     splitted = AnagramObj.NextPermutation(splitted); 
     if (splitted!=null) 
      $('#AnagramTxtArea').append(splitted.join("") + " ");  
     else 
      //$('#StopBtn').click(); 
      // should be 
      $('#StopBtn').trigger('click'); 

    } 
+0

'$ ('# StopBtn') 확실합니까? click()'이 (가) 실행 중입니까? 함수에'alert()'또는'console.log()'를 던지십시오. 내 편집을 참조하십시오. – Trevor

+0

네, 발사됩니다. 크롬에서 중단 점을 사용했지만 클릭 기능 코드가 끝나면 코드가 계속 실행됩니다 –

+0

내 편집을 확인하십시오. :) – Trevor