Как запретить WebView открывать ссылки в браузере в WinRT (target= blank links)?
У меня есть WebView в моем приложении, и я не могу изменить html-файл (типы ссылок"target=_blank"). Но некоторые ссылки на странице заставляют мое приложение открывать их в системном браузере. Как я могу запретить это действие?
Спасибо.
6 ответов:
В обработчике событий 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'); } } })()" });
В 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. }
Существует событие запуска навигации. У него есть свойство cancel, которое можно использовать для отмены навигации. Может быть, это сработает для вас?
Недавно наткнулся на это сам, и я хочу добавить, что, хотя Ответ user2269867 является жизнеспособным решением, он может не работать в определенных ситуациях.
Например, системный браузер откроется не только, если пользователь нажмет ссылку с атрибутом target="_blank", но и если окно.функция open() вызывается в javascript. Более того, даже удаление всех атрибутов 'target' не будет работать, если страница загружает некоторый контент динамически и изменяет DOM после того, как ваш сценарий уже завершен проведение.
Чтобы решить все вышеперечисленные проблемы, вам нужно переопределить окно.откройте функцию, а также проверьте атрибут "target" не один раз, но каждый раз, когда пользователь нажимает что-то. Вот сценарий, который охватывает эти случаи:
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 событие, которое решает эту проблему более естественно.
Если вы просто хотите показать страницу и не позволяете выполнять какие-либо действия на этой странице, Я бы заглянул в WebViewBrush. WebViewBrush в основном сделает скриншот веб-сайта, и пользователи не смогут использовать какие-либо ссылки или что-либо еще на этой странице, она превратится в страницу только для чтения. Я верю, что это то, о чем вы просите.
Подробнее о WebViewBrush можно найти здесь: http://msdn.microsoft.com/en-us/library/windows/apps/windows.ui.xaml.controls.webviewbrush