Visual Basic, .NET, ASP, VBScript
 

   
   
     

Форум - Общий форум

Страница: 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-сайт: mc-black.narod.ru/dzp.htm
 Профиль | | #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. Можно. Запись
wbrBody.Document.All.Tags("HEAD";)(0).InnerHTML

   эквивалентна
wbrBody.Document.All.Tags("HEAD";).Item(0).InnerHTML


2. Дело не в этом: ошибка сохраняется, даже если я напишу так:

wbrBody.Document.All.Tags("HEAD";)(0).InnerHTML = ""  ' << т.е. пустой строке

Ответить

Номер ответа: 3
Автор ответа:
 mc-black



ICQ: 308-534-060 

Вопросов: 20
Ответов: 1860
 Web-сайт: mc-black.narod.ru/dzp.htm
 Профиль | | #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-сайт: mc-black.narod.ru/dzp.htm
 Профиль | | #4
Добавлено: 26.10.04 17:10
st = wbrBody.Document.Body.InnerHTML ' << считываем текущее значение
...
st = st + ............ ' << меняем

Как-то странно мы меняем, мы что head ПОСЛЕ body вносим? Естественно, html не валидный получается.

Может как-то так:

'st = wbrBody.Document.Body.InnerHTML
'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-сайт: mc-black.narod.ru/dzp.htm
 Профиль | | #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
Спасибо, что вник в тему!
Кстати, это же относится ко всем тэгам внутри head

А вот это интересно: я не пробовал с ними играться.
там даже есть MSHTML.HTMLHeadElement

Знаю... просто хочется обойтись без тяжеловесной MSHTML.DLL - проект больно уж простой.
Это составные части Dinamic HTML, который, как известно работает с внешним оформлением документа (<BODY>;), а не с заголовком

А вот это интересно: я просто не удосужился вникнуть в DHTML - даже "введение" на MSDN'е читать не стал :))

Выход: буду менять HEAD тупым строковым парсингом HTML-файла. Лишние 20 строчек кода, зато м.б. удастся обойтись без MSHTML Library.

Ответить

Номер ответа: 8
Автор ответа:
 Павел



Администратор

ICQ: 326066673 

Вопросов: 368
Ответов: 5968
 Web-сайт: www.vbnet.ru
 Профиль | | #8
Добавлено: 27.10.04 13:28
Как я мог убедиться на практике, MSHTML крив как моя жизнь...
ИМХО, там глюки везде, а не только в этом конкретном случае...

Может быть просто не разрешено изменять Head... Этому может быть
разумное объяснение... Так же, например, мне не удавалось установить
OuterHTML у тэга HTML, происходила такая же ошибка.

Ответить

Номер ответа: 9
Автор ответа:
 mc-black



ICQ: 308-534-060 

Вопросов: 20
Ответов: 1860
 Web-сайт: mc-black.narod.ru/dzp.htm
 Профиль | | #9
Добавлено: 27.10.04 14:40
Если тебе покажется медленной работа со строками в VB, можно попробовать как в примере GlobalAlloc - работа со строками средствами API, кажется, пример sne :) Я проверял - и правда, работает шустро!

Ответить

Номер ответа: 10
Автор ответа:
 Comanche



Вопросов: 87
Ответов: 459
 Профиль | | #10 Добавлено: 27.10.04 14:56
2mc-black:
ты не поверишь: сижу и как раз этим и занимаюсь :-))

Ответить

Страница: 1 |

Поиск по форуму



© Copyright 2002-2011 VBNet.RU | Пишите нам