小程序-<web-veiw>的使用(历史页面返回问题)

小程序官方文档真是不敢恭维啊,<web-view>的坑很多,而且网上的资料也是少之又少,决定写一下<web-view>的使用。

<web-view>的基本使用

  • <web-view>组件的提供的两个属性:
    1.src属性 : 向 <web-view> 传递链接和参数;
    2.bindmessage属性 :页面通过该属性向小程序传递数据,从而实现小程序和网页的通信;
    了解<web-view>更多信息

  • <web-view>使用时的特性:
    1.web-view 组件是一个可以用来承载网页的容器,每个页面只能有一个<web-view/>,<web-view/>会自动铺满整个页面,并覆盖其他组件(除系统的navigationbar和tabbar);
    2.如果里边有使用其他基础组件,那这些组件将被<web-view>组件覆盖;
    3.你的主/子域名都需要添加到“微信公众平台->设置->开发设置->业务域名”里边(一个账号下业务域名允许添加20个);
    4.在iOS中,若存在JSSDK接口调用无响应的情况,可在<web-view/>的src后面加个“#wechat_redirect”解决;
    5.个人类型与海外类型的小程序暂不支持使用;

  • src属性的使用

// index.wxml 代码如下:

<web-view src='https://baidu.com'></web-view> // 这里的链接也可以改成动态的

运行以上代码即可查看加载网页效果。

注意:在应用中我们有时会动态去绑定参数,然而坑就有可能出现了。动态绑定参数的方法有两种:

  1. 我们一般情况下会想到可以通过url查询字符串的方式给页面传值,也就是直接使用 Mustache 语法(双大括号)将变量包起来放在src属性的字符串链接后边直接拼接上,比如我们要传一个“id”参数,代码如下:
<web-view src='https://baidu.com?id={{id}}'></web-view>

然而这样做,你可能就掉进了坑里,尽管看上去没什么问题,但是安卓手机有很大概率获取不到我们传过去的参数值,因为网页加载时src属性可能是这样的“https://baidu.com?id=”,导致网页中js不能通过解析url得到小程序传过来的“id”。所以,
2.正确的动态传参方法:在index.js文件中,将想要传递的参数和链接拼接完成,然后通过setData()方法更新页面链接,达到动态传参的效果,代码如下:

// index.js
Page({
  data: {
    url: "",
  },
  
  onLoad: fucntion(options) {
    let vId = options.id; // 上个页面传递过来的id
    let tempUrl = `https://baidu.com?id=${vId}`;
    this.setData({
      url: tempUrl,
    });
  },
})
  • bindmessage属性的使用
    注意:1.该属性需要与H5页面中的script配合使用
    2.发送消息时传参问题:传参时要选择下图中打✅号的那种方式,不可以使用打❌号的方式,否则获取不到数据。
    屏幕快照 2018-05-23 上午11.06.59.png
// H5页面中javascript代码如下:
<!-- 引入小程序提供的JS -->
<script type="text/javascript" src="https://res.wx.qq.com/open/js/jweixin-1.3.2.js"></script>
<!-- javascript中调用小程序提供的api -->
<script>
  // 调用wx发送消息方法
  wx.miniProgram.postMessage({ data: {foo: 'bar'} }) // 
</script>
// index.wxml代码如下:
<web-view src='{{lotsUrl}}' bindmessage='msgHandle'></web-view>

// index.js代码如下:
Page({
  // 消息接收处理方法
  msgHandle: function(e) {

  }
}


<web-view>页面导航问题(历史页面返回)

小程序中web页面导航返回按钮问题的解决方案有两种,第一种是通过系统的NavigationBar自身的返回按妞,这种是小程序自带的返回历史页面的方式,第二种是使用JSSDK 1.3.2提供的接口返回。这里只讲一下第一种方法,第二种方法暂时未实现。

  • 通过系统的NavigationBar自身的返回按妞,实现网页返回历史页面功能
    需要在加载<web-view>页面时,前面还有一个页面【这个页面可以是一个空白页面(想象成一个虚拟页面),或者是一个实际存在页面】,此页面用于push出<web-view>页面,只有这样才能使用NavigationBar自身的返回按妞,实现网页返回历史页面功能,否则这种方法不适用你的项目。
  1. 前一个页面是一个实实在在的有内容的页面,通过其中某个按钮push出要加载的<web-view>页面。只需要在按钮的事件方法里面执行如下代码即可:
let vId = '123'; // 这里是获取到的id信息
wx.navigateTo({
  url: "../lots/lots?id=" + vId, // 拼接传参到下个页面
});
  1. 如果要加载的<web-view>页面就是首页,那么需要添加一个空页面(虚拟页面)来充当底层首页,然后进来首页立马push出<web-view>页面,代码如下:

假设index页面为首页(空白页/虚拟首页),lots页面为<web-view>页(实际上的首页)

// app.js 代码如下:
App({
  data: {
    webviewIsShowed: false // 用来标记lots页面是否已经显示过了
  },
  onHide() {
    this.data.webviewIsShowed = false;  // 小程序退出时,将变量置为初始值
  },
})
// index.js 代码如下:

// 获取实例变量
var app = getApp();

Page({
    onShow() {
        // 如果已经显示过lots页了,则执行后退操作,否则就跳到lots页。(后退到lots页最后一级再点后退按钮将退出小程序)
        if (!app.data.webviewIsShowed) {
            wx.navigateTo({
                url: '../lots/lots'
            })
        } else {
            wx.navigateBack({
                delta: 1
            });
        }
    }
})
// lots.wxml 代码如下: 
<web-view src="https://baidu.com"></web-view>

// lots.js 代码如下:

// 获取实例变量
var app = getApp();

Page({
    onShow() {
        app.data.webviewIsShowed = true; // 修改webviewIsShowed的值,标记已经显示过web-view页了
    }
})

通过以上各页代码的设置就可以实现历史页面返回的功能。

  • <web-view>页面设置了分享功能注意事项
    注意:(切记)如果你在<web-view>页面设置了分享功能,那么你需要在转发给朋友的时候,将转发页面的地址改为首页,而不是默认当前页的地址;如果不更改,你的好友打开的时候将没有返回按钮和返回历史页面的功能,因为他们打开的是lots页面而不是index页面。
// lots.js 代码如下:

// 获取实例变量
var app = getApp();

Page({
    onShow() {
        // 显示转发菜单
        wx.showShareMenu({
            withShareTicket: true
        });

        app.data.webviewIsShowed = true; // 修改webviewIsShowed的值,标记已经显示过web-view页了
    },
    onShareAppMessage() {
        return {
            title: '分享标题',
            path: '/pages/index/index' // 分享出去后打开的页面地址
        }
    },
})





参考文章:
微信小程序-<web-view>
WTF小程序之<web-view>
解决微信小程序<web-view>组件所在页面无返回按钮的问题

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 199,830评论 5 468
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 83,992评论 2 376
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 146,875评论 0 331
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 53,837评论 1 271
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 62,734评论 5 360
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,091评论 1 277
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,550评论 3 390
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,217评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,368评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,298评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,350评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,027评论 3 315
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,623评论 3 303
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,706评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,940评论 1 255
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,349评论 2 346
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 41,936评论 2 341