先從後端代碼 如何執行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);
}
};
大道三千,條條皆可證道。道心不可失。