【问题标题】:catching an event in VBScript在 VBScript 中捕获事件
【发布时间】:2011-01-29 13:43:03
【问题描述】:

伙计们。这是一个 VBS 脚本,可以打开 google,填写表格,然后单击搜索按钮。

set ie = CreateObject("InternetExplorer.Application")

ie.navigate("www.google.com")

ie.visible = true

while ie.readystate <> 4
    wscript.sleep 100
WEnd

set fields = ie.document.getelementsbyname("q")
set buttons = ie.document.getelementsbyname("btnG")

fields(0).value = "some query"
buttons(0).click

ie.quit

Sub OnClickSub()
    MsgBox  "button clicked!", 0
End Sub

显然,buttons(0).click 会触发按钮的 onclick 事件,我需要在脚本中捕获该事件,并为其提供一些处理,例如启动 OnClickSub()

有没有人知道该怎么做?

【问题讨论】:

  • 我不相信可以将 VBS 函数/子附加到网页中按钮的单击事件,我相信您能做的最好的事情就是调用附加到单击的任何内容那个按钮。

标签: dom scripting vbscript


【解决方案1】:

这是捕捉 Excel 中发生的事件的一种非常简单的方法。 Excel 必须打开才能正常工作。将其复制并粘贴到新的 VBScript 中,然后运行它。然后进入 Excel,并更改单元格的值。将弹出一个消息框,显示您更改了哪个单元格。

'/////////////////////////////////////////////////Event Constant Definitions/////////////////////////////////////////////////////
    EVENT_CELL_CHANGE = 1   '//////////////////////////////////////////////////////////////////////
    EVENT_SELECTED_CELL_CHANGE = 2 '/////////////////////////////////////////////////////
    EVENT_SELECTED_SHEET_CHANGE = 3 '///////////////////////////////////////////////////
    EVENT_SELECTED_WORKBOOK_CHANGE = 4 '///////////////////////////////////////
'/////////////////////////////////////////////////Event Constant Definitions/////////////////////////////////////////////////////
'_______________________________________________________________________
'/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
'////////////////////////////////////////////////////Global Program/////////////////////////////////////////////////////////////////
'/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
set O = getObject( , "Excel.Application")
Call WaitUntil_Event(EVENT_CELL_CHANGE, O.Selection, RtnVar, "BLANK")
msgbox RtnVar.address

'/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
'////////////////////////////////////////////End of Global Program//////////////////////////////////////////////////////////////
'/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
'_______________________________________________________________________
'/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
'///////////////////////////////////////////Start of Main Sub Program/////////////////////////////////////////////////////////
'/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
'///////////////////////////////////////////This program was written by///////////////////////////////////////////////////////
'///////////////////////////////////////////Ben Ahrens (April 5th, 2019///////////////////////////////////////////////////////
'/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
'/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
'/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
Sub WaitUntil_Event(EventType, CheckVal, ByRef ReturnVariable, RunVBScript_FileName)
    On Error Resume Next
    LoopedCycleTime = 50    
    WaitUntil_SelectionChange = False
    'msgbox EVENT_CELL_CHANGE 
    select case EventType
        Case EVENT_CELL_CHANGE
            Set CheckVal = O.Selection
            Do
                Set CheckVal = O.Selection
                Val= CheckVal.Value
                Do 
                    WScript.Sleep LoopedCycleTime
                Loop Until O.Selection.Address <> CheckVal.Address
            Loop While CheckVal.Value = Val
            Set RtnVar = CheckVal
        Case EVENT_SELECTED_CELL_CHANGE 
            Do 
                WScript.Sleep LoopedCycleTime
            Loop Until O.Selection.Address <> CheckVal.Address
        Case EVENT_SELECTED_SHEET_CHANGE 
            Do 
                WScript.Sleep LoopedCycleTime
            Loop Until O.Selection.Worksheet.Name <> CheckVal.Worksheet.Name

        Case EVENT_SELECTED_WORKBOOK_CHANGE 
            Do 
                WScript.Sleep LoopedCycleTime
            Loop Until O.Selection.Worksheet.Parent.Name <> CheckVal.Worksheet.Parent.Name
    End Select
    'WaitUntil_Event = True
    'Include RunVBScript_FileName

End Sub

'/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
'///////////////////////////////////////////////End of Main Sub Program//////////////////////////////////////////////////////
'/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

【讨论】:

    【解决方案2】:

    使用GetRef 函数获取指向事件处理程序的指针并将其绑定到onclick 事件,如下所示:

    buttons(0).onclick = GetRef("OnClickSub")
    

    (显然,attachEvent 从网页外部调用时不起作用。)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-08-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多