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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM