一 其他
1 通過指定uri指定body (KnowledgeBase項目)
public static void RegisterTestResources(IWebBrowser browser)
{
var factory = browser.ResourceHandlerFactory;
if (factory != null)
{
const string responseBody =
"<html>"
+ "<body><h1>About</h1>"
+ "<p>This sample application implements a <b>ResourceHandler</b> "
+ "which can be used to fullfil custom network requests as explained here:"
+ "<a href=\"http://www.codeproject.com/Articles/881315/Display-HTML-in-WPF-and-CefSharp-Tutorial-Part 2\">http://www.codeproject.com/Articles/881315/Display-HTML-in-WPF-and-CefSharp-Tutorial-Part 2</a>"
+ ".</p>"
+ "<hr/><p>This sample is based on CefSharp <b>39.0.0</b></p>"
+ "<hr/>"
+ "<p>See also CefSharp on GitHub: <a href=\"https://github.com/cefsharp\">https://github.com/cefsharp</a><br/>"
+ "<p>and Cef at Google: <a href=\"https://code.google.com/p/chromiumembedded/wiki/GeneralUsage#Request_Handling\">https://code.google.com/p/chromiumembedded/wiki/GeneralUsage#Request_Handling</a>"
+ "</body></html>";
factory.RegisterHandler(TestResourceUrl, ResourceHandler.FromString(responseBody));
const string unicodeResponseBody = "<html><body>整體滿意度</body></html>";
factory.RegisterHandler(TestUnicodeResourceUrl, ResourceHandler.FromString(unicodeResponseBody));
}
}
2 通過指定Uri展示markdown頁面(MarkdownSharp)
3 Brower與frame關系
var frame= Browser.GetFocusedFrame();
var frame1 = Browser.GetMainFrame();
二 C#調用JS
1 JS必須在V8Context下執行
可以通過一下代碼來判斷:
browser.RenderProcessMessageHandler = new RenderProcessMessageHandler();
public class RenderProcessMessageHandler : IRenderProcessMessageHandler
{
// Wait for the underlying JavaScript Context to be created. This is only called for the main frame.
// If the page has no JavaScript, no context will be created.
void IRenderProcessMessageHandler.OnContextCreated(IWebBrowser browserControl, IBrowser browser, IFrame frame)
{
const string script = "document.addEventListener('DOMContentLoaded', function(){ alert('DomLoaded'); });";
frame.ExecuteJavaScriptAsync(script);
}
}
2 調用Void JS
const string script = "document.addEventListener('DOMContentLoaded', function(){ alert('DomLoaded'); });";
frame.ExecuteJavaScriptAsync(script);
3 調用帶返回值的JS
browser.EvaluateScriptAsync(script)
frame.EvaluateScriptAsync(script);
browser.EvaluateScriptAsPromiseAsync(script);
//An extension method that evaluates JavaScript against the main frame.
Task<JavascriptResponse> response = await browser.EvaluateScriptAsync(script);
//Evaluate javascript directly against a frame
Task<JavascriptResponse> response = await frame.EvaluateScriptAsync(script);
//An extension method that evaluates Javascript Promise against the main frame.
//Uses Promise.resolve to return the script execution into a promise regardless of the return type
//This method differs from EvaluateScriptAsync in that your script **must return** a value
//Examples below
Task<JavascriptResponse> response = await browser.EvaluateScriptAsPromiseAsync(script);
4 JS-IIFE
(function () {
statements
})();
- 第一個是匿名功能,其詞匯范圍封閉在
分組操作員
內。這可以防止在 IIFE 成語中訪問變量,並污染全球范圍。()
- 第二部分創建立即調用的函數表達,通過該表達式,JavaScript 引擎將直接解釋該函數。
()
5 JS- Promise
Promise 對象代表了未來將要發生的事件,用來傳遞異步操作的消息。
1、對象的狀態不受外界影響。Promise 對象代表一個異步操作,有三種狀態:
- pending: 初始狀態,不是成功或失敗狀態。
- fulfilled: 意味着操作成功完成。
- rejected: 意味着操作失敗。
2、一旦狀態改變,就不會再變,任何時候都可以得到這個結果。Promise 對象的狀態改變,只有兩種可能:從 Pending 變為 Resolved 和從 Pending 變為 Rejected。只要這兩種情況發生,狀態就凝固了,不會再變了,會一直保持這個結果。
6 JS setTimeout
setTimeout() 是屬於 window 的方法,該方法用於在指定的毫秒數后調用函數或計算表達式。
語法格式可以是以下兩種:
setTimeout(要執行的代碼, 等待的毫秒數)
setTimeout(JavaScript 函數, 等待的毫秒數)
7 JS bind
給函數傳參,第一個參數是對象,剩下的是參數。
obj.myFun.call(db,'成都','上海'); // 德瑪 年齡 99 來自 成都去往上海
obj.myFun.apply(db,['成都','上海']); // 德瑪 年齡 99 來自 成都去往上海
obj.myFun.bind(db,'成都','上海')(); // 德瑪 年齡 99 來自 成都去往上海
obj.myFun.bind(db,['成都','上海'])(); // 德瑪 年齡 99 來自 成都, 上海去往 undefined
8 JS Array.from
**Array.from()**
方法從一個類似數組或可迭代對象創建一個新的,淺拷貝的數組實例。
三 JS調用C#
1 總結
-
1通過Native Chromium IPC (進程間通訊)在瀏覽器進程和渲染進程傳遞消息
1.2 返回值是簡單對象,類, 結構體,只有屬性的副本被轉到JS中
1.3 方法名被轉換成開頭小寫,CamelCase格式
2 在JS中綁定一個異步對象
CefSharp.BindObjectAsync 提供一個Promise JS 綁定,按名稱綁定
-
1步驟
1 創建一個想要暴露給JS的類
2 創建一個類型實例並用JavaScriptObjectRepository綁定(兩種方式,第一種立即注冊,第二種在使用的時候才注冊)
//For async object registration (equivalent to the old RegisterAsyncJsObject)
Browser.JavascriptObjectRepository.Register("boundAsync", new BoundObject(), BindingOptions.DefaultBinder);
//注冊成功通知
Browser.JavascriptObjectRepository.ObjectBoundInJavascript += (sender, e) =>
{
var name = e.ObjectName;Debug.WriteLine($"Object {e.ObjectName} was bound successfully."); };
3 調用 CefSharp.BindObjectAsync 並用一個名稱去注冊
private async void Button_Click_13(object sender, RoutedEventArgs e) { const string script = @"(async function() { await CefSharp.BindObjectAsync('boundAsync'); //The default is to camel case method names (the first letter of the method name is changed to lowercase) boundAsync.add(16, 2).then(function(actualResult) { const expectedResult = 18; alert(actualResult); }); })();"; var javascriptResponse = await Browser.EvaluateScriptAsync(script); dynamic result = javascriptResponse.Result; }
4 只可以綁定方法,如果想綁定屬性,可以用get,set方法
四 Demo