简体   繁体   中英

How to call C# method in javascript by using GeckoFX as the wrapper of XULRunner

I am using GeckoFX16 and xulrunner-16.0.2.en-US.win32 in my project. The thing is, I want to call a C# method in javascript.

I am curious, is there a way to do this?

Just like below:

C# part:

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 part:

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

I am new in this area, I'll appreciate if it is possible!

Important update:

Currently code with event.initMessageEvent does not work because this construction has been replaced on

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

You can use a MessageEvent to invoke code in c#, but as far as I know you can't then return a string like you're wanting to. One of the unit tests demonstrates how to invoke the c# code:

[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);
}

I know it's awkward, but you could then use ac#-->javascript call to get data back to javascript-land. See This Question for how to do that. So your javascript would first send this message to c# land, then it would get a callback with the string value you need.

Hope that helps.

You can add message event listener to your web browser and call your method like this:

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

Now you can add more msg events to your msg listener (if you need to) and fire them all in the same way.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM