先從后端代碼 如何執行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);
}
};