4

有没有人将参数传递给用 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>
4

4 回答 4

2

安东尼的解决方案很聪明,我接受他的回答。但是,由于我的真正问题位于 vbs 而不是客户端脚本中,为了简单起见,我仅选择它作为示例,因此它不是我的解决方案。

以下是我的做法以供参考。我使用了执行而不是 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
于 2012-05-25T08:45:59.470 回答
2

首先看看这篇关于事件处理的文章(有人知道更好的参考吗?)以获取以下内容:

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>

查看

  1. 那/你如何可以指定一个没有参数的 Sub 来处理点击字面或通过 GetRef (A 和 B)
  2. 您可以使用一个参数化的 Sub 来处理对许多按钮的点击,因为引擎将文字代码放入匿名 Sub(没有参数)(C/D)
  3. 您不能使用 GetRef("SubWithLotsOfParms") 来设置 onClick 属性 - 它需要没有参数的 s Sub
  4. 你可以让一个没有参数的命名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 名称完全一样,昨天可能已经确定。

于 2012-05-24T19:17:36.363 回答
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 的元素来携带作为附加属性所需的任何参数。

于 2012-05-24T21:21:28.083 回答
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"")")

唯一的限制是您不能使用Me引用。

于 2012-09-26T17:32:22.883 回答