프로그래밍/c#

c# 에서 javascript 바인딩하는 방법2

소행성왕자 2020. 10. 6. 14:53

 

결과를 반환하는 JavaScript 메소드 호출

참고

https://github.com/cefsharp/CefSharp/wiki/General-Usage#javascript-integration

https://stackoverrun.com/ko/q/9144245

다음중 하나를 사용하시면 됩니다.

//메인 프레임에 대해 JavaScript를 평가하는 확장 메서드입니다.

Task<JavascriptResponse> response = await browser.EvaluateScriptAsync(script);

​

//프레임에 대해 직접 자바 스크립트 실행

Task<JavascriptResponse> response = await frame.EvaluateScriptAsync(script);

JavaScript 코드는 비동기 적으로 실행되며 Task<JavascriptResponse>오류 메시지, 결과 및 성공 ( bool) 플래그 를 포함하는 반환 됩니다.

평가할 때 알아야 할 JavaScript 기본 사항은 다음과 같습니다.

.javascript 실행은 V8Context 내에서만 실행할수 있습니다.

.스크립트는 프레임 수준에서 실행되며 모든 페이지에는 하나 이상의 프레임 ( MainFrame)이 있습니다.

.프레임에 JavaScript가 포함되어 있지 않으면 V8Context생성 되지 않습니다

.프레임이 로드 된 후 스크립트를 실행하는 컨텍스트가 없는 프레임의 경우를 사용하여 V8Context를 생성 할 수 있습니다 IFrame.ExecuteJavaScriptAsync

.스크립트는 렌더링 프로세스에서 실행되며를 통해 전송되며 IPC성능상의 이유로 필요한 데이터 만 반환합니다.

.기본 데이터 유형 int, double, date, bool 및 string이 지원됩니다.

.객체가 어느 정도 지원하고 반환됩니다 IDictionary<string, object>,의 사용 dynamic키워드는 쉽게 속성 값을 액세스 할 수 있도록 지원합니다.

.위에 나열된 기본 요소와 객체를 포함하는 배열이 지원되며 IList<object>.Array LikeHTMLCollection 과 같은 객체 는 직접 반환 할 수 없습니다. Array.from 을 사용 하여 반환하고 배열합니다.

.반환 할 수있는 개체 그래프의 복잡성에는 제한이 있습니다.

이러한 경우 JavaScript JSON.toStringify()메서드 를 사용하여 JavaScript 개체를 JSON 문자열로 변환하고 해당 문자열을 .NET 코드로 반환해야 할 수 있습니다.

그런 다음 JSON.NET과 같은 것을 사용하여 해당 문자열을 .NET 개체로 디코딩 할 수 있습니다. 자세한 내용은이 MSDN 링크를 참조하십시오.

( https://msdn.microsoft.com/en-us/library/ie/cc836459(v=vs.94).aspx )

frame_load_finish();

​

/**

*

* MainFrame 로드를 완료 할 때까지 기다립니다.

*

*/

private void frame_load_finish()

{

   // MainFrame이로드를 완료 할 때까지 기다립니다.

   browser.FrameLoadEnd += (sender, args) =>

   {

       //Wait for the MainFrame to finish loading

       if (args.Frame.IsMain)

       {

           args.Frame.ExecuteJavaScriptAsync("alert('MainFrame finished loading');");

           browser.ExecuteScriptAsync("document.body.style.background = 'blue';");

           browser.ExecuteScriptAsync("aa();");

​

           Task task = new Task(() => {

               //object js = EvaluateScript(browser, "document.getElementsByTagName('html')[0].innerHTML;");

               object js = EvaluateScript(browser, "bb();");

               MessageBox.Show(js.ToString());

           });

           task.Start();

​

           

       }

   };

}

​

​

static object EvaluateScript(ChromiumWebBrowser b, string script)

{

   var task = b.EvaluateScriptAsync(script);

   task.Wait();

   JavascriptResponse response = task.Result;

   return response.Success ? (response.Result ?? "") : response.Message;

}

​

​

웹페이지 javascript

<script>

function bb() {

   return "bbbbbbbb";

}

</script>

​​