CefSharp _JS-C#互相調用學習筆記


一 其他

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
})();
  1. 第一個是匿名功能,其詞匯范圍封閉在分組操作員內。這可以防止在 IIFE 成語中訪問變量,並污染全球范圍。()
  2. 第二部分創建立即調用的函數表達,通過該表達式,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

給函數傳參,第一個參數是對象,剩下的是參數。

img

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. 1通過Native Chromium IPC (進程間通訊)在瀏覽器進程和渲染進程傳遞消息

    1.2 返回值是簡單對象,類, 結構體,只有屬性的副本被轉到JS中

    1.3 方法名被轉換成開頭小寫,CamelCase格式

2 在JS中綁定一個異步對象

CefSharp.BindObjectAsync 提供一個Promise JS 綁定,按名稱綁定

  1. 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

https://github.com/tiancai4652/CefSahrp_Test


免責聲明!

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



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