2012-09-12 93 views
0

我將首先解釋我正在嘗試做什麼:)睡眠在JavaScript循環?

我的應用程序是使用PHP(Zend框架)和Javascript實現的。我想爲我的申請進行問卷調查,到目前爲止我已完成以下工作:

我的頁面包含一系列元素,其中#表示特定問題的索引。例如我的HTML看起來像這樣:

<div class="question 1 active"> 
</div> 
<div class="question 2"> 
</div> 
<div class="question 3"> 
</div> 
. 
. 
. 
etc. 

現在,用戶應該可以看到每個問題的spesific預先選定的時間,直到問題變爲可能的答案,用戶應單擊「是」或「否」取決於他是否認爲答案是正確的。一次只有一個<div class="question #">-元素處於活動狀態,其他則有display:none;。問題更改爲下一個問題後,active-attribute將從當前問題中刪除,並設置爲下一個問題,以便用戶遍歷所有問題。

與每個question/possible answer -pair我有兩個相關的整數,它們表示用戶有多少時間來看問題以及用戶有多少時間來回答問題。舉個例子:

用戶看到此(或多或少):

QUESTION 1/10 

The name of the President of U.S.? -------------- 5 sec 
.. 
The name of the President of U.S.? -------------- 4 sec 
.. 
The name of the President of U.S.? -------------- 3 sec 
.. 
etc. THE TIME ENDS and the question changes to answer mode(buttons YES/NO appear also in this part): 

Bruce Wayne? ------------------------------7 sec 
[YES] [NO] 
... 
Bruce Wayne? ------------------------------6 sec 
[YES] [NO] 
... 
Bruce Wayne? ------------------------------5 sec 
[YES] [NO] 
... 
etc. 

當任一時間用完在ANSWER相或用戶點擊任一按鈕YES/NO的jQuery從當前問題中刪除ACTIVE並將其設置爲下一個。用戶點擊的值也存儲在隱藏元素中。這個過程應該通過調查問卷一直重複。

現在關於問題和答案階段的定時器。他們不是固定的,而是針對每個問題進行分類。例如question1可能有問題/回答時間(秒)5/10等等。

現在我的問題是...如何在JavaScript方面實現這一點?當我通過包含所有關於問題的信息(PHP中設置的服務器)的數組來循環javascript時,我的問題就出現了......我應該能夠遍歷客戶端中的所有question/answer對,然後在每次迭代中停止迭代轉到下一個問題(下一個問題),直到用戶點擊答案或時間已用完。但問題是,據我所知,我不能睡在for循環或每個jQuery中......你看到我的問題? :)

上執行任何建議表示讚賞:)

+3

不要做它!!!!!你想要做的* LAST *事情是在你的Javascript中「睡眠」或「忙等待」!這將會讓一個非常惱火的用戶面對沒有響應的用戶界面和/或超載的系統。 *正確*做的事情是設置一個「鬧鐘」,當「超時」時激活。例如:http://javascript.info/tutorial/events-and-timing-depth – paulsm4

回答

5

更改for循環通過的setTimeout

var timeLeft = 10, 
    countdown = function(){ 
     $('#mySpan').html('The name of the President of U.S.? -------------- ' + timeLeft + ' sec'); 
     timeLeft -= 1; 

     if (timeLeft) { 
      setTimeout(countdown, 1000); 
     } 
    }; 

countdown(); 

稱爲遞歸函數採取這一邏輯,你可以擴展它X後改變你的問題秒等,然後通過輸入參數maxTimequestionTextquestionType來顯示輸入字段或單選按鈕集。

快速演示:http://jsfiddle.net/AlienWebguy/aW9mH/

+0

感謝您的建議:) – jjepsuomi

+0

'+ 1'用於'setTimeout'方法建議。 –

1

這裏是一個古怪的方式做到這一點,我一直與最近嘗試一點點。我不需要建議你做任何這樣的事情,但沒有感到自己明白你的理解,但它很好玩。

function countdown(loops, pause, id) { 
    (function setup(timer, el, text) { 
     (function loop(invalid) { 
      (function check(stop) { 
       return stop || !loops-- || timer(loop, pause); 
      })(invalid || !loops, el[text] = loops); 
     })(!loops || !pause); 
    })(setTimeout, document.getElementById(id) || {}, 'innerHTML'); 
}​ 

countdown(10, 1000, 'timer'); 

http://jsfiddle.net/userdude/ghN3m/1

這是一個有點奇怪尋找,但它是有趣的實驗。

1

JavaScript是有做一個網站反應積極主動。

所以它不應該死去。

如果它不只是去死你的客戶是出了門