Как обнаружить выполнение Javascript в элементе управления WebBrowser - программирование
Подтвердить что ты не робот

Как обнаружить выполнение Javascript в элементе управления WebBrowser

У меня есть элемент управления WebBrowser в моем приложении С#. Веб-браузер находится под контролем пользователя, то есть он может загружать любую веб-страницу, к которой его компьютер имеет доступ в Интернете (конечно, ограниченный прокси, файлом hosts и т.д.).

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

Первый пример: приведена такая ссылка

<a href="javascript:void(0)" onclick="jsFunct();">test</a>

Когда пользователь нажимает на ссылку, мне нужно знать, что была вызвана функция "jsFunct".

Второй пример: дан вызов как

<script type="text/javascript">
    window.setTimeout("jsFunct()", 1000);
</script>

Мне нужно знать, что через 1 секунду после выполнения скрипта была вызвана функция jsFunct.

Лучше всего было бы запускать событие при вызове функции. Также было бы здорово, если бы событие могло привести к выполнению кода Javascript или хотя бы имени функции в аргументах.

РЕДАКТИРОВАТЬ:

Даже если вопрос связан с компонентом webbrowser, все, что позволяет пользователю обнаруживать активацию javascript (даже через js), подойдет, если он сможет внедрить js, который обрабатывает событие javascript и передает его в элемент управления wb, вызывающий какое-либо событие что он может справиться.

4b9b3361

Ответ 1

Вы можете использовать window.external для вызова метода С#, когда глобальная функция запускается в JavaScript. Подробнее о window.external см. Обзор управления WebBrowser.

Вам нужно будет установить ObjectForScripting: окно управления Webbrowser window.external ВСЕГДА null., чтобы это работало.

Возьмите @Krishna ответ, чтобы добавить JavaScript (но отпустите jQuery, потому что он не понадобится):

private void addScript(HtmlElement head, string scriptSource) 
{ 
HtmlElement lhe_script = head.Document.CreateElement("script"); 
IHTMLScriptElement script = (IHTMLScriptElement)lhe_script.DomElement; 
script.src = scriptSource;
head.AppendChild(lhe_script);            
} 

addScript(WebBrowser.Head, @"InjectMonitor.js");

JavaScript ниже (InjectMonitor.js) найдет все глобальные функции и добавит ваш обработчик:

function augment(withFn) {
    var name, fn;
    for (name in window) {
        fn = window[name];
        if (typeof fn === 'function') {
            window[name] = (function(name, fn) {
                var args = arguments;
                return function() {
                    withFn.apply(this, args);
                    fn.apply(this, arguments);

                };
            })(name, fn);
        }
    }
}

augment(function(name, fn) {
    console.log("calling " + name, fn);

    // window.external.yourC#method
});

В этом примере, взятом из Добавление журнала консоли для каждой функции, он просто регистрирует вызов на консоль; но с помощью window.external вы можете отправить некоторое сообщение обратно в свое приложение С# с подробной информацией о том, какая функция была вызвана от клиента.

Наконец, вот пример JS Bin (запустите его и не забудьте консоль): Пример JS Bin

Ответ 2

В событии загрузки веб-браузера

  • Вставить JQuery
  • Скрипты Inject Monitor

private void addScript(HtmlElement head, string scriptSource) 
{ 
HtmlElement lhe_script = head.Document.CreateElement("script"); 
IHTMLScriptElement script = (IHTMLScriptElement)lhe_script.DomElement; 
script.src = scriptSource;
head.AppendChild(lhe_script);            
} 

addScript(Webbrowser.Head, @"<Change File Path here>jquery.min.js");
addScript(WebBrowser.Head, @"InjectMonitor.js");

ваш файл InjectMonitor.js должен быть чем-то вроде этого

 $(document).ready(function () { 
        //Add click event for every anchor on the page loaded- note this merely alerts text on click. you can however add your own function
        $("a").click(function (e) { alert($(this).text()); return false;}) 
    }); 

Ответ 3

Хорошо, что кришна ответил, это промежутки чистого javascript, связанные с событиями, однако я вижу, что вам может понадобиться прикрепить его ко всем тегам (a, p, div, input) и т.д. и ко всем событиям, прикрепленным к каждому тегу.

Я считаю, что другой способ - поиграть с BHO (вспомогательным объектом браузера), доступным для вашего в .net, а если нет, и вы хорошо разбираетесь в VС++ и MFC, вы также можете играть с Windows Hooks.