Страница: 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. Можно. Запись
 
    
(0).InnerHTML
   эквивалентна
.Item(0).InnerHTML
2. Дело не в этом: ошибка сохраняется, даже если я напишу так:
(0).InnerHTML = ""  ' << т.е. пустой строке
		
	  
			 
	
		 
    
       
    
Номер ответа: 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:
 
    
ты не поверишь: сижу и как раз этим и занимаюсь 
)