アプリに WebView があり、html ファイル ("target=_blank" リンク タイプ) を変更できません。しかし、ページ上の一部のリンクにより、アプリがシステム ブラウザーでそれらを開くようになります。このアクションを禁止するにはどうすればよいですか?
ありがとう。
アプリに WebView があり、html ファイル ("target=_blank" リンク タイプ) を変更できません。しかし、ページ上の一部のリンクにより、アプリがシステム ブラウザーでそれらを開くようになります。このアクションを禁止するにはどうすればよいですか?
ありがとう。
Windows 10 では、以下を使用できますWebView.NewWindowRequested
。
private void WebView1_NewWindowRequested(
WebView sender,
WebViewNewWindowRequestedEventArgs args)
{
Debug.WriteLine(args.Uri);
args.Handled = true; // Prevent the browser from being launched.
}
NavigationCompleted イベント ハンドラーで、次のスクリプトを実行します。
webView.InvokeScriptAsync("eval", new[]
{
@"(function()
{
var hyperlinks = document.getElementsByTagName('a');
for(var i = 0; i < hyperlinks.length; i++)
{
if(hyperlinks[i].getAttribute('target') != null)
{
hyperlinks[i].setAttribute('target', '_self');
}
}
})()"
});
ナビ開始イベントあり。ナビゲーションをキャンセルするために使用できる cancel プロパティがあります。多分これはあなたのために働くでしょうか?
user2269867の答えは実行可能な解決策ですが、特定の状況では機能しない可能性があることを追加したいと思います。
たとえば、システム ブラウザは、ユーザーが target="_blank" 属性を持つリンクをクリックした場合だけでなく、javascript で window.open() 関数が呼び出された場合にも開きます。さらに、ページがコンテンツを動的にロードし、スクリプトの実行が既に終了した後に DOM を変更している場合、すべての「ターゲット」属性を削除しても機能しません。
上記の問題をすべて解決するには、window.open 関数をオーバーライドし、'target' 属性を 1 回だけではなく、ユーザーが何かをクリックするたびにチェックする必要があります。これらのケースをカバーするスクリプトは次のとおりです。
function selfOrParentHasAttribute(e, attributeName) {
var el = e.srcElement || e.target;
if (el.hasAttribute(attributeName)) {
return el;
}
else {
while (el = el.parentNode) {
if (el.hasAttribute(attributeName)) {
return el;
}
}
}
return false;
}
var targetAttributeName = "target";
document.addEventListener("click", function (e) {
var el = selfOrParentHasAttribute(e, targetAttributeName);
if (el) {
if ((el.getAttribute(targetAttributeName) == "_blank") ||
(el.getAttribute(targetAttributeName) == "_new"))
{
el.removeAttribute(targetAttributeName);
}
}
});
window.open = function () {
return function (url) {
window.location.href = url;
};
}(window.open);
私のjsスキルは理想的ではないので、自由に変更してください。また、kiewicが述べたように、Windows 10 には、この問題をより自然に解決する WebView.NewWindowRequested イベントがあることを忘れないでください。
ページの HTML と NavigateToString() を編集できる場合は、<head> に <base target='_blank'/> を追加します。
ページを表示したいだけで、そのページでのアクションを許可しない場合は、WebViewBrush を調べます。WebViewBrush は基本的に Web サイトのスクリーンショットを作成し、ユーザーはそのページのリンクやその他のものを使用できなくなり、読み取り専用ページになります。これがあなたが求めているものだと思います。
WebViewBrush の詳細については、http ://msdn.microsoft.com/en-us/library/windows/apps/windows.ui.xaml.controls.webviewbrush を参照してください。