是否有人将参数传递给使用getref调用的函数? 以下代码只是一个例子,不起作用,如何将参数传递给mySub子?
<button id="myBtn">Click me</button>
<script type="text/vbscript">
document.getElementById("myBtn").onclick=GetRef("mySub")
Sub mySub(parameter)
alert(parameter)
End Sub
</script>
答案 0 :(得分:2)
首先看一下at this article about event handling(任何人都知道一个更好的参考?)来获取上下文:
onclick属性中提供的代码将在调用时调用 用户单击跨度中包含的文本。这个机制很棒 对于小代码片段,但是当你有一个代码时会变得很麻烦 很多剧本。此事件机制适用于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>
看
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彼得的提议 - 保持简单是值得的:
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()设置的变量名称与您使用文字子/函数名称完全一样,可能已于昨天建立。
答案 1 :(得分:2)
以下是我将如何实现这一目标:
Dim elem: Set elem = document.getElementById("myBtn")
elem.setAttribute "parameter", "somevalue"
Set elem.onclick = GetRef("elem_onclick")
Function elem_onclick()
MsgBox Me.getAttribute("parameter")
End Function
使用分配onclick的元素来携带作为附加属性所需的任何参数。
答案 2 :(得分:1)
安东尼的解决方案很聪明,我可以获得他的回答。 然而,由于我的真正问题是位于vbs而不是客户端,我只是为了简单而选择了它,这对我来说不是解决方案。
以下是我如何参考。我使用execute而不是getref。例如
execute ("call " & routine & "(parameter)")
编辑:由于Ekkehard的评论,我尝试了他的技术并且它有效,所以不是我的第一个解决方法,我将使用这个解决方案,这里我应该从第一次问,但我害怕它太复杂了..
我改为给他答案。
sub one(para)
WScript.Echo para & " from one"
end sub
sub two(para)
WScript.Echo para & " from two"
end sub
sub main(subname, para)
Dim f : Set f = GetRef(subname)
f para
end sub
main "one", "test" '=>test from one
答案 3 :(得分:1)
更进一步......
Dim iGetSub 'Static'
Function GetSub(sSub) 'GetRef wrapper that supports object methods and arguments
iGetSub = iGetSub + 1
ExecuteGlobal "Sub GetSub" & iGetSub & ": " & sSub & ": End Sub"
Set GetSub = GetRef("GetSub" & iGetSub)
End Function
因此:
.onClick = GetSub("MySub(""Hello World"")")
或者:
.onClick = GetSub("MsgBox(""Hello World"")")
甚至:
.onClick = GetSub("MyObject.MyMethod(""Hello World"")")
唯一的限制是您无法使用我参考。