2012-03-08 61 views
0

我有以下腳本的命令:暫停的javascript腳本改變外觀

posting();  
pause(time);  
postSent(postUrl, fields); 

function postSent(postUrl, fields) 
{ 
    $.ajax({          
    url : postUrl, 
    type : "POST", 
    data : fields, 
    cache : false, 
    error : function(xhr, textStatus, errorThrown) { 
     var answer = xhr.responseText;   
    answer = answer.split(":"); 
    answer = answer[0].replace(/}/g,"").replace(/{/g,"").replace(/"/g,""); 
    if (answer == "id") 
    { 
      isPostSent = true;    
    } 
    else 
    { 
     isPostSent = false;   
    }   

    }   
    }); 
} 

function pause(milliseconds) { 
var dt = new Date(); 
while ((new Date()) - dt <= milliseconds) { /* Do nothing */ } 
} 

function posting() 
{ 
var table = ''; 
table += '<table border="0" rules="none" cellpadding="5" style="z-index:+10; position:fixed; top:35%; left:35%; box-shadow: 0px 0px 5px 5px #888888;" rules="none" border="0" bgcolor="#edeff4">'; 
table += '<td align="center">'; 
table += '<img src="images/loading.gif" id="post_status_image">'; 
table += '</td>'; 
table += '<tr >'; 
table += '<td align="center">שולח הודעה, אנא המתן...</td>'; 
table += '</tr>'; 
table += '<tr>'; 
table += '<td align="center" id="post_status"></td>'; 
table += '</tr>'; 
table += '<tr >'; 
table += '<td align="center" ><img id="post_close" src="images/close1.png" onclick="closePop()" style="visibility:hidden;"></td>'; 
table += '</tr>'; 
table += '</table>'; 
document.getElementById('post').innerHTML = table; 
} 

時間設置爲3000毫秒。 我的問題是,我想張貼()函數來顯示屏幕上的表格(它的一種「加載」屏幕),然後暫停腳本。 實際上,由於腳本第一次暫停的原因,只有當它完成後,纔會顯示加載屏幕...怎麼回事?

+0

這不是一個停頓,只需用'setTimeout' – Esailija 2012-03-08 09:42:28

+0

但setTimeout的不會停止我的腳本..我想我的劇本完全停止和等待的時間我已設置 – 2012-03-08 09:44:08

+0

這不會停止您的腳本 - 您的腳本無計時沒有理由計算3秒的日期。由於此腳本正在使用該頁面可用的所有資源,因此不會發生任何事情 - 所有內容都將凍結。 – Esailija 2012-03-08 09:49:11

回答

2

瀏覽器運行JavaScript和渲染都在一個線程。因此,所有三個JS函數都會在頁面更新之前完成。這就是爲什麼你應該從來沒有在基於while循環和檢查時間的JS中實現暫停功能。相反,您需要使用setTimeout(),並將您在傳遞給setTimeout()的回叫中暫停後需要運行的任何代碼。

使用您的示例代碼:

posting(); 
setTimeout(function() { 
    postSent(postUrl, fields); 
}, 3000); 
+0

確定,但postSent功能後我有: 'postSent(postUrl,字段);' '如果(isPostSent)' '{' ' updatePostPicture(真);'' }'' else' ''{' updatePostPicture(假);'' }'' }'' 的document.getElementById( 'post_close')style.visibility =「可見」; ' 我應該在哪裏停下來等待呢? – 2012-03-08 09:51:56

+0

_你想在暫停後運行的所有東西都應該放在你傳遞給'setTimeout()'的函數中(或者你從那裏調用的函數中)。在你的情況下,你也使用'$ .ajax()',所以在Ajax成功回調中放置一些或全部代碼可能更合適(儘管我注意到你似乎沒有成功的回調,只是一個錯誤回調,如果你在確認請求完成後想做某些事情,我覺得有點奇怪)。 – nnnnnn 2012-03-08 09:56:26

+0

好吧,我會試試看。 謝謝! @nnnnnn – 2012-03-08 10:02:28

-1

原生javascript中沒有睡眠或暫停功能。但我們可以這樣做。

function sleep(milliseconds) { 
    var start = new Date().getTime(); 
    for (var i = 0; i < 1e7; i++) { 
    if ((new Date().getTime() - start) > milliseconds){ 
     break; 
    } 
    } 
} 

我創建了小提琴:http://jsfiddle.net/6DQBP/

腳本取自:http://www.phpied.com/sleep-in-javascript/

我發現這個網址我回答後。可能有用。

+0

如果再看看這個問題,您會發現OP的'pause()'函數與'sleep()'函數類似,不同的是,當for循環用完或者指定的毫秒已過,以先到者爲準。您應該在JS中永遠不要這樣編寫代碼,因爲它會鎖定瀏覽器直到暫停結束(如果您試圖讓暫停時間過長,瀏覽器實際上會中斷提示,詢問用戶是否要取消長時間運行的腳本)。您必須重構代碼才能使用'setTimeout()'。 – nnnnnn 2012-03-08 09:51:01

+0

謝謝,是的,我知道它。我不推薦這種技術,你的解決方案比這更好。但我認爲@Asaf Nevo看起來像我張貼。 – arunes 2012-03-08 09:52:42

+0

這是完全一樣的OP 「暫停」 除了糟糕:○ – Esailija 2012-03-08 09:57:26