Страница: 1 |
Страница: 1 |
Вопрос: Ошибка в MSHTML. Помогите разобраться, please.
Добавлено: 26.10.04 13:40
Автор вопроса: Comanche
' Примечание: wbrBody - это элемент управления WebBrowser. Весь приведённый
' ниже код выполняю, естественно, когда документ уже загружен (т.е. ПОСЛЕ
' события DocumentComplete).
st = wbrBody.Document.Body.InnerHTML ' << считываем текущее значение
Debug.Print st ' << действительно печатает код тэга BODY
st = st + .......................... ' << меняем
wbrBody.Document.Body.InnerHTML = st ' << пишем обратно - тут никаких проблем нет
st = wbrBody.Document.All.Tags("HEAD")(0).InnerHTML ' << считываем текущее значение
Debug.Print st ' << действительно печатает код тэга HEAD
st = st + ......................................... ' << меняем
wbrBody.Document.All.Tags("HEAD")(0).InnerHTML = st ' << тут ругается (см. ниже)
А ругается так:
Run-time error '600': Не удалось установить свойство innerHTML. Недопустимый конечный элемент для данного действия.
Нигде не смог найти описания на run-time ошибки MSHTML. Да и по коду непонятно, в чём тут м.б. ошибка - с BODY (и с другими тэгами) ведь всё работает!
Есть предположения?
Ответы
Всего ответов: 10
Номер ответа: 1
Автор ответа:
mc-black
ICQ: 308-534-060
Вопросов: 20
Ответов: 1860
Web-сайт:
Профиль | | #1
Добавлено: 26.10.04 15:14
Может быть ответ и ламерский, но
st = wbrBody.Document.All.Tags("HEAD"(0).InnerHTML - так можно писать-то? Нигде мне такое не встречалось, чтобы две пары скобок рядом.
А ещё, возможно, нет какого-то закрывающего элемента - кавычки, скобки...
Номер ответа: 2
Автор ответа:
Comanche
Вопросов: 87
Ответов: 459
Профиль | | #2
Добавлено: 26.10.04 16:15
1. Можно. Запись
эквивалентна
2. Дело не в этом: ошибка сохраняется, даже если я напишу так:
Номер ответа: 3
Автор ответа:
mc-black
ICQ: 308-534-060
Вопросов: 20
Ответов: 1860
Web-сайт:
Профиль | | #3
Добавлено: 26.10.04 17:00
Как-то прикольно у тебя контрол называется: wbrBody... А не может быть так, что ты по содержанию туда тэг head не ставишь - веть бывает и такое... <html><body>текст</body></html>
Проверь:
wbrBody.Document.All.Tags("HEAD".Count = 0
Тогда это что-то объясняет...
Номер ответа: 4
Автор ответа:
mc-black
ICQ: 308-534-060
Вопросов: 20
Ответов: 1860
Web-сайт:
Профиль | | #4
Добавлено: 26.10.04 17:10
...
st = st + ............ ' << меняем
Как-то странно мы меняем, мы что head ПОСЛЕ body вносим? Естественно, html не валидный получается.
Может как-то так:
'Debug.Print st
st = "<title>Пример</title>"
wbrBody.Document.Head.InnerHTML = st
'или же
st = "<head><title>Пример</title></head>"
wbrBody.Document.Head.OutherHTML = st
Номер ответа: 5
Автор ответа:
Comanche
Вопросов: 87
Ответов: 459
Профиль | | #5
Добавлено: 26.10.04 18:03
1. Какая разница, как я назвал контрол?! В него загружен "полновесный" html-документ, со всеми мыслимыми тэгами. В том числе - и с HEAD.
2. Ты пишешь:
Посмотри внимательнее, выполняются две независимые операции: изменение innerHTML у тэга BODY и затем - изменение innerHTML у тэга HEAD. И это никак не может означать, что тэг HEAD вставляется ПОСЛЕ тэга BODY!!! В каком именно порядке выполняются эти операции - роли не играет: попробуй на практике.
3. wbrBody.Document.Head.InnerHTML - нет такого свойства: wbrBody.Document.Head!
Попробуй лучше воспроизвести эту ошибку на практике: создай проект, в Form_Load напиши «wbrBody.Navigate "...SomeFile.html"», а приведённый выше код размести в wbrBody_DocumentComplete, - только замени сначала многоточия на что-нибудь осмысленное (например, на "<title>Пример</title>".
Номер ответа: 6
Автор ответа:
mc-black
ICQ: 308-534-060
Вопросов: 20
Ответов: 1860
Web-сайт:
Профиль | | #6
Добавлено: 26.10.04 22:57
Ты знаешь, проверял, проверял - запроверялся. Результат один - 600-я ошибка, говорит нельзя так. Кстати, это же относится ко всем тэгам внутри head. Я понял, что тебе нужно (и в чем ошибался сам). У меня тоже не получилось. Это сделать видимо можно через Microsoft HTML Object Library (подключается через Refrences), там даже есть MSHTML.HTMLHeadElement, работа с дочерними (Children) элементами. Никогда с ним не работал, поэтому как следует не знаю.
А вот моя версия, почему этого сделать нельзя средствами InnerHTML/OuterHTML. Это составные части Dinamic HTML, который, как известно работает с внешним оформлением документа (<BODY>, а не с заголовком, заголовок доступен только на чтение.
Пиши, как и что, если у тебя получится.
Номер ответа: 7
Автор ответа:
Comanche
Вопросов: 87
Ответов: 459
Профиль | | #7
Добавлено: 26.10.04 23:30
Спасибо, что вник в тему!
А вот это интересно: я не пробовал с ними играться.
Знаю... просто хочется обойтись без тяжеловесной MSHTML.DLL - проект больно уж простой.
А вот это интересно: я просто не удосужился вникнуть в DHTML - даже "введение" на MSDN'е читать не стал )
Выход: буду менять HEAD тупым строковым парсингом HTML-файла. Лишние 20 строчек кода, зато м.б. удастся обойтись без MSHTML Library.
Номер ответа: 8
Автор ответа:
Павел
Администратор
ICQ: 326066673
Вопросов: 368
Ответов: 5968
Web-сайт:
Профиль | | #8
Добавлено: 27.10.04 13:28
Как я мог убедиться на практике, MSHTML крив как моя жизнь...
ИМХО, там глюки везде, а не только в этом конкретном случае...
Может быть просто не разрешено изменять Head... Этому может быть
разумное объяснение... Так же, например, мне не удавалось установить
OuterHTML у тэга HTML, происходила такая же ошибка.
Номер ответа: 9
Автор ответа:
mc-black
ICQ: 308-534-060
Вопросов: 20
Ответов: 1860
Web-сайт:
Профиль | | #9
Добавлено: 27.10.04 14:40
Если тебе покажется медленной работа со строками в VB, можно попробовать как в примере GlobalAlloc - работа со строками средствами API, кажется, пример sne Я проверял - и правда, работает шустро!
Номер ответа: 10
Автор ответа:
Comanche
Вопросов: 87
Ответов: 459
Профиль | | #10
Добавлено: 27.10.04 14:56
2mc-black:
ты не поверишь: сижу и как раз этим и занимаюсь )