Как инициировать событие изменения при выборе элемента из выпадающего списка? - PullRequest
1 голос
/ 01 октября 2019

Я пытаюсь вызвать событие «при изменении» при выборе значения валюты из выпадающего меню. Это обновит мини-таблицу на этой странице, отражающую стоимость валюты. Однако при изменении значения через VBA jscript не запускается. Я использую IE, чтобы сделать это.

  Set objIE = New InternetExplorer
    objIE.Visible = True
    objIE.navigate "https://www.reuters.com/markets/currencies"
    Do While objIE.Busy = True Or objIE.readyState <> 4: DoEvents: Loop

    'Settlement Currency is Hard Coded to GBP
    SettCcy = "GBP"
    'Set Expression Currency
    expCcy = "EUR"
    'Set Target Currency
    targetCcy = "USD"

    On Error GoTo ResetIE

    If expCcy <> SettCcy And expCcy <> targetCcy Then

        'Set the rate refresher
        Set clicker = objIE.document.getElementsByClassName("CurrencyCalculator-currency-swap-2yw2I")(0)

        'Set the Expression Currency
        For Each o In objIE.document.getElementsByTagName("select")(1) 'Sets Expression Currency
            If o.Value = expCcy Then 
                o.Selected = True
                o.FireEvent "onchange"
                Exit For
            End If
        Next

Все, что мне нужно, это то, что при изменении значения через VBA страница будет обновляться так же, как и при работе вручную.

1 Ответ

0 голосов
/ 01 октября 2019

Пожалуйста, попробуйте использовать метод dispatchEvent , чтобы отправить событие изменения в элемент select, а затем вызвать событие onchange.

Пример кода, как показано ниже (вы можете обратиться к нему)и измените его, он хорошо работает на моей стороне):

Public Sub ClickTest()

    Dim  ie As Object, evtChange As Object

    Dim item As Object

    Set ie = CreateObject("InternetExplorer.Application")
    With ie
        .Visible = True
        .Navigate2 "<the website url>"

        While .Busy Or .readyState <> 4: DoEvents: Wend

        Set evtChange = .Document.createEvent("HTMLEvents")
        evtChange.initEvent "change", True, False

        'get the select element. Please note the index, it is starting from 0.
        Set item = ie.Document.getElementsByTagName("select")(0)

        expCcy = "EUR"

        'Set the Expression Currency
        For Each o In item 'Sets Expression Currency
            If o.Value = expCcy Then
                o.Selected = True
                o.dispatchEvent evtChange
                Exit For
            End If
        Next        
    End With
End Sub

Ресурс веб-сайта, подобный этому:

<select id="ddlCurrency" onchange="ddlCurrencyChange()" >
    <option value="GBP">GBP</option>
    <option value="EUR">EUR</option>
    <option value="USD">USD</option>
</select>

<script>

    function ddlCurrencyChange() {
        document.getElementById("result").innerHTML += "change event triggered... <br /> selected value is " + document.getElementById("ddlCurrency").value + "<br/>";
    }
</script>
...