JavaScript的setTimeout()超时事件的计时开始时刻是在从上到下解析完<body>下面的JavaScript代码后开始的

本文介绍了DOMContentLoaded事件在现代浏览器中的支持情况,它总是在load事件之前触发。对于不支持此事件的老版本浏览器,推荐使用0毫秒超时调用来模拟。超时调用确保在页面下载和构建完成后执行,但不能保证先于load事件。

《JavaScript高级程序设计》(第三版)

DOMContentLoaded 事件对象不会提供任何额外的信息(其 target 属性是 document)。
IE9+FirefoxChromeSafari 3.1+Opera 9+都支持 DOMContentLoaded 事件,通常这个事件
既可以添加事件处理程序,也可以执行其他 DOM 操作。这个事件始终都会在 load 事件之前触发。
对于不支持 DOMContentLoaded 的浏览器,我们建议在页面加载期间设置一个时间为 0 毫秒的超
时调用,如下面的例子所示。
setTimeout(function(){
//在此添加事件处理程序
}, 0);
这段代码的实际意思就是:“在当前 JavaScript 处理完成后立即运行这个函数。”在页面下载和构建
期间,只有一个 JavaScript 处理过程,因此超时调用会在该过程结束时立即触发。至于这个时间与
DOMContentLoaded 被触发的时间能否同步,主要还是取决于用户使用的浏览器和页面中的其他代码。
为了确保这个方法有效,必须将其作为页面中的第一个超时调用;即便如此,也还是无法保证在所有环
境中该超时调用一定会早于 load 事件被触发。
 
总结:
超时调用不是从解析到setTimeout()函数体后就开始计时,而是在"页面下载和构建完成",也即解析完<body>标签下面的JavaScript后才开始计时
<HTML> <HEAD> <TITLE>智能倒计时器</TITLE> <HTA:APPLICATION ID="objHTA" SCROLL="no" SINGLEINSTANCE="yes" CONTEXT="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" WINDOWSTATE="normal"> <SCRIPT language="VBScript"> Sub SetTopMost() Dim objShell On Error Resume Next Set objShell = CreateObject("Shell.Application") If Err.Number <> 0 Then WScript.Echo "无法创建 Shell.Application 对象" WScript.Quit End If Dim window, count count = 0 For Each window In objShell.Windows ' 过滤非浏览器窗口(示例) If InStr(window.LocationURL, "http") > 0 Then count = count + 1 WScript.Echo "窗口标题: " & window.Name End If Next WScript.Echo "共找到 " & count & " 个浏览器窗口" Set objShell = Nothing If hwnd = 0 Then MsgBox "未找到HTA窗口", 16, "错误" Exit Sub End If End Sub ' 调用示例:点击按钮触发置顶 Sub btnSetTop_Click() SetTopMost End Sub Dim targetTime, isRunning Function ParseTime(input) If IsNumeric(input) Then ParseTime = DateAdd("s", CLng(input)*60, Now()) ' 使用CLng增强数值转换 Else MsgBox "请输入有效数字", 48, "错误" ParseTime = Null End If End Function Sub UpdateDisplay() Dim elapsed elapsed = DateDiff("s", Now(), targetTime) If isRunning then If elapsed < 0 Then display.innerHTML = FormatTime(Abs(elapsed)) & "(超时)" display.style.color = "red" Else display.innerHTML = FormatTime(elapsed) display.style.color = "green" End If End If If isRunning Then window.setTimeout "UpdateDisplay", 200 End Sub Function FormatTime(seconds) Dim h, m, s h = seconds \ 3600 m = (seconds Mod 3600) \ 60 s = seconds Mod 60 FormatTime = Right("0" & h,2) & ":" & Right("0" & m,2) & ":" & Right("0" & s,2) End Function Sub StartTimer() If Not isRunning Then targetTime = ParseTime(setTime.value) ' 移除Set关键字 If Not IsNull(targetTime) Then isRunning = True UpdateDisplay End If End If End Sub Sub StopTimer() isRunning = False display.innerHTML = "00:00:00" display.style.color = "black" End Sub </SCRIPT> </HEAD> <style> #display { font-size: 20px; margin: 5px; padding: 5px; border: 2px solid #ccc; } </style> <BODY> <button onclick="btnSetTop_Click">窗口置顶</button> <input type="text" id="setTime" size="4"> 分钟 <button onclick="StartTimer">启动</button> <button onclick="StopTimer">停止</button> <div id="display" style="font-family:Consolas"></div> </BODY> </HTML>窗口无法置顶,找不到窗口句柄
11-25
<HTML> <HEAD> <TITLE>智能倒计时器</TITLE> <HTA:APPLICATION ID="objHTA" SCROLL="no" SINGLEINSTANCE="yes" WINDOWSTATE="normal"> <SCRIPT language="VBScript"> Sub SetTopMost() On Error Resume Next Dim objShell Set objShell = CreateObject("WScript.Shell") hwnd = window.external.HWND ' 关键修正点 If hwnd = 0 Then MsgBox "无法获取窗口句柄", 16, "错误" Exit Sub End If Const SWP_NOMOVE = &H2, SWP_NOSIZE = &H1 objShell.Run "mshta vbscript:Execute(""CreateObject('Shell.Application').WindowSwitcher().SetWindowPos "" & " & hwnd & ", -1, 0, 0, 0, 0, " & (SWP_NOMOVE Or SWP_NOSIZE) & ")", 0, True End Sub ' 调用示例:点击按钮触发置顶 Sub btnSetTop_Click() SetTopMost End Sub Dim targetTime, isRunning Function ParseTime(input) If IsNumeric(input) Then ParseTime = DateAdd("s", CLng(input)*60, Now()) ' 使用CLng增强数值转换 Else MsgBox "请输入有效数字", 48, "错误" ParseTime = Null End If End Function Sub UpdateDisplay() Dim elapsed elapsed = DateDiff("s", Now(), targetTime) If isRunning then If elapsed < 0 Then display.innerHTML = FormatTime(Abs(elapsed)) & "(超时)" display.style.color = "red" Else display.innerHTML = FormatTime(elapsed) display.style.color = "green" End If End If If isRunning Then window.setTimeout "UpdateDisplay", 200 End Sub Function FormatTime(seconds) Dim h, m, s h = seconds \ 3600 m = (seconds Mod 3600) \ 60 s = seconds Mod 60 FormatTime = Right("0" & h,2) & ":" & Right("0" & m,2) & ":" & Right("0" & s,2) End Function Sub StartTimer() If Not isRunning Then targetTime = ParseTime(setTime.value) ' 移除Set关键字 If Not IsNull(targetTime) Then isRunning = True UpdateDisplay End If End If End Sub Sub StopTimer() isRunning = False display.innerHTML = "00:00:00" display.style.color = "black" End Sub </SCRIPT> </HEAD> <style> #display { font-size: 20px; margin: 5px; padding: 5px; border: 2px solid #ccc; } </style> <BODY> <button onclick="btnSetTop_Click">窗口置顶</button> <input type="text" id="setTime" size="4"> 分钟 <button onclick="StartTimer">启动</button> <button onclick="StopTimer">停止</button> <div id="display" style="font-family:Consolas"></div> </BODY> </HTML>无法找到置顶窗口句柄
05-11
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值