vbscript:带参数的getref

时间:2012-05-24 16:12:40

标签: asp-classic vbscript

是否有人将参数传递给使用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 个答案:

答案 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>

  1. 如何/如何指定没有参数的Sub来按字面意思或通过GetRef处理点击(A或B)
  2. 你可以使用一个参数化的Sub来处理许多按钮的点击,因为引擎会将文字代码放入一个匿名的Sub(没有参数)(C / D)
  3. 你不能使用GetRef(“SubWithLotsOfParms”)来设置onClick属性 - 它需要s Sub而没有参数
  4. 你可以让一个没有参数的名字Sub(例如Magic)做引擎匿名的工作;此Sub可以与GetRef
  5. 一起使用

    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"")")

唯一的限制是您无法使用参考。