2012-05-13 64 views
0

我有一個簡單的函數,什麼也不做:價值觀輸入型等待功能後沒有顯示

function doNothing(){}

我也有一個功能,看起來像這樣:

function getJson() { 
    var JSONObject = { 
     "name": "John Johnson", 
     "street": "Oslo West 555", 
     "age": 33, 
     "phone": "5551234var stuff = <%= @var %>;567" 
    }; 
    document.getElementById("name").value = JSONObject.name; 
    setTimeout(doNothing(), 1000); 
    document.getElementById("street").value = JSONObject.street; 

所以doNothing()函數實際上只在這裏,所以我可以在setTimeout函數中加入一個參數。

整個JavaScript代碼的重點是,我希望立即顯示第一個值,在1秒(1000毫秒)後顯示第二個值,但它永遠不會顯示出來。

有人可以告訴我我什麼是錯誤的嗎? Thnx!

+0

'的setTimeout(doNothing(),1000);' - 錯了錯了錯了...這應該是'的setTimeout(doNothing,1000);'代替。 –

回答

2

settimeout不是一個睡眠函數,它將採用一個函數並在1000毫秒後調用它。您的其他代碼仍然會立即執行。

嘗試:

document.getElementById("name").value = JSONObject.name; 

setTimeout(function(){ 
    document.getElementById("street").value = JSONObject.street; 
}, 1000); 
+0

非常感謝,這使得更有意義。只有一件事,爲什麼不工作: setTimeout( document.getElementById(「street」)。value = JSONObject.street; ,1000); – Zippie

+0

@Zippie - 你必須把腳本放在一個函數中,否則它會在放入'setTimeout'之前進行評估。 –

+0

@ Zippie當你將一個字符串傳遞給'setTimeout'時(就像在無用的教程中所做的那樣),字符串中的代碼在不知道'JSONObject.street'是什麼的新上下文中運行 – Esailija

1

您不能延遲同步執行; JavaScript沒有類似sleep的功能,請不要考慮使用循環和Date對象來模擬它,因爲這會掛起整個瀏覽器,直到延遲循環結束。

爲了解決您的問題,只需將應該延遲的代碼放入setTimeout回調函數中即可。由於它將是一個閉包,你可以輕鬆訪問前一個作用域中存在的任何變量。

document.getElementById("name").value = JSONObject.name; 
setTimeout(function() { 
    document.getElementById("street").value = JSONObject.street; 
}, 1000); 

順便說一句,到1000毫秒後執行功能doNothing,你會傳遞到doNothingsetTimeout - 通過doNothing()當你通過該功能通常是不是你想要的返回值。

+0

非常感謝:) – Zippie