Gab*_*ber 16 javascript c# browser webbrowser-control dom-events
我WebBrowser在C#应用程序中有一个控件.webbrowser在用户的控制之下,也就是说,他可以加载他的计算机可以在Web上访问的任何网页(当然受限于代理,主机文件等).
我需要知道并在webbrowser组件中加载的页面内有javascript调用时收到通知.
第一个例子:给出这样的链接
<a href="javascript:void(0)" onclick="jsFunct();">test</a>
Run Code Online (Sandbox Code Playgroud)
当用户点击链接时,我需要知道已经调用了函数"jsFunct".
第二个例子:给出一个叫的话
<script type="text/javascript">
window.setTimeout("jsFunct()", 1000);
</script>
Run Code Online (Sandbox Code Playgroud)
我需要知道,在执行脚本1秒后,调用了函数jsFunct.
最好的方法是在调用函数时触发事件.如果事件可以执行javascript代码,或者至少是参数中的函数名称,那也会很棒.
编辑:
即使问题与webbrowser组件有关,任何允许用户检测javascript激活(甚至通过js)的东西也没关系,能够注入处理javascript事件的js并将其传递给触发某些事件的wb控件它可以处理.
在webbrowser加载事件中,
,
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");
Run Code Online (Sandbox Code Playgroud)
你的文件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;})
});
Run Code Online (Sandbox Code Playgroud)
window.external在JavaScript中触发全局函数时,可以使用它来调用C#方法.有关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");
Run Code Online (Sandbox Code Playgroud)
下面的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
});
Run Code Online (Sandbox Code Playgroud)
在此示例中,从添加控制台日志到每个功能,它只是将呼叫记录到控制台; 但是使用window.external,您可以将一些消息发送回您的C#应用程序,其中包含从客户端调用的函数的详细信息.
最后,这是一个JS Bin示例(运行它并且不要忘记控制台): JS Bin示例