Модераторы: gambit, Partizan

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> webBrowser, отлов кликов или выполнений JS функций 
:(
    Опции темы
Quietasice
Дата 11.4.2011, 01:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 19
Регистрация: 2.8.2009

Репутация: нет
Всего: нет



Доброе время суток. Не подскажите, как можно отловить выполнение определенный JS функции в webBrowser? Или же как отловить нажатие ПКМ в определенном месте? 

Код

IHTMLDocument2 doc = (IHTMLDocument2)webBrowser1.Document.DomDocument;
IHTMLWindow2 frame = (IHTMLWindow2)doc.frames.item(3);
HTMLDocument fdoc = frame.document as HTMLDocument;
HTMLElementCollection elems = (HTMLElementCollection)fdoc.getElementsByTagName("span");
HTMLDocumentEvents2_Event iEvent = (HTMLDocumentEvents2_Event)elems;
iEvent.oncontextmenu += new HTMLDocumentEvents2_oncontextmenuEventHandler(Browser_ClickStandardEvent);


Событие не отлавливается, если не по тегу, а по самой области:
Код

IHTMLDocument2 doc = (IHTMLDocument2)webBrowser1.Document.DomDocument;
IHTMLWindow2 frame = (IHTMLWindow2)doc.frames.item(3);
HTMLDocument fdoc = frame.document as HTMLDocument;
HTMLDocumentEvents2_Event iEvent = (HTMLDocumentEvents2_Event)fdoc;
iEvent.oncontextmenu += new HTMLDocumentEvents2_oncontextmenuEventHandler(Browser_ClickStandardEvent);


Условие отлавливается. 

То есть, цель такова: есть webBrowser, в него грузится несколько фреймов. Нахожу нужный. Далее при нажатии ПКМ в определенной области, должно выскакивать мое контекстное меню, которое я создал, вместо того меню, которое делает JS функция подгружаемая с сервера.
У кого-то есть какие-то соображения по этому поводу. Был бы благодарен за любую помощь.
PM MAIL   Вверх
diadiavova
Дата 11.4.2011, 02:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Доктор Зло(диагност, настоящий, с лицензией и полномочиями)
****


Профиль
Группа: Модератор
Сообщений: 5821
Регистрация: 14.8.2008
Где: В Коньфпольте

Репутация: 16
Всего: 142



Событие oncontextmenu есть у элементов, но не у коллекций элементов. В то же время метод getElementsByTagName возвращает коллекцию элементов  и ты пытаешься одним махом повесить обработчик события на всю коллекцию. Если тебе нужно повесить обработчик на один элемент, то выбери его из коллекции, а если на все - обойди ее в цикле и повесь обработчик на каждый элемент.


--------------------
Хочешь получить мудрый совет - читай подписи участников форумов.
Злой доктор Щасзаболит smile
PM   Вверх
Quietasice
Дата 11.4.2011, 17:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 19
Регистрация: 2.8.2009

Репутация: нет
Всего: нет



скажем так, в webbrowser грузится около 5 фреймов, мне нужен только 1, я нахожу его и в него приходят сообщения(типа чата), сообщение приходят в таком виде "<span ontextmenu="return OnMenu(event,7)">сообщение</span>", вот при нажатии на это само "сообщение" выскакивает меню, которое сгенрированное функцией JS, мне либо нужно отлавливать эту функцию и глушить ее, при этот в замен выпускать свое контекстное меню, либо при нажатии ПКМ на это "сообщение" выпускать свое контекстное меню. 
PM MAIL   Вверх
diadiavova
Дата 11.4.2011, 17:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Доктор Зло(диагност, настоящий, с лицензией и полномочиями)
****


Профиль
Группа: Модератор
Сообщений: 5821
Регистрация: 14.8.2008
Где: В Коньфпольте

Репутация: 16
Всего: 142



Quietasice, Насколько я понимаю, это как раз случай, когда элементы надо обойти в цикле и повесить обработчик на каждый.

Добавлено через 3 минуты и 5 секунд
То есть вместо
Код

HTMLDocumentEvents2_Event iEvent = (HTMLDocumentEvents2_Event)elems;
iEvent.oncontextmenu += new HTMLDocumentEvents2_oncontextmenuEventHandler(Browser_ClickStandardEvent);

Написать что-то вроде
Код

for(int i = 0; i < elems.length; i++)
{
    HTMLDocumentEvents2_Event iEvent = (HTMLDocumentEvents2_Event)elems.item(i);
    iEvent.oncontextmenu += new HTMLDocumentEvents2_oncontextmenuEventHandler(Browser_ClickStandardEvent);
}



--------------------
Хочешь получить мудрый совет - читай подписи участников форумов.
Злой доктор Щасзаболит smile
PM   Вверх
Quietasice
Дата 11.4.2011, 20:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 19
Регистрация: 2.8.2009

Репутация: нет
Всего: нет



Цитата(diadiavova @ 11.4.2011,  17:37)
Quietasice, Насколько я понимаю, это как раз случай, когда элементы надо обойти в цикле и повесить обработчик на каждый.

Добавлено @ 17:40
То есть вместо
Код

HTMLDocumentEvents2_Event iEvent = (HTMLDocumentEvents2_Event)elems;
iEvent.oncontextmenu += new HTMLDocumentEvents2_oncontextmenuEventHandler(Browser_ClickStandardEvent);

Написать что-то вроде
Код

for(int i = 0; i < elems.length; i++)
{
    HTMLDocumentEvents2_Event iEvent = (HTMLDocumentEvents2_Event)elems.item(i);
    iEvent.oncontextmenu += new HTMLDocumentEvents2_oncontextmenuEventHandler(Browser_ClickStandardEvent);
}

Спасибо, попробую так сделать. Я этот код вставляю в WebBrowser_DocumentComplete и получается, что это события будет несколько раз приписано, то есть, когда я вставлял:

Код

IHTMLDocument2 doc = (IHTMLDocument2)webBrowser1.Document.DomDocument;
IHTMLWindow2 frame = (IHTMLWindow2)doc.frames.item(3);
HTMLDocument fdoc = frame.document as HTMLDocument;
HTMLDocumentEvents2_Event iEvent = (HTMLDocumentEvents2_Event)fdoc;
iEvent.oncontextmenu += new HTMLDocumentEvents2_oncontextmenuEventHandler(Browser_ClickStandardEvent)


тогда функция Browser_ClickStandardEvent выполняется N-ое кол-во раз, а не 1 раз, как хотелось
PM MAIL   Вверх
diadiavova
Дата 11.4.2011, 21:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Доктор Зло(диагност, настоящий, с лицензией и полномочиями)
****


Профиль
Группа: Модератор
Сообщений: 5821
Регистрация: 14.8.2008
Где: В Коньфпольте

Репутация: 16
Всего: 142



Цитата(Quietasice @  11.4.2011,  21:59 Найти цитируемый пост)
Я этот код вставляю в WebBrowser_DocumentComplete и получается, что это события будет несколько раз приписано, то есть, когда я вставлял:


Цитата(Quietasice @  11.4.2011,  21:59 Найти цитируемый пост)
тогда функция Browser_ClickStandardEvent выполняется N-ое кол-во раз, а не 1 раз, как хотелось 

Ни фига не понял. smile 


--------------------
Хочешь получить мудрый совет - читай подписи участников форумов.
Злой доктор Щасзаболит smile
PM   Вверх
Quietasice
Дата 12.4.2011, 01:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 19
Регистрация: 2.8.2009

Репутация: нет
Всего: нет



ну смотрите, тот код я вставляю в событие Browser_Documentcomplete, это событие происходит несколько раз, пока полностью загрузится страница. В этом событие я делаю:

Код

iEvent.oncontextmenu += new HTMLDocumentEvents2_oncontextmenuEventHandler(Browser_ClickStandardEvent)


и т.к. событие Browser_Documentcomplete происходит несколько раз, то и присваивание действия тоже происходит несколько раз. То есть, если я в функции Browser_ClickStandardEvent напишу MessageBox.Show("gcgfgfg"); то это сообщение выскачит несколько раз, хотя долго один раз, вот и не знаю как добиться этого 1го раза :( то есть присваивание этого действия должно быть только 1 раз после полной загрузки страницы. Но webbrowser реагирует на каждую загрузку(из каждого фрейма). А один из фреймов периодически обновляется (чат) и в итоге с каждым разом все чаще выполняется функция Browser_ClickStandardEvent

p.s. сорри за опечатки, пишу с ноута с тачпадом, периодически курсор гуляет :(

Это сообщение отредактировал(а) Quietasice - 12.4.2011, 01:41
PM MAIL   Вверх
diadiavova
Дата 12.4.2011, 02:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Доктор Зло(диагност, настоящий, с лицензией и полномочиями)
****


Профиль
Группа: Модератор
Сообщений: 5821
Регистрация: 14.8.2008
Где: В Коньфпольте

Репутация: 16
Всего: 142



Надо просто подобрать другое событие или другой способ обработки. Например в DocumentCompleted проверяй значение свойства Url второго аргумента обработчика и выполняй действие только в том случае, если урла соответствует адресу нужного фрейма. По поводу обновлений дело несколько сложнее, но в принципе, если обновления происходят не через аякс, а через обновление всего фрейма, то все равно подписываться придется при каждом обновлении, поскольку при обновлении это уже другая страница, и на события ее объектов надо подписываться заново.


--------------------
Хочешь получить мудрый совет - читай подписи участников форумов.
Злой доктор Щасзаболит smile
PM   Вверх
Quietasice
Дата 12.4.2011, 13:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 19
Регистрация: 2.8.2009

Репутация: нет
Всего: нет



Выдало ошибку тут:

Код

HTMLDocumentEvents2_Event iEvent = (HTMLDocumentEvents2_Event)elems.item(i)


Невозможно привести СОМ-объект типа "mshtml.HTMLSpanElementClass" к типу интерфейса событий "mshtml.HTMLDocumentEvents2_Event".
Я так понимаю каждый elems.item(i) нужно привести к другому типу? если так, то к какому?

Это сообщение отредактировал(а) Quietasice - 12.4.2011, 13:59
PM MAIL   Вверх
diadiavova
Дата 12.4.2011, 14:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Доктор Зло(диагност, настоящий, с лицензией и полномочиями)
****


Профиль
Группа: Модератор
Сообщений: 5821
Регистрация: 14.8.2008
Где: В Коньфпольте

Репутация: 16
Всего: 142



Цитата(Quietasice @  12.4.2011,  14:45 Найти цитируемый пост)
Я так понимаю каждый elems.item(i) нужно привести к другому типу? если так, то к какому?

Возможно к этому mshtml.HTMLElementEvents_Event


--------------------
Хочешь получить мудрый совет - читай подписи участников форумов.
Злой доктор Щасзаболит smile
PM   Вверх
Quietasice
Дата 12.4.2011, 14:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 19
Регистрация: 2.8.2009

Репутация: нет
Всего: нет



о получилось, спасибо большое

Терь немного другая проблема.  Мое контекстное меню отображается по клику на определенный тег, если выбрать какой-то пункт меню, то потом контекстное меню не отображается больше, пока фрейм не перегрузится, то есть пока не произойдет заново webBrowser_DocumentComplete

Это сообщение отредактировал(а) Quietasice - 12.4.2011, 14:46
PM MAIL   Вверх
Quietasice
Дата 12.4.2011, 15:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 19
Регистрация: 2.8.2009

Репутация: нет
Всего: нет



Вот код этих действий:

Код

        private void webBrowser1_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e)
        {
            if (e.Url.LocalPath == "/ch.php")
            {
                IHTMLDocument2 doc1 = (IHTMLDocument2)webBrowser1.Document.DomDocument;
                IHTMLWindow2 frame1 = (IHTMLWindow2)doc1.frames.item(3);
                string gg = Regex.Replace(frame1.document.body.innerHTML, "\r\n", "", RegexOptions.IgnoreCase);
                gg = Regex.Replace(frame1.document.body.innerHTML, " oncontextmenu=\"return OpenMenu\\(event\\,7\\)\"", "", RegexOptions.IgnoreCase);
                frame1.document.body.innerHTML = gg;
                try
                {
                    IHTMLDocument2 doc = (IHTMLDocument2)webBrowser1.Document.DomDocument;
                    IHTMLWindow2 frame = (IHTMLWindow2)doc.frames.item(3);
                    HTMLDocument fdoc = (HTMLDocument)frame.document;
                    IHTMLElementCollection elems = (IHTMLElementCollection)fdoc.getElementsByTagName("SPAN");
                    for (int i = 0; i < elems.length; i++)
                    {
                        HTMLElementEvents2_Event iEvent = (HTMLElementEvents2_Event)elems.item(i);
                        iEvent.oncontextmenu += new HTMLElementEvents2_oncontextmenuEventHandler(Browser_ClickStandardEvent);
                    }
                }
                catch (Exception d)
                {
                    MessageBox.Show("Ошибка:" + d);
                }
            }
        }
        bool Browser_ClickStandardEvent(IHTMLEventObj e)
        {
            try
            {
                contextMenuStrip1.Show(e.screenX, e.screenY);
                return false;
            }
            catch (Exception d)
            {
                MessageBox.Show("Ошибка: " + d);
                return false;
            }
        }


Это сообщение отредактировал(а) Quietasice - 12.4.2011, 15:50
PM MAIL   Вверх
Quietasice
Дата 15.4.2011, 02:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 19
Регистрация: 2.8.2009

Репутация: нет
Всего: нет



ни у кого никаких соображений нет по этому поводу?
PM MAIL   Вверх
diadiavova
Дата 15.4.2011, 08:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Доктор Зло(диагност, настоящий, с лицензией и полномочиями)
****


Профиль
Группа: Модератор
Сообщений: 5821
Регистрация: 14.8.2008
Где: В Коньфпольте

Репутация: 16
Всего: 142



Цитата(Quietasice @  15.4.2011,  03:39 Найти цитируемый пост)
ни у кого никаких соображений нет по этому поводу? 

Это надо запускать проект и сидеть разбираться, на вебстранице может быть много всего и все может быть сделано очень по разному, а так не скажешь.


--------------------
Хочешь получить мудрый совет - читай подписи участников форумов.
Злой доктор Щасзаболит smile
PM   Вверх
Quietasice
Дата 18.4.2011, 09:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 19
Регистрация: 2.8.2009

Репутация: нет
Всего: нет



Проблема все еще актуальна. Кое-что выяснил: 
Контекстное меню больше не вызывается до обновления при нажатии левой кнопки мыши в области фрейма, а если клацать все время правую кнопку мыши, тогда все норм, не нужно дожидаться следующего обновления фрейма, почему так? :(
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
mr.DUDA
THandle

Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов.
Что делать если Вам помогли, но отблагодарить помощника плюсом в репутацию Вы не можете(не хватает сообщений)? Пишите сюда, или отправляйте репорт. Поставим :)
Так же не забывайте отмечать свой вопрос решенным, если он таковым является :)


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, mr.DUDA, THandle.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Разработка Windows Forms | Следующая тема »


 




[ Время генерации скрипта: 0.0590 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.