Функция обнаруживает открытие в новом окне/вкладке (target = _blank) с помощью JavaScript

Согласно моим исследованиям:

  • "WebView" может отключить "открытие ссылок в новых окнах/вкладках".
  • WebView используется разработчиками собственных приложений для отображения веб-страниц в их приложении (см. приложение Twitter).
  • Обнаружение WebView через пользовательский агент не работает последовательно и не является наилучшей практикой.
  • Просто попытка открыть новое окно с помощью всплывающих блокировщиков JS-триггеров; делая его ненадежным способом проверить, можно ли открыть новое окно.

Мне нужно определить, когда эта функция недоступна. Невозможно?

Дополнительное объяснение

Я пытаюсь определить, могу ли я открыть новое окно через target = _blank. Например, UIWebView [в браузере в приложении] может препятствовать работе функции target = _blank (она просто открывается в том же окне, а не в новом). Мне нужно решение, чтобы указать, когда невозможно открыть новое окно из-за ограничений браузера, например, в случае UIWebView. К сожалению, блокировщики всплывающих окон не позволяют проверять такие функции, потому что они никогда не позволяют открывать новое окно без ввода пользователем (то есть щелчком), которое следует обойти.

Ответы

Ответ 1

У вас не будет надежного на 100%.

Просто попытка открыть новое окно с помощью всплывающих блокировщиков JS-триггеров; делая его ненадежным способом проверить, можно ли открыть новое окно.

Вы правы, это абсолютно не надежно... window.open() заблокирован (даже с трюком вроде window.open(url, '_blank');window.focus();), click() также заблокирован (по ссылке, содержащей target = "_ blank" ), так же, как и evt = document.createEvent("MouseEvents");evt.initEvent("click", true, true);...

Но в любом случае: если WebView не позволяет открыть ссылку на новой вкладке, тогда она будет работать нормально. Но поскольку вы подразумеваете, что Webview может разрешить это. В этом случае вы не будете знать, находитесь ли вы в веб-обзоре или нет. Легко определить, открыта ли открытая ссылка в новой вкладке в том же или нет (может быть протестирована в javascript в не отображаемом iframe), но если ссылка открыта в браузере, у вас нет способа узнать ( и представить себе пользовательский интерфейс с кодом javascript, который открывает новую вкладку в браузере из приложения...). Как сказал Дэйв Алперович, вы не можете заранее знать, что будет заблокировано или нет, не попробовав. Поэтому вы не должны смотреть на эту сторону.

Нет надежных функций или поведения, которые отличает веб-представление от веб-браузера. В webview у вас есть все, что вы получаете в браузере (файлы cookie, WebStorage...). У агента пользователя есть свои недостатки, но он будет работать во многих случаях. Здесь объясняются или здесь.

Ответ 2

В соответствии с запросом OP я протестировал его. И это работает. Если блокировщик всплывающих окон включен, я поймаю его, и поэтому я получу надежный способ узнать, что он включен. В этом случае я просто отправляю предупреждение, но вы можете делать все, что пожелаете.

Вот код:

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<title>Testing Pop-up Blocker</title>
<script>
function openPopUp(urlToOpen) {
  var popup_window=window.open(urlToOpen,"myWindow","toolbar=no, location=no, directories=no, status=no, menubar=no, scrollbars=yes, resizable=yes, copyhistory=yes, width=400, height=400");            
  try {
    popup_window.focus();   
  }
  catch (e) {
    alert("Pop-up Blocker is enabled! Please add this site to your exception list.");
  }
}
</script>
</head>
<body onload="openPopUp('http://www.google.com'); return false;">
<p>Testing Pop-up Blocker</p>
</body>
</html>

И вот что я получил, поскольку включен блокировщик всплывающих окон.

введите описание изображения здесь