CefSharp加载HTML

19

有人可以解释一下CefSharp的LoadHtml函数是如何工作的吗?

LoadHtml(string html, string url)

htmlurl 参数代表什么?

我想将一个原始的 HTML 字符串加载到 CefSharp 浏览器中,非常感兴趣。

3个回答

44
更新:CefSharp有一个新的LoadHtml(string html)方法,以base64编码的数据URI方式加载HTML。它比下面描述的LoadHtml(string html, string url)方法更可靠。
LoadHtml(string html, string url)中: html是您的HTML字符串,例如"<html><body>Hello world</body></html>"。实际上,您甚至可以把其他内容放在字符串中,如SVG标记,只要Chromium能够理解。 url是必需的,因为您的HTML代码可能包含尝试执行AJAX调用的JavaScript,而Web浏览器需要了解适用的安全限制。方案(例如“http:”,“about:”)和域(例如“localhost”,“google.com”)会影响诸如单击链接、AJAX请求、iframe等行为。
如果你只想渲染静态HTML,可以将url设置为唯一的,例如http://rendering/(这样资源处理程序就不会与网络上的真实url重叠)。 如果你需要加载HTML并与之交互或执行AJAX调用,则选择与你想要交互的域名匹配的url - 例如,如果你想创建一个替代的Google主页并执行AJAX搜索查询,则需要使用https://www.google.com/作为你的URL,以便你可以与之通信。

您可以在此处查看LoadHtml的源代码source code for LoadHtml here

CefSharp的作用是:

  1. 为给定的url注册资源处理程序。
  2. 调用Load(url)告诉Chromium加载给定的url

然后,在幕后:

  1. Chromium请求url
  2. 资源处理程序拦截请求,并返回您的html
  3. Chromium呈现您的html,而不是URL的真实内容。

1
此外,方案必须有效(例如不能使用“oob://”),否则ResourceHandler将仅创建加载错误(即使URL永远不会加载)。 - Appetere
1
这似乎与CefSharp 43不兼容。 - William Jockusch
不确定是否是版本问题,但我发现如果提供了URL,它就无法呈现我的字符串。 Cefsharp页面上的示例没有URL。https://github.com/cefsharp/CefSharp/blob/335c884b08caa74aba06a056105de30d3d0bc7c6/CefSharp.Example/JavascriptBinding/JavascriptCallbackBoundObject.cs - David Wilton
1
@DavidWilton,该重载有不同的实现。它将HTML作为数据URI加载:https://github.com/cefsharp/CefSharp/blob/e3fcc90c2dd99a561d5c17ef046e47153af81eb6/CefSharp/WebBrowserExtensions.cs#L432 - Yoshi
LoadHTML(myHtml) 用于渲染 HTML 页面。LoadHTML(myHTML, myURL) 尚未能够使用任何 myURL 值工作,例如 "http://mydomain/"。我得到的页面大部分为空白,并且协议报告为 chrome-error:。是否需要进行一些配置才能使其正常工作? - R. Romero
@R.Romero,它必须是一个带有方案的有效URL。尝试使用“http://rendering/”。 - Yoshi

6
尝试以下代码。
Cef.Initialize(new CefSettings());

ChromiumWebBrowser browser = new ChromiumWebBrowser(string.Empty) {
    Location = new Point(0, 0),
    Dock = DockStyle.Fill
};

//add to a System.Windows.Forms.Form or some other container.
this.Controls.Add(browser);
//the url parameter does not have to be an existing address.
browser.LoadHtml("<html><head></head><body><h1>Hello, World!</h1></body></html>", "http://www.example.com/");

希望这能帮到你。

我下载了 49.0.1 版本,但找不到 LoadHtml 方法了,请问是否有其他可替代的方法? - Nguyen Minh Binh
@Nguyen Minh Binh,LoadHtml方法在49.0.1源代码中存在 - https://github.com/cefsharp/CefSharp/blob/cefsharp/49/CefSharp/WebBrowserExtensions.cs#L271。也许尝试编译源代码? - user2278642
3
这是一行代码:CefSharp.WebBrowserExtensions.LoadHtml(browser, "<html><head></head><body><h1>Hello, World!</h1></body></html>", "http://www.example.com/");它的作用是将一段HTML代码加载到指定的浏览器控件中,并指定其URL为"http://www.example.com/"。请注意,此处的代码需要使用CefSharp库。 - Gianni Ciccarelli
@NguyenMinhBinh,LoadHtml是位于CefSharp命名空间中的扩展方法。您需要添加一个using指令,如下所示:using CefSharp; - Björn
我只需要导入WebBrowserExtensions,然后LoadHtml就会出现。 - Nick Chan Abdullah
显示剩余3条评论

4

对于一个WPF项目,请尝试以下步骤。

在xaml中创建到CefSharp.Wpf的命名空间引用。

xmlns:cef="clr-namespace:CefSharp.Wpf;assembly=CefSharp.Wpf"

ChromiumWebBrowser元素添加到您的窗口中。

<cef:ChromiumWebBrowser x:Name="browser" IsBrowserInitializedChanged="browser_IsBrowserInitializedChanged"></cef:ChromiumWebBrowser>

记得给元素指定一个名称(在本例中,该元素称为 browser)。我们将使用它来稍后调用 LoadHtml 方法。
IsBrowserInitializedChanged 事件创建事件处理程序。这非常重要,因为一旦准备好 ChromiumWebBrowser 控件,此事件将被触发。然后我们可以加载 HTML。
将所有内容放在一起...

MainWindow.xaml

<Window x:Class="CEF.MainWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    xmlns:local="clr-namespace:CEF"
    xmlns:cef="clr-namespace:CefSharp.Wpf;assembly=CefSharp.Wpf"
    mc:Ignorable="d"
    Title="MainWindow" Height="350" Width="525">
    <Grid>
        <cef:ChromiumWebBrowser x:Name="browser" IsBrowserInitializedChanged="browser_IsBrowserInitializedChanged"></cef:ChromiumWebBrowser>
    </Grid>
</Window>

MainWindow.xaml.cs

using System.Windows;

namespace CEF
{
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();
        }

        private void browser_IsBrowserInitializedChanged(object sender, DependencyPropertyChangedEventArgs e)
        {
            // the browser control is initialized, now load the html

            browser.LoadHtml("<html><head></head><body><h1>Hello, World!</h1></body></html>", "http://www.example.com/");
        }
    }
}

这对我有效: var s = "<html><head></head><body><h1>Hello, World!</h1></body></html>"; browser.LoadHtml(s); - David Wilton

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接