【问题标题】:How to detect in JavaScript if a page was loaded in a Chrome webview?如何在 JavaScript 中检测页面是否已在 Chrome webview 中加载?
【发布时间】:2013-06-22 18:27:27
【问题描述】:

我正在为 Chrome 编写一个打包的应用程序,它有一个 webview 标记,我可以在其中加载我的网站。

网站 JavaScript 代码是否有可能检测到它是在 webview 中加载的? navigator.userAgent 属性没有任何线索。

【问题讨论】:

    标签: javascript webview google-chrome-app


    【解决方案1】:

    除了 Jivings 提到的方法之外的其他方法:

    • 在 web 视图中加载一个稍微不同的 URL,例如 http://example.com?in_webview=1,并将其反映在网站提供的 JavaScript 中。
    • 相同的想法,但使用#fragment。我不确定#fragment 是否能正常工作,但如果能正常工作,那就太好了,因为服务器不会被奇怪的查询参数弄糊涂。
    • 使用嵌入器,将脚本插入到 webview 的 DOM 中,以执行不同的操作。

    【讨论】:

    • 是的,前两个肯定会工作,但是一旦我在 web 视图中导航,它就会停止工作,因为我会丢失额外的参数。或者我必须不断地跟踪它。你能告诉我更多关于第三个的信息吗?如何将脚本插入 webview 的 DOM?
    • “否则我必须不断地跟踪它”——然后设置一个 cookie!
    • #3 的基本思想是 ExecuteScript("var script = document.createElement('
    • 酷,我们最终使用了参数解决方案,但将其保存在 localStorage 而不是 cookie 中。
    • 优秀! 正在非常活跃的开发中,所以请在 crbug.com 提交您的错误或在这里询问,我们应该能够快速解决您的问题!
    【解决方案2】:

    当 webview 完成加载后,向里面的页面触发一个事件:

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

    您的内容页面可以使用常规 postMessage API 收听此消息。如果它收到一条消息,您将知道它已加载到 webview 中。

    【讨论】:

    • 这是我目前使用的方法,用于设置推送消息等。但是,这种方法是异步的,我需要知道我是否在页面加载时处于 webview 中,而不是一些一段时间后。
    • @MarkVayngrib 页面加载后会触发该消息。
    • 但如果您使用的是普通浏览器,它不会触发该消息。当您收到消息时,您知道您在 web 视图中,但如果您还没有收到它,您可能是在普通浏览器中,或者只是过早地检查了一下。我一直在使用这种方法,但现在担心时机问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-01-11
    • 1970-01-01
    • 2011-10-28
    • 2021-03-21
    • 1970-01-01
    • 2014-11-30
    • 1970-01-01
    相关资源
    最近更新 更多