2012-05-24 2 views
3

getref라는 함수에 매개 변수를 전달한 경험이 있습니까? 다음 코드는 단지 예제 일뿐입니다. 매개 변수를 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, btw 그것은 순수한 vbscript 목적 (.vbs)입니다, 나는 단지 내가 원하는 것을 명확하게하기 위해 clientside browseerscript에서이 예제를 취했습니다. 나는 IE와 Vbscript에 대한 편견을 언어로 알고 있지만, IE 회사의 ActiveX는 축복이다. javascript는 괜찮습니다. 하지만 안전한 환경에서 그렇게 제한되어 있습니다. 나는 webdevelopment를 위해 js를 많이 사용하고 나머지는 Ruby로 전환하고 싶지만 동료는 물론 파라미터 전달 문제를 우회하는 창조적이고 유용한 방법으로 – peter

답변

2

먼저 살펴 at this article about event handling (사람이 더 나은 참조를 아는 사람?)에 대한 컨텍스트 얻을 : 텍스트에 사용자가 클릭 묶인 때

온 클릭 속성에서 제공하는 코드가 호출됩니다 범위. 이 메커니즘은 작은 코드 스 니펫의 경우 이 우수하지만 많은 스크립트가있을 때 번거로워집니다. 이 이벤트 메커니즘은 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> 

는 말 그대로 또는 GetRef (A RESP를 통해 클릭을 처리하기 위해 매개 변수없이와 하위를 지정할 수 있습니다 어떻게/

  1. 볼 수 있습니다. B)
  2. 엔진이 리터럴 코드를 익명 Sub (매개 변수 없음) (C/D)
  3. 에 넣기 때문에 하나의 매개 변수가있는 Sub를 사용하여 많은 버튼 클릭을 처리 할 수 ​​있습니다.
  4. GetRef ("SubWithLotsOfParms")를 사용하여 onClick 속성을 설정할 수 없습니다. 매개 변수가없는 Sub가 필요합니다.
  5. 매개 변수없이 이름이 지정된 Sub를 사용할 수 있습니다. Magic)은 익명의 엔진 작업을 수행합니다. 당신이 정말로 오류 메시지가 필요한 경우처럼

    : 다음 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.

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 

출력

:

당신이 GetRef (설정 변수의 이름을 사용하는 것이
cscript 01.vbs 
1 2 3 4 
1 2 3 4 

) 당신이 문자를 사용 그대로 -

은 는

WRT 피터의 제안은 간단하게 지급합니다 하위/함수 이름이 어제에 설정되었을 수 있습니다. 여기

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 

가 온 클릭이 추가 속성으로 필요한 매개 변수를 수행하기 위해 할당되고있는 요소를 사용합니다.

+0

+1을 따라야합니다. –

1

앤서니의 해결책은 영리하고 나는 그의 대답에 동의한다. 그러나 내 진짜 문제는 단순한 예제로 선택한 클라이언트 스크립트보다는 vbs에 위치했기 때문에 나를위한 해결책이 아니 었습니다.

다음은 내가 참조한 것입니다. 나는 getref 대신에 execute를 사용했다. 예를 들어

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, 맞습니다.하지만 해결 방법이었습니다.이 완벽하게 맞는 솔루션 덕분에 처음에는 사악한 평가의 일종 인 execute를 사용하여 행복하지 않았습니다. 나는 당신에게 대답을 대신 준다. – peter

+0

이제 답은 GetRef()의 사용법을 멋지게 보여주기 때문에 나는 downvote를 되 찾는다. –

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 참조를 사용할 수 없다는 것입니다.