Как определить в JavaScript, была ли страница загружена в веб-просмотре Chrome?

Я пишу упакованное приложение для Chrome с тегом веб-просмотра, где я загружаю свой веб-сайт.

Может ли код JavaScript веб-сайта определить, что он был загружен в веб-просмотре? Свойство navigator.userAgent не имеет подсказок.


person Mark Vayngrib    schedule 22.06.2013    source источник


Ответы (2)


Другие подходы в дополнение к упомянутому Jivings:

  • Загрузите немного другой URL-адрес в веб-представлении, например, http://example.com?in_webview=1, и отразить это в JavaScript, обслуживаемом сайтом.
  • Та же идея, но используйте #fragment. Я не знаю точно, будет ли корректно работать #fragment, но если работает, то это хорошо, потому что сервер не будет сбит с толку странным параметром запроса.
  • Используя встроенный модуль, вставьте скрипт в DOM веб-просмотра, который делает что-то другое.
person sowbug    schedule 23.06.2013
comment
Правильно, первые два определенно будут работать, но они перестанут работать, как только я перейду в веб-просмотр, так как я потеряю дополнительный параметр. Или мне пришлось бы постоянно следить за этим. Не могли бы вы рассказать мне больше о третьем? Как вставить скрипт в DOM веб-просмотра? - person Mark Vayngrib; 23.06.2013
comment
Или мне пришлось бы постоянно следить за этим — тогда устанавливайте куки! - person sowbug; 23.06.2013
comment
Основная идея для # 3: ExecuteScript(var script = document.createElement('‹script›'); script.[заставьте его делать все, что вы хотите]; document.body.appendChild(script);). Это решает проблему, связанную с тем, что ваш ExecuteScript в противном случае выполняется в изолированном мире, поэтому он не может (например) изменить переменную, доступную на странице. - person sowbug; 23.06.2013
comment
Круто, в итоге мы использовали решение параметра, но сохранили его в localStorage, а не в файле cookie. - person Mark Vayngrib; 23.06.2013
comment
Выдающийся! ‹webview› находится в стадии активной разработки, поэтому, пожалуйста, сообщайте о своих ошибках на crbug.com или спрашивайте здесь, и мы сможем быстро решить вашу проблему! - person sowbug; 23.06.2013

Когда веб-просмотр завершит загрузку, запустите событие на странице внутри:

webview.addEventListener("loadstop", function () {
   contentWindow.postMessage('Hello from Chrome App!', targetOrigin)
});

Ваша страница контента может прослушивать это сообщение с помощью обычного API postMessage. Если он получит сообщение, вы узнаете, что оно загружено в веб-просмотре.

person Jivings    schedule 22.06.2013
comment
это подход, который я сейчас использую, для настройки push-сообщений и т. д. Однако этот подход является асинхронным, и мне нужно знать, нахожусь ли я в веб-просмотре при загрузке страницы, а не через некоторое время. - person Mark Vayngrib; 23.06.2013
comment
@MarkVayngrib Когда страница загрузится, появится это сообщение. - person Jivings; 23.06.2013
comment
Но если вы находитесь в обычном браузере, это сообщение не будет запущено. Когда вы получаете сообщение, вы знаете, что находитесь в веб-просмотре, но если вы его не получили, возможно, вы находитесь в обычном браузере или просто проверяете его слишком рано. Я использовал этот подход, но теперь беспокоюсь о времени. - person DaveWalley; 02.07.2014