如何在WebBrowser控件中检测Javascript执行

时间:2012-03-05 13:48:38

标签: javascript c# browser webbrowser-control dom-events

我的C#应用​​程序中有一个WebBrowser控件。 Web浏览器由用户控制,也就是说,他可以加载他的计算机可以在Web上访问的任何网页(当然受代理,主机文件等限制)。

我需要知道并在网页浏览器组件中加载的页面内有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)的东西也没关系,能够注入处理javascript事件的js并将其传递给wb控件触发它可以处理的一些事件。

3 个答案:

答案 0 :(得分:8)

在webbrowser加载事件中,

  1. 注入Jquery
  2. 注入监控脚本
  3. 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 :(得分:8)

在JavaScript中触发全局函数时,可以使用window.external来调用C#方法。有关window.external的详细信息,请参阅WebBrowser Control Overview

您需要设置ObjectForScripting:Webbrowser control's window.external is ALWAYS 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
});

在此示例中,取自Adding Console Log to Every Function,它只是将呼叫记录到控制台;但是使用window.external,您可以将一些消息发送回您的C#应用​​程序,其中包含从客户端调用的函数的详细信息。

最后,这是一个JS Bin示例(运行它并且不要忘记控制台):JS Bin Example

答案 2 :(得分:1)

krishna所回答的是附加到事件的纯javascript的内容,但是我看到你可能需要将它附加到所有标签(a,p,div,input)等以及附加到每个标签的所有事件

我相信另一种方法是使用.net中可用的BHO(浏览器帮助对象),如果没有,你擅长VC ++和MFC,你也可以使用Windows Hooks。