【问题标题】:CefSharp LoadHtmlCefSharp LoadHtml
【发布时间】:2015-02-23 21:09:06
【问题描述】:

有人可以向我解释一下 CefSharp LoadHtml 函数的工作原理吗?

LoadHtml(string html, string url)

htmlurl 参数代表什么?

我有兴趣将原始 HTML 字符串中的页面加载到 CefSharp 浏览器中。

【问题讨论】:

    标签: c# chromium-embedded cefsharp


    【解决方案1】:

    更新:CefSharp 有一个新的LoadHtml(string html) 方法,可将 HTML 作为 base64 编码的数据 URI 加载。比下面描述的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,以便与它进行通信。


    你可以看到source code for LoadHtml here

    CefSharp 所做的是:

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

    然后,在引擎盖下:

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

    【讨论】:

    • 此外,方案必须有效(例如,不能使用“oob://”),否则 ResourceHandler 只会创建加载错误(即使永远不会加载 URL)。
    • 这似乎与 CefSharp 43 过时了。
    • 不确定是否是更高版本的问题,但我发现如果我提供了 url 它不会呈现我的字符串。 cefsharp 页面上的示例显示没有 url github.com/cefsharp/CefSharp/blob/…
    • @DavidWilton 重载有不同的实现。它将 HTML 作为数据 uri 加载:github.com/cefsharp/CefSharp/blob/…
    • LoadHTML(myHtml) 用于呈现 html 页面。 LoadHTML(myHTML, myURL) 尚未使用 myURL 的任何值,例如“mydomain”。我得到一个大部分为空的页面,protocole 报告为 chrome-error:。是否需要一些配置才能使其工作?
    【解决方案2】:

    试试下面的代码

    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 LoadHtml 方法存在于 49.0.1 源代码 - github.com/cefsharp/CefSharp/blob/cefsharp/49/CefSharp/… 中。也许尝试编译源代码?
    • 我再次检查,LoadHtml 方法已从 v43 移至 WebBrowserExtensions 包。在此版本之前,此方法在 CefSharp.Wpf 包中可用。 https://github.com/cefsharp/CefSharp/blob/cefsharp/41/CefSharp.Wpf/ChromiumWebBrowser.cs 顺便说一句,我现在仍然不知道如何从我的 ChromiumWebBrowser 实例中调用此方法。
    • @Nguyen Minh Binh - 看看第 173 行 - github.com/cefsharp/CefSharp/blob/cefsharp/49/…
    • 应该是CefSharp.WebBrowserExtensions.LoadHtml(browser, "&lt;html&gt;&lt;head&gt;&lt;/head&gt;&lt;body&gt;&lt;h1&gt;Hello, World!&lt;/h1&gt;&lt;/body&gt;&lt;/html&gt;", "http://www.example.com/");
    【解决方案3】:

    对于 WPF 项目,请尝试以下操作。

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

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

    ChromiumWebBrowser 元素添加到您的窗口。

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

    请记住为元素指定一个名称(在本例中,该元素称为浏览器)。稍后我们将使用它来调用 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 = "

      Hello, World!

      "; browser.LoadHtml(s);
    猜你喜欢
    • 2013-04-01
    • 2012-02-27
    • 1970-01-01
    • 2014-04-24
    • 2012-05-18
    • 2017-01-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多