VBScript InnerHtml - 触发太早

VBScript InnerHtml - Firing too early

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

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 显示直到过程完成,然后再次隐藏它。

不,不是开得太早了。是的,您对 VBScript 执行的看法是正确的。但是脚本执行和元素渲染不是并发过程。当代码仍然是 运行 时,对 DOM 的任何更改都不会更新。您需要结束代码执行,return控制浏览器进行更新,然后继续执行代码。

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

你可以用类似的方法解决它(仅凭记忆,未经测试)

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 属性 作为开关的代码将:

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

下面的代码是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的帮助,非常有帮助。