如何使用GeckoFX作为XULRunner的包装器在javascript中调用C#方法

How*_*ard 5 javascript c# geckofx

我在我的项目中使用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;
    }
Run Code Online (Sandbox Code Playgroud)

javascript 部分:

<script type='text/javascript'>
    var data = window.loadData();
    alert(data);
</script>
Run Code Online (Sandbox Code Playgroud)

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

Ily*_*lya 7

重要更新:

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

var event = new MessageEvent('yourEventName', { 'view': window, 'bubbles': false, 'cancelable': false, 'data': 'some data' });
Run Code Online (Sandbox Code Playgroud)


Joh*_*ton 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);
}
Run Code Online (Sandbox Code Playgroud)

我知道这很尴尬,但你可以使用ac# - > javascript调用将数据恢复到javascript-land.有关如何操作,请参阅此问题.所以你的javascript会首先将此消息发送到c#land,然后它将获得一个带有你需要的字符串值的回调.

希望有所帮助.