VBScript InnerHtml - 过早点火

时间:2016-08-30 07:46:37

标签: dom vbscript innerhtml

所以当运行一些代码时,按照:

document.getElementById("getForge").style.display = "inline" ' this is hidden by default, show it.
DoStuffHere()
document.getElementById("getForge").style.display = "none" ' hide it again after DoStuffHere().

所以我可以显示一个弹出窗口然后在函数完成后再次隐藏它,代码似乎在函数完成其工作(下载)之前在DOM中执行。

我认为VBScript会逐行执行,直到它达到最后的样式更改,事实证明并非如此,有什么方法可以解决这个问题吗?

我要做的就是让一个div显示,直到过程完成然后再次隐藏它。

2 个答案:

答案 0 :(得分:0)

不,它不会太早开火。是的,您对VBScript执行的看法是正确的。但是脚本执行和元素呈现不是并发进程。代码仍在运行时,不会更新对DOM的任何更改。您需要结束代码执行,将控制权返回给浏览器进行更新,然后继续执行代码。

因此,在您的代码中,display属性更改为inline但未呈现(代码仍在运行),调用该函数,然后还原对display属性的更改。

你可以用类似的东西来解决它(仅来自内存,未经测试)

Function DoStuffHandler
    Dim popup
    Set popup = document.getElementById("getForge")

    If popup.style.display = "inline" Then 
        Call DoStuffHere()
        popup.style.display = "none"
    Else
        popup.style.display = "inline"
        Call setTimeout( GetRef("DoStuffHandler"), 50 )
    End If 

End Function    

使用弹出窗口的display属性作为开关的代码将:

  • 如果弹出窗口可见,则执行main函数,完成后更改显示,然后让浏览器更新DOM
  • 如果弹出窗口不可见,则更改显示属性,准备对此功能的回调,并让浏览器更新DOM。 50毫秒后,浏览器将调用指定的函数。

答案 1 :(得分:0)

以下代码是MC ND解决此问题的方法,我只是简单地改变了一些变量和名称。

setTimeout函数确实有一个括号问题,但在下面的代码中已得到纠正。

Function DoAlert
    Dim alert
    Set alert = document.getElementById("divForge")

    If alert.style.display = "inline" Then 
        Call GetForge()
        alert.style.display = "none"
    Else
        alert.style.display = "inline"
        setTimeout GetRef("DoAlert"), 50
    End If 

End Function    

非常感谢您对MC ND的帮助,非常有用。