我知道如何在uwp的Webview控件中实现InvokeScriptAsync以获取指定网站中任何超链接的Url,并且通过在清单的“内容URI”部分中指定网站来做到这一点没有问题。
但是,我在商店中遇到了几种浏览器,无论URL是什么,我都能在其中找到所有网站网页上的右键菜单。例如,Microsoft商店中的“ UCBrowser UWP”,此浏览器具有在任何网站中右键单击URL的功能。怎么做?
总而言之,我想从任何网站设计一个右键单击菜单,其中至少包含“在另一个选项卡中打开链接”菜单。
答案 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。
这是您可以参考的code sample。