首先看看这篇关于事件处理的文章(有人知道更好的参考吗?)以获取以下内容:
onclick 属性中提供的代码将在用户单击 span 中包含的文本时被调用。这种机制非常适合小段代码,但是当你有很多脚本时它会变得很麻烦。此事件机制适用于 VBScript 和 JScript。
幕后发生的事情是 Internet Explorer 使用脚本代码调用脚本引擎并告诉引擎创建一个匿名函数(一个没有名称的函数)。那些了解 VBScript 的人可能想知道它是如何做到的,因为 VBScript 不支持匿名函数。VBScript 实际上创建了一个名为“anonymous”的包含脚本的子例程,并返回一个指向函数的指针,该函数随后与事件挂钩。
然后用这个 .hta 做实验:
<html>
<!-- !! http://stackoverflow.com/questions/10741292/vbscript-getref-with-parameter
-->
<head>
<title>GetRef HTA</title>
<HTA:APPLICATION
APPLICATIONNAME="GetRef HTA"
>
<SCRIPT Language="VBScript">
Sub SetClickHandlers()
Set bttB.onClick = GetRef("NoParmsBttB")
Set bttE.onClick = GetRef("Magic")
Set bttF.onClick = GetRef("Magic")
End Sub
' trivial handler, literally set
Sub NoParmsBttA()
Log "NoParmsBttA() called."
End Sub
' trivial handler, set via GetRef
Sub NoParmsBttB()
Log "NoParmsBttB() called."
End Sub
' one handler for many buttons, literally set
Sub handleClickCD(oBtt)
Log "handleClickCD() called; you clicked " & oBtt.id
End Sub
' one handler for many buttons, set via Magic() & GetRef
Sub handleClickEF(oBtt, dtWhen)
Log "handleClickEF() called; you clicked " & oBtt.id & " at " & CStr(dtWhen)
End Sub
' stuffed via GetRef into onClick
Sub Magic()
handleClickEF Me, Now
End Sub
Sub Log(s)
MsgBox s, 0, Now
End Sub
</SCRIPT>
</head>
<body onLoad="SetClickHandlers">
<!-- literal onClick handler in html code -->
<button id="bttA" onClick="NoParmsBttA">A</button>
<!-- no literal onClick handler, will be set by SetClickHandlers via GetRef() -->
<button id="bttB">B</button>
<!-- literal onClick handlers with parameter (Me, i.e. the Button) -->
<button id="bttC" onClick="handleClickCD Me">C</button>
<button id="bttD" onClick="handleClickCD Me">D</button>
<!-- Two params handler via SetClickHandlers & Magic -->
<button id="bttE">E</button>
<button id="bttF">F</button>
</body>
</html>
查看
- 那/你如何可以指定一个没有参数的 Sub 来处理点击字面或通过 GetRef (A 和 B)
- 您可以使用一个参数化的 Sub 来处理对许多按钮的点击,因为引擎将文字代码放入匿名 Sub(没有参数)(C/D)
- 您不能使用 GetRef("SubWithLotsOfParms") 来设置 onClick 属性 - 它需要没有参数的 s Sub
- 你可以让一个没有参数的命名Sub(例如Magic)完成引擎的匿名工作;这个 Sub 然后可以与 GetRef 一起使用
WRT萨尔曼A的回答:
如果您确实需要如下错误消息:
---------------------------
Error
---------------------------
A Runtime Error has occurred.
Do you wish to Debug?
Line: 54
Error: Wrong number of arguments or invalid property assignment: 'mySub'
---------------------------
Yes No
---------------------------
那么你只需要添加:
Sub mySub(parameter)
alert(parameter.toString())
End Sub
和
<!-- literal onClick handler in html code -->
<button id="bttG" onClick="mySub">G</button>
测试.hta。
WRT Peter 的建议 - 保持简单是值得的:
Option Explicit
Sub WithLotsOfParms(a, b, c, d)
WScript.Echo Join(Array(a, b, c, d))
End Sub
Dim f : Set f = GetRef("WithLotsOfParms")
WithLotsOfParms 1, 2, 3, 4
f 1, 2, 3, 4
输出:
cscript 01.vbs
1 2 3 4
1 2 3 4
您使用 GetRef() 设置的变量名称与使用文字 Sub/Function 名称完全一样,昨天可能已经确定。