【问题标题】:Chrome App messaging and 'loadstop' vs. .load() timingChrome 应用程序消息传递和“loadstop”与 .load() 时间
【发布时间】:2014-07-02 15:11:00
【问题描述】:

我正在开发一个带有 webviews 的 Chrome 应用程序。用于 web 视图的页面也可以在常规浏览器中运行。如果在 webview 中,页面会向主 App 发送消息,但显然他们需要先从 App 获取消息,以便知道将消息发送到哪里。

没问题 - 主应用程序一看到“loadstop”事件就会发送一条消息,告诉页面将消息发送到哪里。如果页面不在 web 视图中,则它永远不会收到消息。

问题是,我需要知道页面何时应该停止等待消息并假设它不在 web 视图中。

相对于页面中的事件(例如 jQuery 的 .ready 或 .load),“loadstop”何时发生?有没有办法捕获或触发一个事件,保证在主应用程序中看到“loadstop”以及 webview 的 JavaScript 发送和接收消息之后发生。

【问题讨论】:

    标签: javascript webview google-chrome-app


    【解决方案1】:

    相对于页面中的事件(例如 jQuery 的 .ready 或 .load),“loadstop”何时发生?

    根据loadstop 事件的文档:

    当访客页面(包括其所有子框架)中的所有框架级加载完成时触发。这包括当前文档中的导航以及子框架文档级加载,包括异步资源加载。

    这表明它更类似于 jQuery 的 .ready(),它在加载 DOM 树之后但在等待资产(.css、.js)下载之前执行。

    密切关注该文档页面;自两周前以来,它已经大大改善了。


    有没有办法捕获或触发一个事件,保证在主应用程序中看到“loadstop”以及 webview 的 JavaScript 发送和接收消息之后发生?

    您的 manifest.json 声明了您的 my-app-main.js 后台脚本(以及您的 webview 权限),它会启动您的 my-webview-wrapper。 html,其中包括您的 <webview> 标记,还内联了一些 javascript(或来源 my-webview-wrapper.js 文件),通过 onload 函数将事件侦听器分配给您的 webview像这样:

    onload = function() {
      webview = document.getElementById("the-id-attribute-of-my-webview");
      webview.addEventListener("<EVENT>", function() {
        // the cool stuff you want to do
      }
    }
    

    &lt;EVENT&gt; 可以是我链接的文档中列出的任何 webview DOM 事件(包括loadstop)。您的主应用程序不应该真正关心这一切是否正在发生。 (它是异步的!它是 javascript!它很神奇!)

    如果您仍然感到困惑,只需在 GitHub 上浏览 Google 的 webview sample

    【讨论】:

    • 我不确定这个加载代码放在哪里 - 在 web 视图中?那么webview可以和主App同时接收'loadstop'吗?这可能很方便,但主应用程序绝对在乎。我正在预加载一些广告(webviews 中的页面)以显示在信息亭上 - 它们不仅需要图像、JavaScript ...,而且它们需要在完全准备好时告诉主应用程序,包括确定自己的播放方式长度。只有这样,主应用才能安排它们向用户显示,否则我的客户会不高兴。
    • 是的,onload 代码放置在(或链接自)调用 webview 的同一个嵌入器 HTML 页面中。对于您的具体问题,您是否可以使用 CSS 默认隐藏 webview,然后将其切换为从 loadstop 回调函数中显示?
    • 这基本上就是我正在做的事情,但是从您的 cmets 和文档来看,loadstop 事件对于 webview 来说发生得太早了——在加载异步资源之前以及 webview 的 JavaScript 可以做它的事情之前。只有 webview 知道何时发生这种情况,因此它需要发送消息或设置标志或做某事,而不是主应用程序。顺便说一句,为了解决问题,我已经决定让主应用程序每秒轮询一次 web 视图 - 不是 JavaScript 异步方式,而是最后只有几行代码。
    • 在快速查看我的代码后,具体来说,webview 页面的 JavaScript 调用 window.addEventListener('message', ...);所以它可以听到主应用程序。但是,这是否足以击败“loadstop”,或者主应用程序对它的响应是否有可能在网络空间中丢失?我害怕比赛条件错误。
    • 哦,这是一个很酷的解决方案。我对 Javascript 的了解还不够,无法说出这是否是一种竞争条件,但它确实感觉就像它会那样。可能值得再问一个问题。
    猜你喜欢
    • 1970-01-01
    • 2016-05-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-05-19
    相关资源
    最近更新 更多