проблемы с "getElementsByClassName" в MSHTML.HTMLDocument - PullRequest
0 голосов
/ 24 февраля 2019

Проблема возникает только при использовании getElementsByClassName

Dim HTTP As New MSXML2.XMLHTTP60

HTTP.open "POST", strWWW, False
HTTP.setRequestHeader "User-Agent", "Mozilla/4.0 (compatible; MSIE 6.0;     Windows NT 5.0)"
HTTP.setRequestHeader "Content-type", "application/x-www-form-urlencoded"
HTTP.send ("obj=" & strID)

Dim HTML As New MSHTML.HTMLDocument

HTML.body.innerHTML = HTTP.responseText

Dim eleCol As MSHTML.IHTMLElementCollection

Set eleCol = HTML.getElementsByClassName("listEvent sro") '<-- The problem is happening here.

Тесты проводятся в Windows 8.1 и Windows XP

Windows 8.1

Хотя в IDE все работает нормально, но при компиляции просто появляется ошибка:

Error on Windows 8.1

mshtml.dll 11.00.9600.18860

mshtml.tlb 11.0.9600.16518

Метод существует, но теперь почему он работает в IDE, а не при компиляции?

WindowsXP

Даже в IDE не сработало, выдав следующее сообщение об ошибке:

enter image description here

mshtml.dll8.0.6001.23588

mshtml.tlb 8.0.6001.18702 (старая версия и отсутствует getElementsByClassName)

mshtml.tlb 11.0.9600.16518 (с использованиемэта версия но она не работает)

Что я делаю не так?

Ответы [ 2 ]

0 голосов
/ 25 февраля 2019

Ваш совет решил проблему.

Список узлов, которые я использовал ...

Dim eleMen As MSHTML.IHTMLElement

For Each eleMen In eleCol
    debug.print eleMen.innerText
Next eleMen

... и он работал отлично, так жекогда не используется HTML.getElementsByClassName Сколько я использую getElementsByTagName также работает нормально, только getElementsByClassName, который отображает эту ошибку в исполняемом файле, а не в IDE.

Это ошибка в MSHTML?

Другая деталь в том, что это тоже работало без проблем ...

Set eleCol = HTML.querySelectorAll(".listEvent.sro").Item(0).getElementsByTagName("td")

... вернул все нужные мне узлы.

Большое спасибо!

0 голосов
/ 25 февраля 2019

Попробуйте следующий обходной путь, который использует синтаксис селектора CSS для выбора по классу.В современных браузерах это более быстрый метод сопоставления элементов.Это может работать.

Dim eleCol As Object
Set eleCol = HTML.querySelectorAll(".listEvent.sro")

Кроме того, проверьте, можете ли вы удалить использование составного класса и иметь один класс, например

Set eleCol = HTML.querySelectorAll(".listEvent")

. Вы используете For Loop с 0 для.Length -1 сверх возвращенного nodeList.

...