我的C#应用程序中有一个WebBrowser
控件。web浏览器在用户的控制之下,也就是说,他可以加载他的计算机可以在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代码,或者至少是参数中的函数名,那就更好了。
编辑:
即使问题与wb浏览器组件有关,任何允许用户检测javascript激活(甚至通过js)的东西都是可以的,能够注入处理javascript事件并将其传递给wb控件的js,从而触发它可以处理的一些事件。
发布于 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,因为不需要它):
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示例(运行它,不要忘记控制台):JS Bin Example
发布于 2012-10-08 22:25:26
好的,krishna回答的是纯javascript附加到事件,但是我看到你可能需要将它附加到所有标签(a,p,div,input)等,以及附加到每个标签的所有事件。
我认为另一种方法是尝试使用.net中的BHO(浏览器辅助对象),如果不是这样,并且您擅长VC++和MFC,那么您也可以尝试使用Windows Hooks。
https://stackoverflow.com/questions/9567715
复制相似问题