为什么CefSharp.PostMessage在CefSharp浏览器中不起作用?



我尝试使用c#中的JavascriptMessageReceived事件来处理浏览器中从JS调用的CefSharp.PostMessage。我甚至从链接下载了一个这样工作的例子。运行了一个示例,它本应该做我需要的事情,但它不起作用,我的代码也不起作用(如下(。CefSharp是否删除或更改了此功能?我需要在CefSettings或ChromiumWebBrowser中启用此功能吗?

using CefSharp;
using CefSharp.WinForms;
public ChromiumWebBrowser chromeBrowser;
public Form1()
{
InitializeComponent();
string curDir = Directory.GetCurrentDirectory();
CefSettings settings = new CefSettings();
Cef.Initialize(settings);
chromeBrowser = new ChromiumWebBrowser(String.Format("file:///{0}/HelloWorld.html", curDir));
chromeBrowser.JavascriptMessageReceived += ChromeBrowser_JavascriptMessageReceived;
}
private void ChromeBrowser_JavascriptMessageReceived(object sender, JavascriptMessageReceivedEventArgs e)
{
MessageBox.Show((string)e.Message);
}

HelloWorld.html此处

<!DOCTYPE html>
<html>
<body>
<script>
CefSharp.PostMessage("Hello world!");
</script>
</body>
</html>
  1. CefSharp.PostMessage("Hello world!");是2020的一个全新JS扩展。确保您使用的是真正的头孢夏普
  2. chromeBrowser = new ChromiumWebBrowser(String.Format("file:///{0}/HelloWorld.html", curDir));
    chromeBrowser.JavascriptMessageReceived += ChromeBrowser_JavascriptMessageReceived;
    
    JavascriptMessageReceived事件的订阅太晚了,页面可能会被下载,JS可能会被执行到那一刻。您应该在页面加载之前订阅事件。
    chromeBrowser = new ChromiumWebBrowser("about:blank");
    chromeBrowser.JavascriptMessageReceived += ChromeBrowser_JavascriptMessageReceived;
    chromeBrowser.Load(String.Format("file:///{0}/HelloWorld.html", curDir));
    
  3. 确保HelloWorld.html存在于应用程序当前的工作目录中

您将ChromiumWebBrowser添加到表单的何处?WinForms ChromiumWebBrowser控件在创建句柄之前不会加载,默认情况下,当它添加到父控件时会发生这种情况。

chromeBrowser = new ChromiumWebBrowser(String.Format("file:///{0}/HelloWorld.html", curDir));
chromeBrowser.JavascriptMessageReceived += ChromeBrowser_JavascriptMessageReceived;
Controls.Add(chromeBrowser);

最新更新