小程序webView交互

2,042 阅读1分钟

小程序web-view不支持通过拦截url的功能等方式,来进行H5->小程序,小程序->H5的交互;这里提供“H5->小程序”的方案

小程序WXML

<web-view src="http://127.0.0.1:8848/hb/index.html" bindmessage="bindmessage"></web-view>

小程序JS

// pages/tabBar/order/order.js
Page({

  /**
   * 页面的初始数据
   */
  data: {
    url: 'http://127.0.0.1:8848/hb/index.html'
  },

  bindmessage:function(e){

    let oid = e.detail.data[0].oid;
    console.log('oid: ' + oid);
    // 立即跳转想要去的页面
    wx.navigateTo({
      url: '/pages/book/bookDetail?oid=' + oid
    })
  }
})

前端页面

关键点就在于,H5页面触发了某个事件,小程序页面是无法立马响应的,它只有在退出页面才会调用小程序页面之前定义的bindmessage方法;所以这里可以利用取巧的方式,postmessage后立马pop当前页面

<!DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8" />
		<meta name="viewport" content="width=device-width,initial-scale=1,minimum-scale=1,maximum-scale=1,user-scalable=no" />
		<script src="https://cdn.bootcdn.net/ajax/libs/jquery/3.5.0/jquery.min.js"></script>
		<!-- 引入JSSDK 1.3.2-->
		<script type="text/javascript" src="https://res.wx.qq.com/open/js/jweixin-1.3.2.js"></script>
		<title></title>
		<style type="text/css">
			button {
				width: 100px;
				height: 50px;
				background-color: red;
			}
		</style>
	</head>
	<body>
		<button type="button" id="btn">傻屌</button>
	</body>
</html>

<script type="text/javascript">

	$("#btn").click(() => {

		// 传递数据,必须有data这层
		wx.miniProgram.postMessage({ data: {foo: 'barxx'} })
		/**
		 * 由于小程序的postMessage并不会第一时间传递到小程序
		 * 只有页面销毁或者触发了转发才会真正的发出去
		 * 
		 * 解决办法:取巧的方法就是postMessage后,立即返回上一页面
		 * 				  这样才能造成立即触发小程序bindmessage方法的样子
		 */
		wx.miniProgram.navigateBack({delta: 1})
	});	
</script>