WebBrowser, выполнение <script> перед DOCUMENTCOMPLETE

Обсуждение вопросов клиентского программирования.

Модератор: Duncon

Ответить
Koduc
Сообщения: 22
Зарегистрирован: 10 сен 2007, 01:33
Контактная информация:

Имеем: sink-интерфейс наследуемый от DWebBrowserEvents2, в Invoke обарабатываем все события..
Требуется: реализовать некое подобие фильтра html страниц
Делаю так: скрываю документ по событию DISPID_NAVIGATECOMPLETE2 до полной загрузки страницы (DISPID_DOCUMENTCOMPLETE), по событию DOCUMENTCOMPLETE получаю весь текст страницы, выполняю поиск и манипуляции, "ложу" текст обратно на страницу.
Проблема: ява-скрипты на странице выполняются между событиями NAVIGATECOMPLETE2 и DOCUMENTCOMPLETE. А так как документ у меня скрыт, то все действия с объектами, где надо чтобы они были видны (focus, например) заканчиваются ошибкой со стороны ява-скрипта.. (за примером далеко ходить не надо, yandex.ru ругается что ..can't move focus to the control because it is invisible.. )
Пробовал по NAVIGATECOMPLETE2 обнулить уже загрузившийся html и body элемент страницы, сохранить искомую страницу в поток, произвести манипуляции и загрузить страницу обратно, но тут снова проблема: WebBrowser так и остается "висеть", DOCUMENTCOMPLETE не приходит в принципе, плюс при работе через https не появляется значок ssl-шифрования в IE. Самое простое забить на скрытие, но "некрасиво" выглядит.. Загружается страница, виден сам процесс и в момент завершения загрузки происходит замена текста страницы. Неэстетично :(
Как лучше поступить? Возможно ли перехватить поток, идущий к WebBrowser и внести изменения в него? (средствами СОМ вообще и через pWebBrowser в частности) Или как можно отследить начало выполнения скриптов? Возможно ли остановить выполнение скриптов до полной загрузки страницы и выполнить их после этого?
Аватара пользователя
Oscar
Сообщения: 963
Зарегистрирован: 29 май 2004, 13:44
Откуда: Мюнхен (рожден в Киеве)
Контактная информация:

Koduc, а можно ли после NAVIGATECOMPLETE2 замалевать всё окно DIVом?
(добавить в документ элемент DIV с абсолютной позицией 0;0 и размером ширина-на-высоту окна и zOrder чтобы перекрывал все остальные)

тогда всё будет, как бы, видимым, но до полной загрузки (и фильтрации) страницы пользователь ничего не будет видеть
Koduc
Сообщения: 22
Зарегистрирован: 10 сен 2007, 01:33
Контактная информация:

Отличный вариант! Огромное спасибо!
Только теперь не могу добавить элемент..

Код: Выделить всё

IHTMLElement *pHTMLElement_div;
BSTR tmp = SysAllocString(L"DIV");
pHTML2Doc->createElement(tmp,&pHTMLElement_div);
SysFreeString(tmp);
VARIANT v;
v.vt=VT_BSTR;
v.bstrVal=L"position:absolute; left:0px; top:0px; width:1800px;height:1600px; z-index:100;background-color: #CCCCCC;"; // для примера
tmp = SysAllocString(L"style");
pHTMLElement_div->setAttribute(tmp,v,1); 
SysFreeString(tmp);
pHTMLElement_div->Release();
Подозреваю, что пропустил код, куда именно размещать этот объект, но TextRange создать можно для body, а по этому событию имеем только html, остальное не обработано. Что еще сделать нужно чтобы объект разместился?
Koduc
Сообщения: 22
Зарегистрирован: 10 сен 2007, 01:33
Контактная информация:

Если следовать такому совету, то всплывает проблема как заставить работать примерно следующий код:

Код: Выделить всё

<html>
<head>
<script>
var body = document.getElementsByTagName("body")[0];
var pdiv=document.createElement("div");
body.appendChild(pdiv);
</script>
</head>
<body>
Test!
</body></html>
По тому как через IHTMLWindow можно попробовать вызвать execScript..
Koduc
Сообщения: 22
Зарегистрирован: 10 сен 2007, 01:33
Контактная информация:

Всё, проблема решена через IHTMLWindow::execScript. Огромное спасибо за подсказки!
Александр Иваненко
Сообщения: 3
Зарегистрирован: 21 апр 2008, 18:43

Привет!

Скажи, как ты решил проблему с фильтрацией html? Ты встаялешь DIV яваскриптом из navigate? что именно в скрипте? Помоги, если не сложно, передо мной стоит та же задача.
Koduc
Сообщения: 22
Зарегистрирован: 10 сен 2007, 01:33
Контактная информация:

по navigatecomplete у нас есть пустой документ, в котором нельзя получить body, так как страница еще не загрузилась. Но ява-скрипт выполняется отлично, с поправкой на то, что body по сути еще нет. Можно похимичить с фреймесетами.
Александр Иваненко
Сообщения: 3
Зарегистрирован: 21 апр 2008, 18:43

Но какой скрипт ты выполняешь? Ты вставляешь скриптом div или уже фильтруешь html? И куда вставить скрипт?
Александр Иваненко
Сообщения: 3
Зарегистрирован: 21 апр 2008, 18:43

Я исполняю в NAVIGATECOMPLETE javascript, который модифицирует HTML, но штука в том, что это событие асинхронно. В итоге, браузер все равно сначала показывает исходную картинку, а лишь спустя полсекунды - новую... Как тебе удалось отфильтровать HTML незаметно?
Ответить