Как обнаружить выполнение 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, вызывающий какое-либо событие что он может справиться.
Ответы
Ответ 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.