通过Javascript

时间:2017-01-22 13:24:30

标签: javascript c# jquery cefsharp

我在C#中创建一个Web浏览器,并根据用户右键单击的元素显示自定义上下文菜单。我无法确定应将哪些元素视为链接?

if (el_tag == "a")
    showLinkMenu();

else if (el_tag == "img" && parent_tag == "a")
    showAdvancedMenu();

else if (el_tag == "img")
    showImgMenu();

Shot1:Google chrome detected this as a link

Shot2:Structure a> div> div> div> div> IMG

如何检测此类链接?

2 个答案:

答案 0 :(得分:1)

您应该迭代父标记列表,如果其中任何标记属于<a>属性href,则称其为链接。

答案 1 :(得分:0)

我建议您实施自己的IContextMenuHandler并使用内置的CefMenuCommandTypeFlag来帮助您。这样,您可以根据右键单击的元素添加或删除上下文菜单项。

MenuHandler.cs

internal class MenuHandler : IContextMenuHandler
{
    private const int SaveImage = 26503;
    private const int OpenLinkNewTab = 26501;

    public event EventHandler OnSaveImage = delegate { };

    void IContextMenuHandler.OnBeforeContextMenu(IWebBrowser browserControl, IBrowser browser, IFrame frame, IContextMenuParams parameters, IMenuModel model)
    {
        if(parameters.TypeFlags.HasFlag(ContextMenuType.Media) && parameters.HasImageContents)
        {
            model.AddItem((CefMenuCommand)SaveImage, "Save image");
        }
        if(!string.IsNullOrEmpty(parameters.UnfilteredLinkUrl))
        {
            model.AddItem((CefMenuCommand)OpenLinkNewTab, "Open link in new tab");
        }
    }

     bool  IContextMenuHandler.OnContextMenuCommand(IWebBrowser browserControl, IBrowser browser, IFrame frame, IContextMenuParams parameters, CefMenuCommand commandId, CefEventFlags eventFlags)
     {
        return false;
     }

    void IContextMenuHandler.OnContextMenuDismissed(IWebBrowser browserControl, IBrowser browser, IFrame frame)
    {
        if ((int)commandId == SaveImage)
        {
            OnSaveImage?.Invoke(this, new ImageSaveEventArgs(parameters.SourceUrl)); //ImageSaveEventArgs is just a class with one property that houses the source url of the image to download.
        }
    }

    bool IContextMenuHandler.RunContextMenu(IWebBrowser browserControl, IBrowser browser, IFrame frame, IContextMenuParams parameters, IMenuModel model, IRunContextMenuCallback callback)
    {
        return false;
    }
}

然后,无论您在何处创建ChromiumWebBrowser实例,都可以执行以下操作:

ChromiumWebBrowser browser = new ChromiumWebBrowser();
MenuHandler menuHandler = new MenuHandler();
menuHandler.OnSaveImage +=  Handler_OnSaveImage;
browser.MenuHandler = menuHandler;

private void Handler_OnSaveImage(object sender, EventArgs e)
{
    DownloadImage(((ImageSaveEventArgs)e).SourceUrl);
}

注意,这只是使用内置IContextMenuHandler获取用户右键单击的内容,然后处理我自己的事件以便实现所需行为的示例。在这种情况下,可以从URL下载文件。

有关更多详细信息和其他示例,请参阅CefSharp的GitHub页面上的MenuHandler.cs