【问题标题】:Call .Net from javascript in CefSharp 1 - wpf从 CefSharp 1 中的 javascript 调用 .Net - wpf
【发布时间】:2014-06-18 22:56:49
【问题描述】:

我刚刚学习C# WPF,已经成功实现了CefSharp,如何从CefSharp中加载的javascript调用.NET函数?

【问题讨论】:

    标签: javascript c# cefsharp


    【解决方案1】:
    1. 通过 WebView 构造 WebView webView = new WebView(url)
    2. 然后就可以调用RegisterJsObject方法注册一个js对象了。
    3. 使用javascript调用这个js对象。

    示例如下:

    public class CallbackObjectForJs{
        public void showMessage(string msg){//Read Note
            MessageBox.Show(msg);
        }
    }
    
    WebView webView = new WebView("http://localhost:8080");
    webView.RegisterJsObject("callbackObj", new CallbackObjectForJs());
    

    前端的javascript代码:

    <script type="text/javascript">
        callbackObj.showMessage('message from js');
    </script >
    

    注意:CallbackObjectForJs 的 showMessage 方法的第一个字符不能在上面

    【讨论】:

    • 未实现 CefSharp 33.0.0 中发生异常。任何人都知道这可能何时实施。下一个版本?
    • @CaptainBli 现在好像已移至Cef.RegisterJsObject
    【解决方案2】:

    首先在 C# 中创建一个公共类,如下所示:

    public class cShaarp_Js
    {
    public void calledFromJs(Object object){}
    }
    

    然后你应该将这个类注册到你的 chromeBrowser。

    chromeBrowser = new ChromiumWebBrowser("file:///C:/sample.html");
    chromeBrowser.RegisterJsObject("csharp", new cShaarp_Js);
    

    现在我们完成了 C#。在 javascript 的另一边,你可以创建一个回调到这个类,如下所示:

    function cSharpMetodCall(){csharp.calledFromJs(object);}
    

    【讨论】:

      【解决方案3】:

      由于Chromium 更改以63.0.0 开头,因此Javascript Binding 发生了重大更改。旧行为仍然适用于 Single Page Applications 并且仅使用单个域。

      新的绑定方法

      新的绑定方式有很多优点:

      • 按名称绑定和取消绑定对象
      • 将对象子集绑定到不同的页面(包括弹出窗口)
      • 删除/取消绑定方法
      • 动态解析绑定对象

      简单示例:

      public class BoundObject {
          public void showMessage(string msg) {
              MessageBox.Show(msg);
          }
      }
      
      browser.JavascriptObjectRepository.Register("boundAsync", new BoundObject(), true);
      

      <script type="text/javascript">
          (async function() {
              await CefSharp.BindObjectAsync("boundAsync", "bound");
      
              boundAsync.showMessage('Message from JS');
          })();
      </script>
      

      更多详情请访问Javascript Binding v2 #2246How do you expose a .NET class to JavaScript?

      旧版绑定

      如果您执行跨站点导航,您将无法再使用此方法绑定对象。

      您需要在注册第一个对象 (RegisterAsyncJsObject) 之前设置 CefSharpSettings.LegacyJavascriptBindingEnabled = true

      简单示例:

      public class BoundObject {
          public void showMessage(string msg) {
              MessageBox.Show(msg);
          }
      }
      
      CefSharpSettings.LegacyJavascriptBindingEnabled = true;
      browser.RegisterAsyncJsObject("boundAsync", new BoundAsyncObject());
      

      <script type="text/javascript">
          boundAsync.showMessage('Message from JS');
      </script>
      

      更多详情请访问Javascript Binding v2 #2246How do you expose a .NET class to JavaScript?

      【讨论】:

      • “新绑定方法”部分的绝佳答案。简单,晶莹剔透,像魅力一样工作:)
      猜你喜欢
      • 1970-01-01
      • 2017-12-04
      • 2013-06-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-01-01
      • 2015-11-10
      相关资源
      最近更新 更多