天天看點

C# Cef winform 腳本的執行 踩過的坑

先從後端代碼 如何執行js 代碼談起;

一個簡單的需求: 在winform上點選一個按鈕,實作登入資訊的填入

流程: 就是讓C#去運作一段腳本,.

運作的方式有兩種, 異步與同步, 

因為CEF是一幀一幀運作的,所有需要指定這段js 在哪個frame 裡面運作

方法1: CefWebBrowser.GetBrowser().GetFrame("mem_index").ExecuteJavaScriptAsync("you js code")

執行腳本都是在 Frame 之下 執行的

方法2: e.Frame.ExecuteJavaScriptAsync("you js code")

CefWebBrowser.GetBrowser().GetFrame("mem_index").ExecuteJavaScriptAsync(a);

CefWebBrowser.ExecuteScriptAsync(a);

這兩者之間的差別是,操作的dom 對象不同, 面對不同的iframe 就有不同的 js 代碼執行,  并且,執行多行代碼時,就需要将多行代碼放在隻執行閉包函數裡面,(function(){ ..... })()  隻有這樣才成功執行。

// 在此進行區分

if (e.Url.Contains("/entrance/page/soya"))

{ // 登入頁面

//chromiumBrowser.("mem_index").EvaluateScriptAsync(Resources.loginjs);

chromiumBrowser.GetBrowser().GetFrame("mem_index").ExecuteJavaScriptAsync(Resources.loginjs);

// 多個架構之下,一定要指定名稱 來執行腳本

//chromiumBrowser.ExecuteScriptAsyncWhenPageLoaded(Resources.loginjs);

}

關于在前端注入對象

其他說明

以目前版本為準,注入C#類到WEB頁面中的方式有如下2種。

var _chromiumWebBrowser = new ChromiumWebBrowser();

// 反正你先初始化這玩意

// ...

// 1. 舊版本的注入方式,從後端到前端,官方不建議使用

CefSharpSettings.LegacyJavascriptBindingEnabled = true; //首先打開開關(老東西)

_chromiumWebBrowser.RegisterJsObject("testold", new TestClass());

// 2. 新版本的注入方式,從前端到後端,官方推薦,可用于多頁面

_chromiumWebBrowser.JavascriptObjectRepository.ResolveObject += (s, eve) =>

{

var repo = eve.ObjectRepository;

if (eve.ObjectName == "testnew") //這個名字對應頁面上 CefSharp.BindObjectAsync('testnew') 部分

{

repo.Register("testnew", new TestClass(), isAsync: true, options: BindingOptions.DefaultBinder);

}

};

大道三千,條條皆可證道。道心不可失。

cef
上一篇: CPU 的由來