【问题标题】:How do I keep the CefSharp browser from opening 2 windows when following an html link?跟随 html 链接时,如何防止 CefSharp 浏览器打开 2 个窗口?
【发布时间】:2021-02-05 00:59:51
【问题描述】:

我正在使用 CefSharp 浏览器来显示电子邮件的内容。我从已解析的电子邮件中提取 BodyHtmlText 并使用 browser.LoadHtml(BodyHtmlText, "http:\\pixemail.com\"); 将其加载到浏览器中。我希望 BodyHtmlText 中的链接在系统默认浏览器中打开,所以我实现了 BrowserRequestHandler 并通过设置 browser.RequestHandler = BrowserRequestHandler; 告诉浏览器使用它

这很好用,除非链接锚标记有 。当它出现时,单击该链接会打开两个新的浏览器窗口;一个具有预期的链接目标页面,另一个是空的。 BrowserRequestHandler.OnBeforeBrowse() 只被调用一次,即使打开了 2 个窗口。

如何摆脱空窗?

如果我没有安装 BrowserRequestHandler,带有 target="_blank" 的链接会在没有额外窗口的新浏览器中打开,但常规链接(没有 target="_blank")会在应用程序的 CefSharp 浏览器窗口中打开,其中我不想要。如果在BrowserRequestHandler.OnBeforeBrowse() 中我可以检测到链接有target="_blank",我可以让CefBrowser 处理它并获得我想要的行为。或者有没有其他方法可以配置和使用 CefSharp 浏览器来获得我想要的行为?

稍微修改过的 CefSharp.MinimalExample.WinForms 版本也出现了同样的问题。我的 BrowserRequestHandler 看起来像这样:

public class BrowserRequestHandler : RequestHandler {
    protected override bool OnBeforeBrowse(IWebBrowser browserControl, IBrowser browser, IFrame frame,
      IRequest request, bool userGesture, bool isRedirect) {
        // Open in external default browser (chrome)
        if (!request.Url.StartsWith("file:") && !request.Url.StartsWith("devtools:")
          && !request.Url.StartsWith("chrome-devtools:") && !request.Url.Contains("pixemail.com")) {
            Console.WriteLine($"start new browser at {request.Url}");
            System.Diagnostics.Process.Start(request.Url);
            return true;
        }
        return false;   // let Cef handle the browse request
    }
}

对 CefSharp.MinimalExample.WinForms.BrowserForm 的更改是:

    string htmlPageFromEmail;

    public BrowserForm() {
        InitializeComponent();
        htmlPageFromEmail = File.ReadAllText("test-email.html");
        //...
        browser = new ChromiumWebBrowser("http://pixemail.com/");   // a dummy web address
        //...
        BrowserRequestHandler = new BrowserRequestHandler();
        browser.IsBrowserInitializedChanged += OnIsBrowserInitializedChanged;
        //...
        browser.Visible = true;
    }

    private void OnIsBrowserInitializedChanged(object sender, EventArgs e) {
        var b = ((ChromiumWebBrowser) sender);
        this.InvokeOnUiThreadIfRequired(() => {
            b.LoadHtml(htmlPageFromEmail, "http://pixemail.com/");
            b.Focus();
        });
    }

我用来模拟电子邮件 BodyHtmlText 字符串的 test-email.html 文件是:

  <html xmlns="http://www.w3.org/1999/xhtml">
    <head></head>
    <body>
      <br><br>Bad link. Opens 2 windows:
      <a href="https://www.youtube.com/watch?v=_7Yw8qMDips&amp;fbclid=IwAR1rGIK9KJukB4_KV5J-E3hqgfFPFZG8scobzKw_aw3jcUnrQWafr4Iw8bc" rel="nofollow" target="_blank" class="enhancr_card_3679327690">Jonny Quest Opening Titles in Stop Motion</a>
      <br><br>Good link. Opens 1 window:
      <a href="https://mewe.com/group/5e35fe0f260e8853cadbe7b7">https://mewe.com/group/5e35fe0f260e8853cadbe7b7</a>
      <br><br>
    </body>
  </html>

我在带有 x64 平台目标的 Windows 10 PC 和 Visual Studio 2019 上使用版本 CefSharp/84。

【问题讨论】:

  • 要处理弹出窗口,您需要实现cefsharp.github.io/api/84.4.x/html/… 或注入一些JavaScript 来移除目标属性。
  • @amaitland 删除目标属性似乎有效-谢谢!知道是什么导致了无关的弹出窗口吗?感觉就像一个错误;无论是在我的 CefSharp 配置中,还是在浏览器中。如果您将其作为答案提交,我将接受您的回复作为答案。

标签: c# winforms cefsharp


【解决方案1】:

从内存中 OnBeforePopup 在 OnBeforeBrowse 之前被调用,因此 CEF 在内部创建弹出窗口,然后您取消导航导致一个空窗口。在您的 OnBeforeBrowse 实现中,您应该会发现 Browser.IsPopup 在链接具有目标属性的情况下为真。

简而言之,您取消导航太晚了,弹出窗口已经创建。

两个选项是

【讨论】:

    猜你喜欢
    • 2012-04-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-26
    • 1970-01-01
    • 2013-01-09
    • 2014-02-22
    • 1970-01-01
    相关资源
    最近更新 更多