2014-12-09 93 views
0

我希望這個HTA代碼打印a稍後將由b替換。但是,它所做的是在一段時間內不打印任何東西,然後b。 啓用MsgBox行後,它首先打印aInnerHTML何時立即執行?

看來statusinfo.InnerHTML = "a"的執行被推遲。任何機構能告訴我爲什麼這是?我將如何獲得所需的行爲(立即刷新)?

<SCRIPT LANGUAGE=VBScript> 
    Sub doThis() 
     statusinfo.InnerHTML = "a" 
     'MsgBox "stop" 
     intensiveOperation 
     statusinfo.InnerHTML = "b" 
    End Sub 

    Sub intensiveOperation() 
     'takes long 
    End Sub 
</SCRIPT> 

<BODY> 
    <button onclick="doThis">Run</button> 
    <div id="statusinfo">&nbsp;</div> 
</BODY> 
</HTML> 
+0

當您將兩個不同的值順序分配給任何變量時,只有最後一個值纔是操作後的實際值。該腳本首先運行,然後重新渲染頁面。如果你想在頁面上看到'a'和'b',你必須使用['setTimeout'](http://msdn.microsoft.com/en-us/library/ie/ms536753%28v=vs。 85%29.aspx)方法來延遲'intensiveOperation',因此,'a'在執行新腳本之前呈現。 – Teemu 2014-12-09 16:11:56

+0

那麼我的代碼如何被修改以獲得所需的結果呢?我試着使用'retval = window.setTimeout(「intensiveOperation」,2000,「VBScript」)來包裝這個密集操作,但它唯一做的就是現在'b'立即顯示出來,而不是一段時間之後。與2000年相同,而不是10.'a'永遠不會顯示。 – mgr326639 2014-12-09 19:40:49

回答

0

腳本和渲染是在單個線程中執行的。這意味着,doThis將在渲染開始前完成。與此同時,您已將內部HTML設置爲'b',這將是您將看到的唯一結果。

爲了解決這個問題,你已經完成了第一分,並調用intensiveOperation有一個短暫的延遲,並作出最終的HTML更新在第二次結束,像這樣:

Sub doThis 
    statusinfo.InnerHTML = "a" 
    Call window.setTimeout(GetRef("intensiveOperation"), 4) 
End Sub 

Sub intensiveOperation() 
    'takes long 
    statusinfo.InnerHTML = "b" 
End Sub 

整理doThis將釋放線程。注意,setTimeout不會暫停執行,整個子程序執行到最後。該瀏覽器可以呈現該頁面之後。

intensiveOperation在渲染完成後的某個時間點被調用,而不是早於給定延遲,但可能晚得多,這取決於CPU當時正在執行的任務。

問題標題中問題的答案基本上是:從不。

+0

你的代碼確實證明了我要求的行爲。儘管如此,我也想了解它。我仍然不明白爲什麼把'invisibleInventHTML =「b」'放在intensiveOperation()中顯然與將它放在doThis()的底部不同。你的定義是什麼「腳本」?一個Sub?所以在你的代碼中有兩個線程正在運行?爲什麼? – mgr326639 2014-12-14 19:43:42

+0

「腳本」是「Sub」,是的。只有一個線程。 'doThis'在調用時執行到最後,這就是爲什麼'b'需要移出子區域的原因。 'setTimeout'只是延遲'intensiveOperation'的執行,它不會暫停該子操作,直到執行'intensiveOperation'。 'doThis'中的'setTimeout'行之後的任何內容都會在'intensiveOperation'之前執行。 'setTimeout'只是延遲了它的fn參數的執行,並且延遲保證只有至少4毫秒,可能更多,這取決於CPU使用情況等。 – Teemu 2014-12-14 19:50:30