SetTimeout() 不会执行函数

SetTimeout() won't execute the function

这是我的代码片段:

'in VBScript

Sub Main()
   Dim timeoutTimer

   'more scripts here
   'more scripts here
   'more scripts here

   timeoutTimer = window.setTimeout("alert()", 2000)

   Call WaitForAnEvent() 'This function waits for an event to happen
                         'if there is no event then code execution stop's
                         'and wait
   'more scripts here
   'more scripts here
   'more scripts here
End Sub 

Sub alert()
   MsgBox "Help!"
End Sub

发生的情况是,有时 alert() 没有被触发,我不知道为什么。我对 setTimeout() 进行了一些研究,他们说如果计时器到期并且一旦有机会执行它,就会触发 setTimeout。我相信在 WaitForAnEvent() 被调用之后会有一个可用的机会来执行 setTimeout 但是 有时是有时不是。

更新 ---------------------------------- ------------------------------------------

我看了很多关于setTimeout的文章,他们都说(简而言之)如果浏览器忙于做某事,它就不会被触发。

现在:

尝试删除函数名称周围的引号:

timeoutTimer = window.setTimeout(alert, 2000)

  • 我认为您应该将函数名称从 alert 更改为不与浏览器公开的元素冲突的名称(有一个 window.alert() 函数)。也许这会按原样工作(未测试),但最好避免混淆

  • 将事件绑定到处理程序的正确语法是检索对函数(此处重命名)的引用

    window.setTimeout(GetRef("showAlert"), 2000)

  • 可能是因为我没有足够的信息,但我看不出需要你的WaitForAnEvent()功能。事件发生。您绑定函数以在事件上执行,并留给浏览器在需要时调用事件处理程序的工作

已编辑 仅供示例(改编自之前的回答)

在此 HTA 中,有五个事件正在处理:开始按钮按下、停止按钮按下、退出按钮按下、时钟间隔和文件存在检查

基本思想是不要一直使用代码 运行。浏览器具有控制权,当事件发生时(按下按钮或达到间隔)调用并结束处理事件的代码。

<html>
<head>
<title>ClockwithAlerts</title>
<HTA:APPLICATION 
    ID="ClockHTA"
    APPLICATIONNAME="ClockHTA"
    MINIMIZEBUTTON="no"
    MAXIMIZEBUTTON="no"
    SINGLEINSTANCE="no"
    SysMenu="no"
    BORDER="thin"
/>

<SCRIPT LANGUAGE="VBScript">

Const TemporaryFolder = 2

Dim timerID, timerFile

Sub Window_onLoad
    window.resizeTo 600,280
    SetClockTimer True 
    timerFile = window.setInterval(GetRef("CheckFilePresence"), 1500)
End Sub

Sub CheckFilePresence
    Dim myFile
    With CreateObject("Scripting.FileSystemObject")
        myFile = .BuildPath(.GetSpecialFolder( TemporaryFolder ), "test.txt")
        If .FileExists(myFile) Then 
            fileStatus.innerText = "FILE ["& myFile &"] FOUND"
        Else
            fileStatus.innerText = "File ["& myFile &"] is not present"
        End If
    End With
End Sub 

Sub SetClockTimer( Enabled )
    If Enabled Then 
        timerID = window.setInterval(GetRef("RefreshTime"), 1000)
        RefreshTime
    Else 
        window.clearInterval(timerID)
        timerID = Empty 
    End If
    StartButton.disabled = Enabled
    StopButton.disabled = Not Enabled
End Sub

Sub RefreshTime
    CurrentTime.InnerHTML = FormatDateTime(Now, vbLongTime)
End Sub

Sub ExitProgram
    If Not IsEmpty(timerID) Then window.clearInterval(timerID)
    If Not IsEmpty(timerFile) Then window.clearInterval(timerFile)
    window.close()
End Sub

</SCRIPT>

</head>

<body>
    <input id="checkButton" type="button" value="EXIT" name="run_button" onClick="ExitProgram" align="right">
<br><br>
    <span id="CurrentTime"></span>
<br><br>
    <input id="Stopbutton"  type="button" value="Stop"  name="StopButton"  onclick="SetClockTimer(False)">
    <input id="StartButton" type="button" value="Start" name="StartButton" onclick="SetClockTimer(True)">
    <hr>
    <span id="fileStatus"></span>
</body>
</html>