Проблемы с "getElementsByClassName" в MSHTML.HTMLDocument
Проблема возникает только при использовании 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 все работает нормально, но при компиляции просто появляется ошибка:
mshtml.dll 11.00.9600.18860
mshtml.tlb 11.0.9600.16518
Метод существует, но теперь почему он работает в IDE, а не при компиляции?
Windows XP
Даже в IDE не сработало, выдав следующее сообщение об ошибке:
mshtml.dll 8.0.6001.23588
mshtml.tlb 8.0.6001.18702 (старая версия и отсутствует getElementsByClassName)
mshtml.tlb 11.0.9600.16518 (используется эта версия, но она не работает)
Что я делаю неправильно?
2 ответа
Попробуйте следующий обходной путь, который использует синтаксис селектора CSS для выбора по классу. В современных браузерах это более быстрый метод сопоставления элементов. Это может сработать.
Dim eleCol As Object
Set eleCol = HTML.querySelectorAll(".listEvent.sro")
Также проверьте, можете ли вы удалить использование составного класса и иметь один класс, например:
Set eleCol = HTML.querySelectorAll(".listEvent")
Вы используете For Loop
от 0
в .Length -1
над возвращенным nodeList
,
Ваш совет решил проблему.
Список узлов, которые я использовал...
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")
... вернул все узлы, которые мне нужны.
Большое спасибо!