Как обнаружить выполнение Javascript в элементе управления WebBrowser - PullRequest
16 голосов
/ 05 марта 2012

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

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

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

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

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

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

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

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

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

EDIT:

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

Ответы [ 3 ]

8 голосов
/ 12 октября 2012

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

Вам необходимо установить ObjectForScripting: Окно веб-браузера для элемента управления. Внешнее ВСЕГДА равно null. , чтобы это работало.

Примите ответ @ Кришны, чтобы добавить 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, вы могли бы отправить некоторое сообщение обратно в ваше приложение C # с подробностями о том, какая функция была вызвана из клиента.

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

8 голосов
/ 16 марта 2012

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

  1. Ввод Jquery
  2. Сценарии 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;}) 
    }); 
1 голос
/ 08 октября 2012

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

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

...