Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/275.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何从该方法内部识别为window.external.method调用的web浏览器控件实例?_Javascript_C#_Winforms_Controls_Webbrowser Control - Fatal编程技术网

Javascript 如何从该方法内部识别为window.external.method调用的web浏览器控件实例?

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

我可以请你帮忙吗

我在表单上有一组web浏览器控件。 所有web浏览器都设置为webBrowser.ObjectForScript=this; 因此,所有脚本调用都在表单的代码中进行管理

我在代码中说:

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

谢谢

我看到了一些常见的选项:

  • 通常,来电者有责任向被来电者介绍自己
  • 当只有一个呼叫者可以呼叫时,被呼叫者知道它是呼叫者
  • 示例1-呼叫方自我介绍

    [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需要任何特定的资源处理。太好了。非常感谢。