6

我在我的项目中使用GeckoFX16xulrunner-16.0.2.en-US.win32。问题是,我想在 javascript 中调用 C# 方法。

我很好奇,有没有办法做到这一点?

就像下面这样:

C#部分:

private GeckoWebBrowser weBrowser;
    public browser()
    {
        InitializeComponent();
        Gecko.Xpcom.Initialize("xulrunner");
        weBrowser = new GeckoWebBrowser();
        weBrowser.Parent = this;
        weBrowser.Dock = DockStyle.Fill;
        weBrowser.Navigate("test.html");
    }

    public string loadData(){
        //load data from local file.
        return str;
    }

javascript部分:

<script type='text/javascript'>
    var data = window.loadData();
    alert(data);
</script>

我是这个领域的新手,如果可能的话,我会很感激!

4

3 回答 3

7

重要更新:

当前代码event.initMessageEvent不起作用,因为此结构已被替换

var event = new MessageEvent('yourEventName', { 'view': window, 'bubbles': false, 'cancelable': false, 'data': 'some data' });
于 2015-08-05T21:13:10.307 回答
6

您可以使用MessageEvent来调用 c# 中的代码,但据我所知,您不能像您想要的那样返回一个字符串。其中一个单元测试演示了如何调用 c# 代码:

[Test]
public void AddEventListener_JScriptFiresEvent_ListenerIsCalledWithMessage()
{
    string payload = null;

    browser.AddMessageEventListener("callMe", ((string p) => payload = p));

    browser.LoadHtml(
        @"<!DOCTYPE html>
                     <html><head>
                     <script type='text/javascript'>
                        window.onload= function() {
                            event = document.createEvent('MessageEvent');
                            var origin = window.location.protocol + '//' + window.location.host;
                            event.initMessageEvent ('callMe', true, true, 'some data', origin, 1234, window, null);
                            document.dispatchEvent (event);
                        }
                    </script>
                    </head><body></body></html>");

    browser.NavigateFinishedNotifier.BlockUntilNavigationFinished();
    Assert.AreEqual("some data", payload);
}

我知道这很尴尬,但是您可以使用 ac#-->javascript 调用将数据返回到 javascript-land。请参阅此问题以了解如何执行此操作。因此,您的 javascript 会首先将此消息发送到 c# 土地,然后它会收到带有您需要的字符串值的回调。

希望有帮助。

于 2013-03-31T01:28:35.737 回答
2

您可以将消息事件侦听器添加到 Web 浏览器并像这样调用您的方法:

private void load()
{
    browser.AddMessageEventListener("myFunction", ((string s) => this.showMessage(s)));
    browser.LoadHtml
    (
        @"<!DOCTYPE html>
          <html><head>                 
          <meta http-equiv=""Content-Type"" content=""text/html; charset=UTF-8"">
          <script type=""text/javascript"">
             function fireEvent(name, data)
             {
                event = document.createEvent('MessageEvent');
                event.initMessageEvent(name, false, false, data, null, null, null, null);
                document.dispatchEvent(event);
             }                        
          </script>
          </head>
          <body>
             <input type=""button"" onclick=""fireEvent('myFunction', 'some data');"" value=""SHOW DATA"" />
          </body></html>"
    );
}

...

private void showMessage(string s)
{
    MessageBox.Show(s);
}    

现在,您可以将更多 msg 事件添加到您的 msg 侦听器(如果需要)并以相同的方式触发它们。

于 2013-06-06T13:35:48.050 回答