![]() |
Модераторы: gambit, Partizan |
![]() ![]() ![]() |
|
Spancer |
|
|||
Новичок Профиль Группа: Участник Сообщений: 32 Регистрация: 14.5.2007 Репутация: нет Всего: нет |
1) Собственно задача она же проблема.
Есть страница DHTML, в которую с помощью AJAX дозагружаются данные. Событие Webbrowser.DocumentCompleted наступает когда страница полностью загружена, но динамическая часть грузится после полной загрузки основной части в контейнер <div>. Так вот, стоит вопрос каким способом можно отследить загрузку этого контейнера. Решение нашел с помощью while искать текст на странице, который загружается в этот контейнер. Но этот текст может быть различным. 2) Иногда страница выбрасывает javascript окно alert(); Как его закрыть, а еще лучше проигнорировать? Все нужно решить на основе компонента Webbrowser. |
|||
|
||||
diadiavova |
|
|||
![]() Доктор Зло(диагност, настоящий, с лицензией и полномочиями) ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 5821 Регистрация: 14.8.2008 Где: В Коньфпольте Репутация: 16 Всего: 142 |
По первому вопросу всё достаточно просто: надо после загрузки документа прикрутить к событию onpropertychange обработчик в нём отслеживать изменение значения свойства innerHTML. А вот на счёт алерта не знаю, думаю простого решения нет.
-------------------- Хочешь получить мудрый совет - читай подписи участников форумов. Злой доктор Щасзаболит ![]() |
|||
|
||||
Spancer |
|
|||
Новичок Профиль Группа: Участник Сообщений: 32 Регистрация: 14.5.2007 Репутация: нет Всего: нет |
onpropertychange - таких событий я не знаю, в нём отслеживать изменение значения свойства innerHTML. каким образом?
у меня работает все так: while (webBrowser1.ReadyState != WebBrowserReadyState.Complete) { Application.DoEvents(); this.Update(); } while (webBrowser1.Document.Body.InnerText.IndexOf("Ждет какой то определенный текст, появление которого сведетельствует, что динамическая часть загружена") >= 0) { Application.DoEvents(); this.Update(); } Но это все сжирает огромные ресурсы, 8 экземпляров такое программы вешают 4х ядерный проц на 100%. А хочется не ограничиваться 8 экземплярами, вообще в недалеком будущем это все будет работать в разных потоках. |
|||
|
||||
diadiavova |
|
|||
![]() Доктор Зло(диагност, настоящий, с лицензией и полномочиями) ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 5821 Регистрация: 14.8.2008 Где: В Коньфпольте Репутация: 16 Всего: 142 |
Пример в аттаче. Там вебстраничка, с текстовым полем и кнопкой. Если в текстовое поле ввести текст и нажать кнопку, то текст загружается в div. В программе отслеживается изменение свойства innerHTML этого дива и когда оно происходит выскакивает сообщение с этим самым хтмл-кодом.
Это сообщение отредактировал(а) diadiavova - 20.4.2010, 16:28 Присоединённый файл ( Кол-во скачиваний: 58 ) ![]() -------------------- Хочешь получить мудрый совет - читай подписи участников форумов. Злой доктор Щасзаболит ![]() |
|||
|
||||
Spancer |
|
|||
Новичок Профиль Группа: Участник Сообщений: 32 Регистрация: 14.5.2007 Репутация: нет Всего: нет |
Спасибо конечно, но что то пример не работает
|
|||
|
||||
diadiavova |
|
|||
![]() Доктор Зло(диагност, настоящий, с лицензией и полномочиями) ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 5821 Регистрация: 14.8.2008 Где: В Коньфпольте Репутация: 16 Всего: 142 |
Это скорей всего из-за библиотеки mshtml, просто убери её из списка ссылок и добавь заново стандартными средствами студии.
-------------------- Хочешь получить мудрый совет - читай подписи участников форумов. Злой доктор Щасзаболит ![]() |
|||
|
||||
Spancer |
|
|||
Новичок Профиль Группа: Участник Сообщений: 32 Регистрация: 14.5.2007 Репутация: нет Всего: нет |
После добавление библиотеки ни чего не изменилось, думаю потому что по умолчанию контейнер <div> уже не пустой.
Поясните строку:
|
|||
|
||||
diadiavova |
|
|||
![]() Доктор Зло(диагност, настоящий, с лицензией и полномочиями) ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 5821 Регистрация: 14.8.2008 Где: В Коньфпольте Репутация: 16 Всего: 142 |
Не знаю, у меня всё работает. Эта строка должна выглядеть так
Аргшумент приводится от одного типа интерфейса к другому и его свойство propertyName сравнивается со строкой "innerHTML". Событие onpropertychange возникает при изменении любого свойства, имя изменившегося свойства как раз и возвращает propertyName. Поскольку надо отслеживать свойство innerHTML, проводится именно такая проверка. Добавлено через 3 минуты и 5 секунд Это не имеет значения. Событие срабатывает каждый раз при изменении содержимого дива. -------------------- Хочешь получить мудрый совет - читай подписи участников форумов. Злой доктор Щасзаболит ![]() |
|||
|
||||
Spancer |
|
|||
Новичок Профиль Группа: Участник Сообщений: 32 Регистрация: 14.5.2007 Репутация: нет Всего: нет |
Вообщем ни чего не заработало, как бы я не пробывал, ОС: Windows XP Prof SP3, Windows Server R2, Visual Studio 2008 prof
|
|||
|
||||
diadiavova |
|
|||
![]() Доктор Зло(диагност, настоящий, с лицензией и полномочиями) ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 5821 Регистрация: 14.8.2008 Где: В Коньфпольте Репутация: 16 Всего: 142 |
По идее от оси это не должно зависеть. Тут надо следующие вопросы рассмотреть 1. Изменял ли ты код прежде чем запустить? В том варианте, что ты приводил, ты изменил регистр символов, в таком виде сработать и не должно. Если менял что-то ещё, просто распакуй архив снова и запусти как есть. 2.Выдаёт ли студия какие-нибуд предупреждения? Если нет ошибок, это не значит, что всё правильно, при отсутствии ошибок проект может скомпилиться и не работать, так что обрати внимание и на предупреждения тоже. 3. Если не поможет - создай новый проект, добавь в него библиотеку mshtml, кинь на форму браузер и скопируй код. Так же перетяни туда вебстраничку и в свойствах укажи, чтобы она копировалась в программу. Иными словами собери проект заново. -------------------- Хочешь получить мудрый совет - читай подписи участников форумов. Злой доктор Щасзаболит ![]() |
|||
|
||||
Spancer |
|
|||
Новичок Профиль Группа: Участник Сообщений: 32 Регистрация: 14.5.2007 Репутация: нет Всего: нет |
Ни чего не делал, запускал дебаг эксешник из атача, проект перекомпилил, тоже не помогло, сам решил проблему следующим способом:
Осталось только решить вопрос с JavaScript alert(). |
|||
|
||||
diadiavova |
|
|||
![]() Доктор Зло(диагност, настоящий, с лицензией и полномочиями) ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 5821 Регистрация: 14.8.2008 Где: В Коньфпольте Репутация: 16 Всего: 142 |
Этот способ плох тем, что с его помощью нельзя отследить какое именно свойство изменилось и код внутри этого метода будет срабатывать всякий раз, когда будет меняться любое свойство дива. -------------------- Хочешь получить мудрый совет - читай подписи участников форумов. Злой доктор Щасзаболит ![]() |
|||
|
||||
Spancer |
|
|||
Новичок Профиль Группа: Участник Сообщений: 32 Регистрация: 14.5.2007 Репутация: нет Всего: нет |
Согласен, но другого решения я пока не нашел, а мне это критично :(
Добавлено @ 05:50 2) тоже решено, но эротика полная. public const int WM_SYSCOMMAND = 0x0112; public const int SC_CLOSE = 0xF060; [DllImport("user32.dll")] public static extern int FindWindow( string lpClassName, string lpWindowName ); [DllImport("user32.dll")] public static extern int SendMessage( int hWnd, uint Msg, int wParam, int lParam ); private void timer1_Tick(object sender, EventArgs e) { int iHandle = FindWindow(null, "Сообщение с веб-страницы"); SendMessage(iHandle, WM_SYSCOMMAND, SC_CLOSE, 0); } Это сообщение отредактировал(а) Spancer - 22.4.2010, 05:50 |
|||
|
||||
diadiavova |
|
|||
![]() Доктор Зло(диагност, настоящий, с лицензией и полномочиями) ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 5821 Регистрация: 14.8.2008 Где: В Коньфпольте Репутация: 16 Всего: 142 |
А что у тебя происходит с моим примером? Ты ничего не написал как он работает, запускается ли вообще, выдаёт ли придупреждения и так далее. Я переписал проект под второй фреймворк, внёс незначительные изменения(ничего принципиального, просто так понятнее), попробуй запустить. Ну вообще всё это очень странно. Присоединённый файл ( Кол-во скачиваний: 55 ) ![]() -------------------- Хочешь получить мудрый совет - читай подписи участников форумов. Злой доктор Щасзаболит ![]() |
|||
|
||||
Spancer |
|
|||
Новичок Профиль Группа: Участник Сообщений: 32 Регистрация: 14.5.2007 Репутация: нет Всего: нет |
Он запускается, ни каких эксепшинов нет, просто как минибраузер со страницей и кнопкой хтмл с добавлением текста в див контейнер.
И да, мой способ тоже работает некорректно: То есть, если: div.InnerHtml = "1"; евент сработает если div.InnerHtml = "что то отличное от 1", НО как только div.InnerHtml опять примет значение = "1" или другому значению которое он уже принимал, то евент не происходит. Грубо говоря он хранит ВСЕ значения которые принимал за время работы программы и евент происходит только тогда когда div.InnerHtml принимает значение отличное от всех предидущих, а мне надо чтобы он мог принимать и одно и тоже значение и эвент срабатывал. То: diadiavova сейчас попробую эту версию проекта. Сюдя по всему в вашем проекте должно быть то, что мне надо, вот только бы заставить это все работать. Еще попробую дебагером проследить что да как. |
|||
|
||||
![]() ![]() ![]() |
Прежде чем создать тему, посмотрите сюда: | |
|
Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов. Что делать если Вам помогли, но отблагодарить помощника плюсом в репутацию Вы не можете(не хватает сообщений)? Пишите сюда, или отправляйте репорт. Поставим :) Так же не забывайте отмечать свой вопрос решенным, если он таковым является :) Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, mr.DUDA, THandle. |
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | Разработка Windows Forms | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |