Javascript 如何从该方法内部识别为window.external.method调用的web浏览器控件实例?
我可以请你帮忙吗 我在表单上有一组web浏览器控件。 所有web浏览器都设置为webBrowser.ObjectForScript=this; 因此,所有脚本调用都在表单的代码中进行管理 我在代码中说:Javascript 如何从该方法内部识别为window.external.method调用的web浏览器控件实例?,javascript,c#,winforms,controls,webbrowser-control,Javascript,C#,Winforms,Controls,Webbrowser Control,我可以请你帮忙吗 我在表单上有一组web浏览器控件。 所有web浏览器都设置为webBrowser.ObjectForScript=this; 因此,所有脚本调用都在表单的代码中进行管理 我在代码中说: public void Method1(string title) { WebBrowser wb = (WebBrowser)some-object; MessageBox.Show(title + wb.Url.ToString()); } 如果通过JavaScript
public void Method1(string title)
{
WebBrowser wb = (WebBrowser)some-object;
MessageBox.Show(title + wb.Url.ToString());
}
如果通过JavaScript从一个web浏览器控件调用此方法,如何获取调用此方法的web浏览器实例(某些对象):
<script>
window.external.Method1('Hello');
</script>
window.external.Method1('Hello');
谢谢 我看到了一些常见的选项:
[ComVisible(true)]
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void Form1_Load(object sender, EventArgs e)
{
var txt =
@"<html>" +
@"<body>" +
@"<a href=""#"" " +
@"onclick=""window.external.Method1(this, 'Hello');"">" +
@"Click here.</a>" +
@"</body>" +
@"</html>";
webBrowser1.ObjectForScripting = this;
webBrowser2.ObjectForScripting = this;
webBrowser1.DocumentText = txt;
webBrowser2.DocumentText = txt;
webBrowser1.Document.Window.Name = webBrowser1.Name;
webBrowser2.Document.Window.Name = webBrowser2.Name;
}
public void Method1(object sender, string s)
{
//sender is the anchor element
dynamic window = ((dynamic)((dynamic)sender).document).defaultView;
var windowName = window.Name;
var control = this.Controls.Find(windowName, true);
MessageBox.Show(s);
}
}
[ComVisible(true)]
公共部分类Form1:Form
{
公共表格1()
{
初始化组件();
}
私有void Form1\u加载(对象发送方、事件参数e)
{
var txt=
@"" +
@"" +
@"" +
@"" +
@"";
webBrowser1.ObjectForScript=此;
webBrowser2.ObjectForScript=此;
webBrowser1.DocumentText=txt;
webBrowser2.DocumentText=txt;
webBrowser1.Document.Window.Name=webBrowser1.Name;
webBrowser2.Document.Window.Name=webBrowser2.Name;
}
public void Method1(对象发送方,字符串s)
{
//发送方是锚元素
动态窗口=((动态)((动态)发件人).document.defaultView;
var windowName=window.Name;
var control=this.Controls.Find(windowName,true);
MessageBox.Show(s);
}
}
示例2-被呼叫方知道呼叫方
private void Form1_Load(object sender, EventArgs e)
{
var txt =
@"<html>" +
@"<body>" +
@"<a href=""#"" " +
@"onclick=""window.external.Method1('Hello');"">" +
@"Click here.</a>" +
@"</body>" +
@"</html>";
webBrowser1.ObjectForScripting = new ScriptingObject(webBrowser1);
webBrowser2.ObjectForScripting = new ScriptingObject(webBrowser2);
webBrowser1.DocumentText = txt;
webBrowser2.DocumentText = txt;
}
[ComVisible(true)]
public class ScriptingObject
{
WebBrowser webBrowser;
public ScriptingObject(WebBrowser w)
{
webBrowser = w;
}
public void Method1( string s)
{
//This class knows which `WebBrowser` control calls its methods.
MessageBox.Show(s);
}
}
private void Form1\u加载(对象发送方,事件参数e)
{
var txt=
@"" +
@"" +
@"" +
@"" +
@"";
webBrowser1.ObjectForScript=新脚本对象(webBrowser1);
webBrowser2.ObjectForScript=新脚本对象(webBrowser2);
webBrowser1.DocumentText=txt;
webBrowser2.DocumentText=txt;
}
[ComVisible(true)]
公共类脚本对象
{
网络浏览器;
公共脚本对象(WebBrowser w)
{
webBrowser=w;
}
公共无效方法1(字符串s)
{
//此类知道哪个“WebBrowser”控件调用其方法。
MessageBox.Show(s);
}
}
也许,使用一个特殊类的列表,您将WebBrowser实例传递给它,它必须在其构造函数中处理该实例?谢谢。第一种方法不起作用,因为JS部分有可能会通过其他方法,但“这”是不允许JS方进行虚假调用的关键。第二种方法很好:)实现了-效果很好。不得不重写一些代码,但值得。谢谢。唯一需要发布的重要资源是web浏览器控件,它将在处理时发布。我看不到ScriptingObject需要任何特定的资源处理。太好了。非常感谢。