如何在Webview中为任何网站设计右键菜单?

时间:2019-05-31 17:46:18

标签: uwp

我知道如何在uwp的Webview控件中实现InvokeScriptAsync以获取指定网站中任何超链接的Url,并且通过在清单的“内容URI”部分中指定网站来做到这一点没有问题。

但是,我在商店中遇到了几种浏览器,无论URL是什么,我都能在其中找到所有网站网页上的右键菜单。例如,Microsoft商店中的“ UCBrowser UWP”,此浏览器具有在任何网站中右键单击URL的功能。怎么做?

总而言之,我想从任何网站设计一个右键单击菜单,其中至少包含“在另一个选项卡中打开链接”菜单。

1 个答案:

答案 0 :(得分:0)

  

如何在Webview中为任何网站设计右键菜单?

html中有oncontextmenu事件,用于检测右键单击。您可以使用WebView InvokeScriptAsync将检测到的方法注入html页面中的eval函数。右键单击后,您可以使用window.external.notify回叫。

例如

<a>标签创建右键菜单。

public MainPage()
{
    this.InitializeComponent();

    MyWebView.LoadCompleted += MyWebView_LoadCompleted;
}

private async void MyWebView_LoadCompleted(object sender, NavigationEventArgs e)
{
    string functionString = @"var anchors = document.querySelectorAll('a');      
  for (var i = 0; i < anchors.length; i += 1) {
        anchors[i].oncontextmenu = function (e) {
            var e = e||window.event;  
            var oX = e.clientX;
            var oY = e.clientY;
            var href = this.getAttribute('href');
            window.external.notify([oX.toString(), oY.toString(), href].toString());
        };
    }";
    await MyWebView.InvokeScriptAsync("eval", new string[] { functionString });
}

private void MyWebView_ScriptNotify(object sender, NotifyEventArgs e)
{
    var items = e.Value.Split(',');
    MenuFlyout myFlyout = new MenuFlyout();
    MenuFlyoutItem firstItem = new MenuFlyoutItem { Text = "Open new tab" };
    myFlyout.Items.Add(firstItem);
    myFlyout.ShowAt(sender as UIElement, new Point(System.Convert.ToDouble(items[0]) , System.Convert.ToDouble(items[1])));
}

请注意

在Package.appxmanifest的“内容URI”部分中指定了允许的sites,并且不能包含域通配符,并且必须为https。

enter image description here

这是您可以参考的code sample