打开一个 HTML5 页面,往 Webview 注入一段 JsBridge 的时机?

2017-07-23 12:39:56 +08:00
 imjeen

JsBridge 是一些声明的 js 语句和自定义事件,通过客户端来注入然后触发 js 里的自定义事件,来告知 H5 页面注入完毕。

(以 android 说明)加载一个网页的方式: webView.loadUrl("http://www.google.com/")。

现状与问题:

onPageFinished 回调里才注入 JsBridge 并触发事件。

onPageFinished 可看作页面 load 完(即页面有 load 事件),但这样如果页面有太多的资源(外部样式、图片等),可又不通过 js 动态处理的话,岂不是打开一个 webview,js 与 app 交互要等到 load 完才可以进行。

更希望在页面 DOMContentLoaded后就可以进行交互。即提前注入 JsBridge 的声明。

设想与目的:

因为不太懂 app 开发,有以下设想:

JsBridge 里有原生 DOMContentLoadedload 事件等的声明,只要提前注入页面,页面在加载过程中就会触发对应的事件,从而可以提前与 app 交互( DOMContentLoaded 后)。所以 webView.loadUrl 的时候,app 往页面的 head 里插入这段 JsBridge 声明就可以。

可问题是以怎样的时机注入 JsBridge:


一般情况,前端页面只需要监听 DOMContentLoaded 事件就可以,但这样要涉及到与 app 的交互,而且 JsBridge 由 app 注入,所以这里需要 app 有 DOMContentLoaded 这样一个时机来告知前端页面页面已经解析完,并且可以交互。所以这样可以做到吗?或者有什么更好的方案?

涉事不深,望各位前辈多多指教。

(描述有点长,主要想让问题更详细一点。不过这里先感谢各位花时间看我的问题啦~)

14003 次点击
所在节点    Android
6 条回复
veightz
2017-07-23 17:36:40 +08:00
安卓不太熟,印象中代理的回调方法里有个类似于 shouldLoad 的方法,可以对你自己定义的 jsbridge url 进行拦截。
vjnjc
2017-07-24 11:39:19 +08:00
我好像也是 onPageFinished 注入的,当时没考虑太慢的问题。。。
要不在 onPageStarted 起一个延迟 0.5s 的 runner ?(没试过~
marvinwilliam
2017-07-24 15:16:58 +08:00
什么样的需求需要 jsbridge 立刻生效的?

为啥 jsbridge 是需要外部注入的?你们的页面不是自己的么?
030
2017-07-24 17:04:35 +08:00
不知 finished 调用,dom 没加载完你就要操作 dom 吗,不是的话随便玩。
imjeen
2017-07-24 22:11:50 +08:00
从 Web 来看,只需要 Dom 加载和解析完(即触发 DOMContentLoaded 事件),此时就可以做这些初始化和操作一些 Dom。
而 onPageFinished 的回调的时间是页面加载完(即触发 load 事件),包括图片、样式等外部资源加载完。

举个例子,如果页面包含大量图片而且加载缓慢。你有没有对这些资源做优化处理,那么等到 onPageFinished 触发的时间比较久。
XiongXionXio
2018-07-04 15:01:58 +08:00
那这个问题最后的解决方案是怎样的啊?

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/377333

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX