我有一个 WebView 组件,用于在我的应用程序中显示 HTML 广告。当用户单击 WebView 中的广告时,我想在外部浏览器中打开广告链接。我怎么做?
我需要来自 WP7 浏览器的 OnNavigating 之类的东西。我尝试了 WebView 的 Tapped 事件,但即使我设置 IsTapEnabled=true,它也不会被调用。我需要类似的东西
我有一个 WebView 组件,用于在我的应用程序中显示 HTML 广告。当用户单击 WebView 中的广告时,我想在外部浏览器中打开广告链接。我怎么做?
我需要来自 WP7 浏览器的 OnNavigating 之类的东西。我尝试了 WebView 的 Tapped 事件,但即使我设置 IsTapEnabled=true,它也不会被调用。我需要类似的东西
为此,您需要使用 ScriptNotify 事件。这是我处理场景的方式(使用 NavigateToString)。如果您从 URL 中检索 Web 视图内容,则需要能够修改 HTML 以使其正常工作。
将以下 Javascript 代码添加到您的 HTML
<script type="text/javascript">for (var i = 0; i < document.links.length; i++) { document.links[i].onclick = function() { window.external.notify('LaunchLink:' + this.href); return false; } }</script>
这会为页面上的每个链接 (<a href="..."></a>) 添加一个 onclick 处理程序。window.external.notify 是一种在 Webview 中工作的 Javascript 方法。
将 ScriptNotify 事件处理程序添加到 web 视图。
WebView.ScriptNotify += WebView_ScriptNotify;
声明事件处理程序
async private void WebView_ScriptNotify(object sender, NotifyEventArgs e)
{
try
{
string data = e.Value;
if (data.ToLower().StartsWith("launchlink:"))
{
await Launcher.LaunchUriAsync(new Uri(data.Substring("launchlink:".Length), UriKind.Absolute));
}
}
catch (Exception)
{
// Could not build a proper Uri. Abandon.
}
}
请注意,如果您使用的是外部 URL,则必须将其添加到 webview 允许的 Uris 白名单 ( http://msdn.microsoft.com/en-us/library/windows/apps/windows.ui.xaml。 controls.webview.scriptnotify供参考)。
尝试处理 NavigationStarting 事件。在这里您可以拦截和取消 URL 的加载。您可以筛选要在 Web 视图中打开的链接,以及要在默认浏览器中打开的链接。
private async void webView_NavigationStarting(WebView sender, WebViewNavigationStartingEventArgs args)
{
if(null != args.Uri && args.Uri.OriginalString == "URL OF INTEREST")
{
args.Cancel = true;
await Launcher.LaunchUriAsync(args.Uri);
}
}