私はC#WPFを学んでいて、CefSharpが正常に実装されています。これは、CefSharpにロードされているjavascriptから.NET関数を呼び出す方法ですか?
以下の例:
public class CallbackObjectForJs{
public void showMessage(string msg){//Read Note
MessageBox.Show(msg);
}
}
WebView webView = new WebView("http://localhost:8080");
webView.RegisterJsObject("callbackObj", new CallbackObjectForJs());
フロントエンドのJavaScriptコード:
<script type="text/javascript">
callbackObj.showMessage('message from js');
</script >
注:最初の文字は、CallbackObjectForJsのshowMessageメソッドの上に置くことはできません
63.0.0
で始まるChromium
の変更により、Javascript Binding
に大きな変更があります。従来の動作は、Single Page Applications
でも機能し、単一のドメインのみが使用されます。
新しいバインド方法には多くの利点があります。
簡単な例:
public class BoundObject {
public void showMessage(string msg) {
MessageBox.Show(msg);
}
}
browser.JavascriptObjectRepository.Register("boundAsync", new BoundObject(), true);
<script type="text/javascript">
(async function() {
await CefSharp.BindObjectAsync("boundAsync", "bound");
boundAsync.showMessage('Message from JS');
})();
</script>
詳細については、 Javascript Binding v2#2246 および 。NETクラスをJavaScriptにどのように公開しますか? をご覧ください。
クロスサイトナビゲーションを実行すると、このメソッドを使用してオブジェクトをバインドできなくなります。
最初のオブジェクト(RegisterAsyncJsObject
)を登録する前に、CefSharpSettings.LegacyJavascriptBindingEnabled = true
を設定する必要があります。
簡単な例:
public class BoundObject {
public void showMessage(string msg) {
MessageBox.Show(msg);
}
}
CefSharpSettings.LegacyJavascriptBindingEnabled = true;
browser.RegisterAsyncJsObject("boundAsync", new BoundAsyncObject());
<script type="text/javascript">
boundAsync.showMessage('Message from JS');
</script>
詳細については、 Javascript Binding v2#2246 および 。NETクラスをJavaScriptにどのように公開しますか? をご覧ください。
まず、以下のようにC#でパブリッククラスを作成します。
public class cShaarp_Js
{
public void calledFromJs(Object object){}
}
次に、このクラスをchromeBrowserに登録する必要があります。
chromeBrowser = new ChromiumWebBrowser("file:///C:/sample.html");
chromeBrowser.RegisterJsObject("csharp", new cShaarp_Js);
これでC#が完成しました。 javascriptの反対側では、以下のようにこのクラスへのコールバックを作成できます。
function cSharpMetodCall(){csharp.calledFromJs(object);}