首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何检测WebBrowser控件中的Javascript执行

如何检测WebBrowser控件中的Javascript执行
EN

Stack Overflow用户
提问于 2012-03-05 21:48:38
回答 2查看 11K关注 0票数 16

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

我需要知道并在web浏览器组件中加载的页面内存在Javascript调用时得到通知。

第一个示例:给定一个如下所示的链接

代码语言:javascript
复制
<a href="javascript:void(0)" onclick="jsFunct();">test</a>

当用户单击链接时,我需要知道函数"jsFunct“已被调用。

第二个示例:给定一个调用,如下所示

代码语言:javascript
复制
<script type="text/javascript">
    window.setTimeout("jsFunct()", 1000);
</script>

我需要知道,在脚本执行后1秒,函数jsFunct已被调用。

最好的做法是在调用函数时触发一个事件。如果事件可以执行Javascript代码,或者至少是参数中的函数名,那就更好了。

编辑:

即使问题与wb浏览器组件有关,任何允许用户检测javascript激活(甚至通过js)的东西都是可以的,能够注入处理javascript事件并将其传递给wb控件的js,从而触发它可以处理的一些事件。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-10-12 16:51:39

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

您需要设置ObjectForScripting:Webbrowser control's window.external is ALWAYS null.才能使其正常工作。

接受@Krishna的回答来添加JavaScript (但删除jQuery,因为不需要它):

代码语言:javascript
复制
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)将查找所有全局函数并附加您指定的处理程序:

代码语言:javascript
复制
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示例(运行它,不要忘记控制台):JS Bin Example

票数 8
EN

Stack Overflow用户

发布于 2012-10-08 22:25:26

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

我认为另一种方法是尝试使用.net中的BHO(浏览器辅助对象),如果不是这样,并且您擅长VC++和MFC,那么您也可以尝试使用Windows Hooks。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9567715

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档