首先查看at this article about event handling(有人知道更好的参考吗?)以获取以下内容:
onclick 属性中提供的代码将在
用户单击包含在跨度中的文本。这个机制很棒
对于小的sn-ps代码,但是当你有一个
很多脚本。此事件机制适用于 VBScript 和
JScript。
幕后发生的事情是 Internet Explorer 调用
脚本引擎与脚本代码并告诉引擎创建
一个匿名函数(一个没有名字的函数)。认识的你们
VBScript 可能想知道它是如何做到的,因为 VBScript
不支持匿名函数。 VBScript 实际上创建了一个
包含脚本的名为“匿名”的子例程并返回一个
指向随后连接到事件的函数的指针。
然后用这个 .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 属性 - 它需要没有参数的 Sub
- 您可以让不带参数的命名 Sub(例如 Magic)完成引擎的匿名工作;然后这个 Sub 可以与 GetRef 一起使用
WRT Salman 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 名称完全一样,这可能是昨天建立的。