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

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (26)

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

我需要知道并在浏览器组件中加载的页面内部发出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控件,从而触发某些事件它可以处理。

提问于
用户回答回答于

window.external当用JavaScript引发全局函数时,您可以使用它来调用C#方法。有关window.external的详细信息,请参阅WebBrowser控件概述

您需要设置ObjectForScripting:Webbrowser控件的window.external始终为空。为此工作。

添加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示例

用户回答回答于

在web浏览器加载事件中,

  1. 注入Jquery
  2. 注入监视器脚本

,

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;}) 
    }); 

扫码关注云+社区