上個月,小程序開發內嵌web頁面的功能,這個對於不少微信開發者都是個重大消息。最近兩天,筆者項目中有這樣一個需求,支持小程序內嵌網頁,而且在內嵌網頁中屢次跳轉,分享後,點開仍是在跳轉以後的網頁。對於這樣一個新技術,仍是充滿好奇,既然老大說了要作,那就嘗試去作唄。 首先,固然是參考微信小程序的api。javascript
<web-view src="https://mp.weixin.qq.com/"></web-view>
複製代碼
其實使用起來特別簡單,只需在頁面中放入這樣一個標籤便可,其中src必定是要在小程序管理中心配置過的。特別注意一下,web-view會佔滿整個頁面,無論這個頁面有什麼其它的東西,都不會展現出來。html
好了。有了這個能夠開始進入需求實現的階段了。對於分享功能,作太小程序開發的都不會陌生,在須要被分享的頁面js中加入onShareAppMessage這樣一個事件便可。vue
在 Page 中定義 onShareAppMessage 函數,設置該頁面的轉發信息。 只有定義了此事件處理函數,右上角菜單纔會顯示 「轉發」 按鈕 用戶點擊轉發按鈕的時候會調用 此事件須要 return 一個 Object,用於自定義轉發內容java
示例代碼以下:web
Page({
onShareAppMessage: function (res) {
if (res.from === 'button') {
// 來自頁面內轉發按鈕
console.log(res.target)
}
return {
title: '自定義轉發標題',
path: '/page/user?id=123',
success: function(res) {
// 轉發成功
},
fail: function(res) {
// 轉發失敗
}
}
}
})
複製代碼
可是存在web-view時,onShareAppMessage回調函數參數res中還會多一個webViewUrl小程序
Page({
onShareAppMessage(options) {
console.log(options.webViewUrl)
}
})
複製代碼
看了這麼多api,內心也有數了,就開始愉快的擼代碼了。很快,內嵌網頁分享的功能就是實現出來了。微信小程序
onShareAppMessage(options) {
var that = this
var return_url = options.webViewUrl
return {
title: that.data.title,
path: return_url,
success: function (res) {
that.web_url = return_url
// 轉發成功
wx.showToast({
title: "轉發成功",
icon: 'success',
duration: 2000
})
},
fail: function (res) {
// 轉發失敗
}
}
},
``` 就在感嘆本身是多麼牛x,一會兒就搞出來的時候,發現離需求還差一點。須要實現內嵌網頁內屢次跳轉分享的功能,這就須要本身想辦法了。在小程序分享中又不能保持狀態,這個得去記錄分享時網頁的路徑。其實有點開發經驗的都能想到這個辦法,那就是使用?在url後記錄下來,這樣在其它用戶打開轉發小程序的時候,取出其中的參數,將web-view中的src替換成這個就好了。話很少說,直接上代碼。 ```javascript
Page({
web_url:"",
data: {
title: '測試內嵌分享',
url:'',
web_src:''
},
onShareAppMessage(options) {
var that = this
var return_url = options.webViewUrl
var path = '/page/test/test?return_url=' + encodeURIComponent(return_url)
console.log(path, options)
return {
title: that.data.title,
path: path,
success: function (res) {
that.web_url = return_url
// 轉發成功
wx.showToast({
title: "轉發成功",
icon: 'success',
duration: 2000
})
},
fail: function (res) {
// 轉發失敗
}
}
},
onLoad: function () {
var pages=getCurrentPages();
var currentPage = pages[pages.length - 1];
var web_src = decodeURIComponent(currentPage.options.return_url ||
encodeURIComponent("你的內嵌網頁網址"))
this.web_url = web_src
this.setData({
web_src: web_src
}, function () {
});
}
})
複製代碼
寫到這裏,終於大功告成了。 可是!!! 測試出問題了!!!分享後跳不到想要的頁面!!! 找了n小時的bug,也看不出上面代碼思路和實現有何問題。因爲此項技術也剛發佈不久,市面上幾乎沒有能夠參考的文章,只能本身硬着頭皮找。 找啊找,終於在今天早上找到了這個坑。 因爲內嵌網頁是單頁面應用,在手機上測試的時候webViewUrl的獲取每次都會出現問題,只有跳轉方式換成通常的多頁面應用的跳轉方式,好比a標籤href等跳轉方式,而不是router-link這種方式(以vue爲例),這個問題纔不會出現。 也不知道這是否是個微信的bug,總之需求實現了,仍是很開心的。api
以爲筆者寫得不錯,能夠點個贊噠!!! 若是此文中有不對的地方,歡迎你們指正交流!!!微信