2012-05-24 44 views
3

有沒有人將參數傳遞給用getref調用的函數? 下面的代碼只是一個例子,doens't工作,如何將參數傳遞給mySub子?vbscript:帶參數的getref

<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

你爲什麼使用VBScript進行客戶端腳本?您定位了哪些瀏覽器? –

+0

純粹的IE瀏覽器,順便說一句,它是純粹的VBScript目的(.vbs),我只是把這個例子在客戶端browseerscript,以清楚我想要什麼。我知道對IE和Vbscript的偏見作爲語言,但在唯一的IE公司ActiveX是一個祝福,JavaScript是好的。但是在一個安全的環境中這麼該死的有限。我使用了大量的js進行web開發,其餘的我想切換到Ruby,但我的同事必須遵循當然 – peter

回答

2

首先看at this article about event handling(有人知道一個更好的參考?)以獲取上下文:

在onclick屬性提供的代碼將被調用時,該文本 用戶點擊包含在跨度。對於小代碼片段,這種機制非常好,但是如果您有大量腳本,則會變得非常麻煩。該事件機制可以與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. 說/你怎麼可以指定不PARAMS一個子字面上或通過GetRef(A RESP處理點擊。 B)
  2. 您可以使用一個參數化Sub來處理對許多按鈕的點擊,因爲引擎會將文字代碼放入匿名Sub(不帶參數)(C/D)
  3. 你不能使用GetRef(「SubWithLotsOfParms」)來設置onClick屬性 - 它需要s Sub沒有參數
  4. 你可以讓一個沒有參數的命名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 

and

<!-- 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(設置變量的名稱),完全按照你使用文字子/功能名稱可能昨天已經建立。

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攜帶需要作爲附加屬性的任何參數的元素。

+0

+1的創造性和可用的方式繞過參數傳遞問題。 –

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 
+0

-1對於一個錯綜複雜的提議完全錯過了GetREf()/'函數指針'的點。 –

+0

@Ekkehard,你是對的,但這是一個解決方法,感謝這個完美適合的解決方案,並不樂意使用某種邪惡評估的執行。我給你的答案,而不是 – peter

+0

我收回downvote,因爲現在你的答案很好地顯示了GetRef()的用法。 –

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參考。