VBA 帮助触发与输入框相关的事件

Posted

技术标签:

【中文标题】VBA 帮助触发与输入框相关的事件【英文标题】:Firing events associated with input box 【发布时间】:2022-01-09 08:47:43 【问题描述】:

我在触发与输入框相关的事件时遇到问题。当我检查相关文本框时,这些是“DOM Explorer”的“事件”窗口中的事件侦听器。但是,它们并未在输入框本身的 html 中列出。在列出的几个事件监听器中(例如“input”、“blur”、“paste”),它们都会触发相同的 javascript 函数“x”。虽然我的代码确实插入了文本,但该字段在按下提交按钮时不会验证并突出显示红色。手动输入或剪切和粘贴将解决此问题。 我试过 .fireEvent ; .dispatchEvent 甚至尝试直接调用 javascript。它都不起作用。这是一个公共网站,地址在代码中。我在代码下方包含了填写前 3 个字段的代码。

以下是该字段的 HTML:

<input class="office-form-question-textbox office-form-textfield-input form-control office-form-theme-focus-border border-no-radius" aria-labelledby="QuestionId_r57b9be42eed24e63b4d2af31c178f530 QuestionInfo_r57b9be42eed24e63b4d2af31c178f530" spellcheck="true" maxlength="4000" placeholder="Enter your answer">

DOM 资源管理器窗口的屏幕截图如下:

Private Sub Test()
myAddress = "https://forms.office.com/Pages/ResponsePage.aspx?id=q4GdsF1ZzU2rJGpWVuGNiROj17Ac1mtIt6V80jIX_PFUMEs1VTZaQ0VRV1NNNVI4Vzg3V0RMOE83TS4u"

'create new instance of IE.
 Set IE = CreateObject("InternetExplorer.Application")
 IE.Visible = True
 IE.navigate myAddress

'wait for loading
 Do While IE.Busy = True Or IE.readyState <> 4: DoEvents: Loop

 WasteTime (0.1) 'Custom function to pause for 0.1 sec


Dim myData(1 To 3, 1 To 3) As String

myData(1, 1) = "Member Surname"
myData(2, 1) = "QuestionId_r57b9be42eed24e63b4d2af31c178f530"
myData(3, 1) = "Chowdhary"

myData(1, 2) = "Member Forename"
myData(2, 2) = "QuestionId_rb88bf6d86f284dbaa14e5f3f27ee9f5b"
myData(3, 2) = "Saqib"

myData(1, 3) = "Member DOB"
myData(2, 3) = "QuestionId_r38d6e5656a6b4fbf86f586d10cbd8cb6"
myData(3, 3) = "19/04/1971"

Set objItem = IE.document.getElementsByTagName("input")
x = 0
Do While x < objItem.Length
    Set ele = objItem(x)
    mySearch = ele.outerHTML
For c = 1 To UBound(myData, 2)
    If InStr(mySearch, myData(2, c)) > 0 Then
            ele.Focus
            ele.Value = myData(3, c)                
            Set event_onChange = IE.document.createEvent("HTMLEvents")
            event_onChange.initEvent "paste", True, False
            ele.dispatchEvent event_onChange 'This does not fire event                
            'ele.FireEvent ("onpaste") '- This did not work either
            'IE.document.parentWindow.execScript code:="x(c)" ' Tried to directly call the javascript function                                    
            Exit For
    End If
Next c
x = x + 1
Loop

End sub

任何建议将不胜感激

【问题讨论】:

【参考方案1】:

搜索框中的事件可以用SendKeys 触发。您可以使用SendKeys模拟用户输入来设置输入框的值,然后点击提交提交表单。

可以参考下面的代码sn-p。我已经测试过了,它可以工作:

Set objItem = IE.document.getElementsByTagName("input")(0)
objItem.Focus
SendKeys ("Chowdhary")
Application.Wait (Now + TimeValue("00:00:02"))
IE.document.getElementsByTagName("button")(4).Click

【讨论】:

谢谢于舟,我打算让 SendKeys 成为我最后的解决方案。然而,我对学习如何在这种情况下直接触发 JavaScript 很感兴趣。我在简单示例中使用的方法在这里似乎不起作用。 @Saqib 我不太清楚为什么其他方法不起作用。有时它只适用于SendKeys。如果这个回答能帮助你解决问题,你可以参考this接受。它可以在未来帮助其他社区成员解决类似的问题。感谢您的理解。【参考方案2】:

所以我终于让代码基于相同的.initEvent.dispatchEvent 方法工作。我只需要引入一个 0.1 秒的短暂暂停(使用自定义的“Wastetime”功能)来让元素完全加载。为了感兴趣,更改后的相关代码 sn-p 是:

Set objItem = IE.Document.getElementsByTagName("input")
x = 0
Do While x < objItem.Length
    Set ele = objItem(x)
    mySearch = ele.outerHTML ' Could just enumerate the input indexes in order
    For c = 1 To UBound(myInternalArray, 2)
        If InStr(mySearch, myInternalArray(2, c)) > 0 Then
            If myInternalArray(3, c) = "click" Then
                ele.Click
                WasteTime (0.1) 'Time for form to expand
                Exit For
            Else
                ele.Value = myInternalArray(3, c)
                ele.Focus
                Set event_onInput = IE.Document.createEvent("HTMLEvents")
                event_onInput.initEvent "input", True, False
                ele.dispatchEvent event_onInput                
                Exit For
            End If
        End If
    Next c
    x = x + 1
Loop

【讨论】:

以上是关于VBA 帮助触发与输入框相关的事件的主要内容,如果未能解决你的问题,请参考以下文章

Excel VBA - 在用户窗体上手动调用文本框退出事件?

Excel VBA文本框以填充组合框

移动端H5输入框踩坑总结

input输入框change和blur事件区别

input输入框内容变化实时监听

input输入框的oninput和onchange事件