DCloud_heavensoft
DCloud_heavensoft
  • 发布:2015-07-29 04:34
  • 更新:2021-06-01 17:29
  • 阅读:48922

5+App全局变量、常量、共享数据、跨webview传参的综述

分类:MUI

本文是5+App的全局变量介绍,uni-app的全局变量另见文章:https://ask.dcloud.net.cn/article/35021

很多编程语言都有全局变量,但js语言没有。
HTML5+虽然也可以扩展类似plus.globle,但权衡后我们发现,新增类似的方案,不会对便利性有很大的提升,但对App的性能有负面影响,所以我们还是没有提供全局变量,但在本文中详述其他共享数据的方法。

共享数据有几种方法。

  1. localStorage
    localStorage是HTML5标准,可跨webview使用。
    是持久化存储的,App关闭后也存在,除非js手动删除。
    如果考虑持久化,可以使用localStorage
  2. 共享js文件的全局常量
    我们可以给每个HTML页面都引入一个相同的js文件,比如common.js,在里面定义一个变量,var g = 0;
    这个每个页面的g都等于0。
    但这种方式处理的变量是不能跨webview同步的,比如a.html引入common.js后,重新给g赋值为1,那么同样引入common.js的b.html里的g并不会同步更改为1。
    所以说这种方式只适合于共享常量。
  3. url传参
    在web时代,页面间传参的主要方式是url后面加问号,挂参数。形如 b.html?g=0
    然后在b页面里通过js解析title来获取值。
    这种方式问题很多,App开发不推荐使用这种方式。
    问题1是在某些Android手机上,应用的HTML资源必须从apk里解压出来放到sd卡里才能运行,否则就会报404找不到页面。
    而解压资源又影响第一次启动的速度。(解压资源的设置在manifest里)
    问题2是b页面在载入以后,a仍然要给b传递数据,此时就没法用了。
  4. HTML5+的evalJS方法
    plus.webview对象有evalJS方法,可以在一个webview里操作让另一个webview执行一段js,这个方法不仅可用于传递参数,还可用于随意的互相调用通信。
    evalJS类似js标准的eval方法,把js代码变成字符串传递过去,变量也变成值跟随字符串一起传过去。
    具体参考:
    http://www.html5plus.org/doc/zh_cn/webview.html#plus.webview.WebviewObject.evalJS
  5. mui的自定义事件
    mui的自定义事件是对HTML5+的evalJS的一种简化封装。
    当开发者使用mui框架时,可以更简单的跨页传递和获取参数。
    具体参考:
    http://ask.dcloud.net.cn/article/63
    6.其他
    方法其实还有很多,
    比如session.storage,在单页时可用。
    比如通过io共享数据,比如json文件或txt文件;
    比如websql、indexedDB、plus.storage;
    比如在服务器临时存。。。
16 关注 分享
wenju 感受呼吸 买买 小蚂蚁 拉链里的小怪兽 bzliukai 不知道 Trust SixGodWill skysowe Legion mlm8368 老哥教教我 sonicsunsky 2***@qq.com 1***@qq.com

要回复文章请先登录注册

1***@qq.com

1***@qq.com

plus.webview.create创建的页面,使用uni.postMessage怎么接收数据?
2021-06-01 17:29
1***@qq.com

1***@qq.com

evalJS怎么用的,可以给个例子看看吗
2021-02-05 13:33
FYC

FYC

学习了
2018-06-07 13:26
3***@qq.com

3***@qq.com

已经打开了的webview,再次打开页面尝试用evalJS()实现刷新数据的目的,现在安卓端ok了,可以实现,但是ios端无效果,没有调用相应的方法,请问这种是什么问题??
2017-08-02 14:37
陈浩

陈浩

怎么设计全局对象呢?
2016-05-05 10:15
maq

maq

按照 H5 相关技术文档的说法,sessionStorage 只在同一个窗口(桌面浏览器中是指同一个选项卡窗口、app 中是指同一个 webview 对象)多次加载 html 的时候有效,并不能横跨多个窗口。
2016-02-14 16:33
吾兮

吾兮

回复 小蚂蚁 :
你想太多了
2016-01-28 14:28
高一一

高一一

回复 lam :
我试了,不行,localStorage可以
2015-12-04 15:25
semieye

semieye

Mark
2015-11-06 20:21
lam

lam

请问有使用sessionStorage跨webview传参成功过的吗?我试过我这边不行
2015-11-02 09:45