时间:2021-05-22
问:
您好,脚本专家!如何在HTA中暂停脚本?
--TJ
答:
您好,TJ。您知道,从古至今,人们已经花费了巨大的时间和精力来探索生命的意义。脚本专家却从未参与其中。为什么?好吧,先不说懒,我们知道那无关紧要:就算您的确找到了生命的意义,也没人在乎它。没人想知道我们存在的理由;相反,他们-同您一样-只想知道到底如何才能暂停一个嵌入在HTML应用程序(HTA)中的脚本。那才是脚本专家为之献身的事业。
现在,如果您不熟悉HTA,您首先想到的可能是“使用Wscript.Sleep即可”。(顺便说一句,如果您不熟悉HTA,可以浏览HTADevelopersCenter(英文)。)这是个好主意,但却无法实现。为什么?因为Wscript对象是个稍微有些独特的对象;原因之一是您实际上并不能创建此对象的实例。而只要您运行在WindowsScriptHost之下,Wscript即会自动为您提供。问题就在这里:当您在HTA内部运行代码时,您并没有运行在WindowsScriptHost之下。您其实是运行在InternetExplorer所提供的脚本宿主之下。因为您没有运行在WindowsScriptHost之下,因此您无法自动访问Wscript对象,而且因为您无法创建自己的Wscript对象,也就无法访问Wscript.Sleep。用高科技术语来讲,就是“瘫痪”了。
如果InternetExplorer提供类似于Wscript.Sleep的方法,则这也不是什么大不了的问题;很不幸,它没有提供。那么是否有某种神奇的解决方法,我们可以使用它来代替Sleep方法呢?这有必要问吗?
[Ctrl+A 全选 注:引入外部Js需再刷新一下页面才能执行]
我们的HTA非常简单:它只由一个按钮组成,单击时会运行名为Test的子例程。很了不起,对不对?好吧,我们先看看HTA的<SCRIPT>部分,然后再确定它是不是真的很了不起。
我们在<SCRIPT>部分所做的第一件事就是声明一个名为dtmStartTime的全局变量:
DimdtmStartTime
这其实对于暂停脚本没有任何作用;我们只是利用此变量帮助我们查看脚本是否的确象所期待的那样暂停。如果您现在还没有明白其含义,别急:很快就会清楚。
接下来是Test子例程,在我们单击按钮时调用它:
SubTest
dtmStartTime=Now
idTimer=window.setTimeout("PausedSection",5000,"VBScript")
EndSub
请注意,此子例程中仅有两行代码。在第一行中,我们只是将当前的时间和日期(使用Now函数)赋予变量dtmStartTime。接下来是下面这行代码:
idTimer=window.setTimeout("PausedSection",5000,"VBScript")
无论您相信与否,这就是我们实现Sleep方法函数的方式。我们使用setTimeout方法创建了一个定时器,其ID为idTimer。正如您所看到的,我们将三个参数传递给setTimeout:
?PausedSection。此参数为定时器到时后我们要运行的子例程的名称。
?5000。此参数为在调用PausedSection之前我们希望定时器等待的时间(以毫秒计;5000毫秒等于5秒)。换句话说,这就是我们需要的暂停。如果需要将脚本暂停30秒,则可将此参数设置为30000。
?VBScript。此参数是必需的,它只是告诉脚本PausedSection是用VBScript编写的。
即,我们单击按钮时,Test子例程将运行。Test子例程运行时,它将创建名为idTimer的定时器。idTimer的唯一功能就是等待5秒然后调用子例程PausedSection。明白了吗?好的。
那么子例程PausedSection执行什么操作?显然,我们可以运行任何希望的代码;简单起见,在此我们仅做两件事情。首先,显示一个消息框,它显示我们单击此按钮的时间及消息框自身实际显示在屏幕上的时间:
MsgboxdtmStartTime&vbCrLf&Now
若允许舍入误差,这两个时间的间隔应为5秒。这重要吗?当然重要。请记住,在PausedSection子例程内部首先发生的就是显示此消息框。如果此消息框在我们单击按钮5秒之后显示,则表明我们的脚本暂停了5秒。您可能会记起,这就是我们的最终目的。
我们在PausedSection子例程中要做的另外一件事情就是调用clearTimeout方法来有效地清除定时器:
window.clearTimeout(idTimer)
为什么这样做?原因很简单:定时器是设计为永远运行的。如果不清除定时器,每5秒钟idTimer就将调用PausedSection子例程一次,因此每5秒钟我们的这个小消息框就会在屏幕上弹出一次。我们真的不希望每5秒钟就看到这样的消息框,因此使用clearTimeout删除定时器。
我们承认,这确实不如使用Wscript.Sleep5000那么简单;这表明在您启用和禁用定时器之前可能不得不稍稍掂量一番。因此,这或许带点挑战,但是,别忘了,这不也是生命的全部意义所在吗?
不,这不是一个反问句。正如我们所说,我们一直致力于暂停HTA;除此之外,我们就不知道生命到底是什么了。
声明:本页内容来源网络,仅供用户参考;我单位不保证亦不表示资料全面及准确无误,也不保证亦不表示这些资料为最新信息,如因任何原因,本网内容或者用户因倚赖本网内容造成任何损失或损害,我单位将不会负任何法律责任。如涉及版权问题,请提交至online#300.cn邮箱联系删除。
问:您好,脚本专家!在您的HTA示例中,您为我们展示了如何单击一个按钮使一个子例程得以运行。那么,如何向一个按钮的onClick参数添加两个或多个子例程呢?--
问:您好,脚本专家!如何确定在HTA中选择了哪些文本?--DO答:您好,DO。您知道,大多数人认为每天编写“您好,脚本专家!”专栏是世界上最吸引人、最令人兴奋的
一是利用hta去掉htm的控件验证hta1的代码如下:SampleHTMLApplicationoneactivexcontrol.htm代码如下:DimFil
本文讲解了JScript中变量的定义与使用方法。1、变量的定义变量在脚本中的第一次出现是在声明中。变量在第一次用到时就设置于内存中,便于后来在脚本中引用。使用变
在Python3中已经有很大一部分语句与Python2不互通了,运行暂停的方法也有所不同。1、input();这种方法不用包含模块,因此这也是最常用的一种暂停手