[聚合文章] NanUI文档 - 如何实现C#与Javascript的相互通信

.Net 2018-01-12 24 阅读

NanUI文档目录

如何实现C#与Javascript的相互通信

通过之前的文章,相信您已经对NanUI有了初步的了解。但到目前为止,我们使用NanUI仅仅只是作为呈现HTML界面的容器,并未涉及CEF与C#间数据的交互。那么本文将简单介绍如何在NanUI中使用C#调用Javascript的函数以及如何在Javascript注入C#的对象、属性和方法。

C#调用Javascript函数

不需要获取返回值的情况

假设页面中有如下Javascript的函数sayHello,它的作用是在DOM中创建一个包含有“Hello NanUI!”字样的p元素。

function sayHello() {    var p = document.createElement("p");    p.innerText = "Hello NanUI!";    var container = document.getElementById("hello-container");    container.appendChild(p);}

示例中,该函数并没有在Javascript环境里调用,而是在页面加载完成后使用NanUI的ExecuteJavascript方法来调用它。ExecuteJavascript方法执行的返回结果为一个bool类型,它指示了这次有没有成功执行。

在窗体的构造函数中,通过注册Formium的LoadHandler中的OnLoadEnd事件来监测页面加载完成的情况,并在页面加载成功后调用JS环境中的函数sayHello。

namespace CommunicateBetweenJsAndCSharp{    using NetDimension.NanUI;    public partial class Form1 : Formium    {        public Form1()            : base("http://res.app.local/www/index.html",false)        {            InitializeComponent();            LoadHandler.OnLoadEnd += LoadHandler_OnLoadEnd;        }        private void LoadHandler_OnLoadEnd(object sender, Chromium.Event.CfxOnLoadEndEventArgs e)        {            // Check if it is the main frame when page has loaded.            if(e.Frame.IsMain)            {                ExecuteJavascript("sayHello()");            }        }    }}

运行后,可以看到界面中显示了“Hello NanUI!”字样,说明使用ExecuteJavascript能够调用JS函数。


需要获取返回值的情况

上面的例子中通过ExecuteJavascript方法来成功调用了JS环境中的函数。但不难发现,这种调用方式C#是没有接收到任何返回值的。但实际的项目里,我们是需要从JS环境获取到返回值的,这时候使用ExecuteJavascript将不能满足需求,使用另外一个方法EvaluateJavascript可以帮助我们从JS环境中获得JS函数的返回值。

假如有另外一个Javascript函数sayHelloToSomeone,它能接收一个字符传参数,在函数体中拼接并返回拼接后的字符串。

function sayHelloToSomeone(who) {    return "Hello " + who + "!";}

同样的,在上面例子LoadHandler的OnLoadEnd事件中我们来执行sayHelloToSomeone,并通过C#传递参数并获取拼接后的返回值。EvaluateJavascript方法通过一个回调Action来获取JS环境中的返回值。这个Action有两个参数,第一个是返回值的集合,第二个是JS环境的异常对象,如果函数正确执行,那么第二个参数为null

namespace CommunicateBetweenJsAndCSharp{    using NetDimension.NanUI;    public partial class Form1 : Formium    {        public Form1()            : base("http://res.app.local/www/index.html",false)        {            InitializeComponent();            LoadHandler.OnLoadEnd += LoadHandler_OnLoadEnd;        }        private void LoadHandler_OnLoadEnd(object sender, Chromium.Event.CfxOnLoadEndEventArgs e)        {            // Check if it is the main frame when page has loaded.            if(e.Frame.IsMain)            {                EvaluateJavascript("sayHelloToSomeone('C#')", (value, exception) =>                {                    if(value.IsString)                    {                        // Get value from Javascript.                        var jsValue = value.StringValue;                        MessageBox.Show(jsValue);                    }
                

注:本文内容来自互联网,旨在为开发者提供分享、交流的平台。如有涉及文章版权等事宜,请你联系站长进行处理。