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

イベント処理に関するこの記事を最初に見て(誰かがより良いリファレンスを知っていますか?)、以下のコンテキストを取得します。

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. 1つのパラメーター化されたSubを使用して、多くのボタンのクリックを処理できます。これは、エンジンがリテラルコードを匿名のSub(パラメーターなし)に配置するためです(C / D)
  3. GetRef( "SubWithLotsOfParms")を使用してonClick属性を設定することはできません。パラメータのないSubが必要です。
  4. パラメータのない名前付きSub(Magicなど)にエンジンの匿名のSubの作業を任せることができます。この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ピーターの提案-それをシンプルに保つことは報われます:

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()で設定された変数の名前を、リテラルのサブ/関数名を使用するのとまったく同じように使用することは、昨日確立された可能性があります。

于 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 に答える
2

アンソニーの解決策は賢く、私は彼の答えに同意します。しかし、私の本当の問題は、簡単にするために例としてのみ選択したclientscriptではなくvbsにあるため、それは私にとっての解決策ではありませんでした。

これが私が参考のためにそれをした方法です。getrefの代わりにexecuteを使用しました。例えば

execute ("call " & routine & "(parameter)")

編集:エッケハルトのコメントの結果として、私は彼のテクニックでそれを試しました、そしてそれはうまくいくので、私の最初の回避策の代わりに私はこの解決策を使うつもりです、ここで私は最初から尋ねるべきでしたが、私はそれが複雑すぎるのではないかと心配しました..代わりに彼に答えます。

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 に答える
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 に答える