HTML-события загружаются медленнее, чем макросы - PullRequest
0 голосов
/ 11 января 2019

<script type="text/javascript">
						var questionType = 'RQ_CHOICE';
						var elementName="meetingQuestionAnswer(220674)";
						if(questionType=="RQ_CHOICE" || questionType=="RQ_YES_NO" ){
							$("select[name='" + elementName + "']").bind("change",function(event){
								loadDependentQuestion("220674",'select');
							});
						}
						if(questionType=="RQ_CHOICE_BULLET" || questionType=="RQ_RATING_SCALE"){
							$("input:radio[name='" + elementName + "']").bind("change",function(event){
								loadDependentQuestion("220674",'radio');
							});
						}
						bindDelegateToloadDependentQuestion("220674");
	</script>

С помощью я решил получить зависимый dropboz для запуска из ответа на предыдущий вопрос с событием «onchange» из JavaScript (см. Ссылку на вопрос об этом), но теперь код JavaScript, кажется, работает медленнее, чем макрос поэтому, когда мне нужно ответить на следующий вопрос с данными из Excel, макрос останавливается с ошибкой, говорящей о том, что объект не существует (потому что новый раскрывающийся список (мой объект) еще не появился). Если я отлаживаю, а затем вручную перехожу построчно, это дает время JavaScript для загрузки нового выпадающего списка, и все отлично работает.

событие onchange в JavaScript - список зависимых опций

Я пытался использовать функцию ожидания из VBA после запуска события, а также цикл с событиями do, но все равно он не работает.

Я также сделал цикл do, чтобы повторить действие, пока объект является ничем, но тоже не работал.

Это сценарий, связанный с тремя вопросами:

   
    'First question
    ieDoc.getElementsByName("question1")(0).Value = "Yes"
    event_onChange.initEvent "change", True, False
    ieDoc.getElementsByName("question1")(0).dispatchEvent event_onChange
    While ieApp.Busy Or ieApp.readyState <> 4: DoEvents: Wend
    application.wait "00:00:02"
    
    'Second question - the one that is not loading
    Do while ieDoc.getElementsByName("question2")(0) Is Nothing Then
        For i = 1 To totalRng.Cells.count
            If totalRng.Cells(i).Offset(, savingsRng.Column - Cells(i).Column) > 0 Then
                On Error Resume Next
                While ieApp.Busy Or ieApp.readyState <> 4: DoEvents: Wend
                ieDoc.getElementsByName("question2")(0).Value = "Yes"
                Exit For
            Else
                While ieApp.Busy Or ieApp.readyState <> 4: DoEvents: Wend
                ieDoc.getElementsByName("question2")(0).Value = "No"
            End If
        Next i
     Loop

1 Ответ

0 голосов
/ 11 января 2019

Похоже, вы хотите, чтобы цикл существовал до настоящего времени, и создавайте его исходя из времени ожидания, чтобы избежать потенциального бесконечного цикла.

Const MAX_WAIT_SEC As Long = 10
Dim t As Date, ele As Object
t = Timer
Do
    On Error Resume Next
    Set ele = ieDoc.querySelector("[name='meetingQuestionAnswer(221010)']")
    On Error GoTo 0
    If Timer - t > MAX_WAIT_SEC Then Exit Do
Loop While ieDoc.querySelectorAll("[name='meetingQuestionAnswer(221010)']").Length = 0
If Not ele Is Nothing Then
    'do something
End If
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...