轉載:http://www.cnblogs.com/liuyongjia/p/7581813.htmljavascript
在h5的頁面開發中,分享是不可或缺的一部分,對於一些傳播性比較強的頁面,活動頁之類的,分享功能極爲重要。例如,京東等電商年底時會有一系列的總結h5在微信中傳播,就不得不提到微信的分享機制。html
微信分享靜態頁
微信分享須要後臺回傳時間戳、簽名等信息,若是頁面比較簡單,就能夠用下述方法作簡單設置。
微信默認抓取第一張符合要求的圖片做爲分享圖,圖片大於300px × 300px,圖片不能是display:none的。
根據上述規則,img的設置能夠爲這樣:前端
<img src="//img30.360buyimg.com/mobilecms/jfs/t4033/80/1876911537/17072/11729313/589bec20Nc5555ece.jpg" style="position:absolute;width:100%;z-index:0;">
要記得把這張圖片放到最前面,若是網頁加載了其餘符合規則的圖片,也能保證正常分享。
(以前看到過一個weixinjsbridge的源碼,抓取的規則大概是這樣,具體忘記了,後面也找不到那個源代碼了,若是有錯誤,請通知我。)
分享標題是取頁面標題,可使用js動態修改標題,可是iOS下會有問題,有關修改title的hack,方法以下。java
/** * 處理微信設置title問題 * 頁面在加載完成後設置title在微信下不會觸發改變 */ define(function(){ return function(src){ var frame = document.createElement('iframe'),flag = false; frame.style.display = 'none'; frame.onload=frame.onerror=frame.onreadystatechange=function(){ if(flag){return} flag = true; setTimeout(function(){document.body.removeChild(frame)},0) }; // frame.src = src? (src + (src.indexOf('?') != -1?'&':'?') + '__=' + Date.now()) : '/favicon.ico', document.body.appendChild(frame); } });
相似的hack有不少,基於jquery、原生的也有不少,基本原理就是使用iframe。jquery
以後分享之後,在朋友圈是這樣
與好友分享後是這樣
若是對於分享的要求不高,上面的方法就能夠了。
But,怎麼可能?web
在傳播性極強的h5活動頁中,常常會須要帶有不一樣的圖片、定製的描述、title等等,此時,必需要申請一個公衆號,而且須要後臺的配合,才能完整的使用微信的分享功能。
申請公衆號交給產品,開發接口交給網關,前端要作什麼呢?
先放個官方文檔連接,我來簡述步驟,若是有疑問,能夠留言,或者查閱官方文檔。ajax
end
簡單吧,官方文檔十分詳細,接下來分享一個方法,你們能夠自行參考修改。api
var wxShares = function(title, desc, link, imgUrl) { // req爲我封裝的一個ajax方法 req({ url: '//youdomainulr.com', // 請求接口url success: function(data) { if (typeof data == "string") { data = JSON.parse(data); } // 具體的數據結構不必定是這樣,只是例子 var appId = data.shareResult.appId, timestamp = data.shareResult.timestamp, nonceStr = data.shareResult.nonceStr, signature = data.shareResult.signature; wx.config({ debug: false, // 開啓調試模式,調用的全部api的返回值會在客戶端alert出來,若要查看傳入的參數,能夠在pc端打開,參數信息會經過log打出,僅在pc端時纔會打印。 appId: appId, // 必填,公衆號的惟一標識 timestamp: timestamp, // 必填,生成簽名的時間戳 nonceStr: nonceStr, // 必填,生成簽名的隨機串 signature: signature, // 必填,簽名,見附錄1 jsApiList: ['checkJsApi', 'openLocation', 'getLocation', 'onMenuShareTimeline', 'onMenuShareAppMessage' ] // 必填,須要使用的JS接口列表,全部JS接口列表見附錄2 }); wx.ready(function() { wx.checkJsApi({ jsApiList: [ 'getLocation', 'onMenuShareTimeline', 'onMenuShareAppMessage' ], success: function(res) { // alert(JSON.stringify(res)); } }); wx.onMenuShareAppMessage({ title: title, // 分享標題 desc: desc, // 分享描述 link: link, // 分享連接 imgUrl: imgUrl, // 分享圖標 type: 'link', // 分享類型,music、video或link,不填默認爲link dataUrl: '', // 若是type是music或video,則要提供數據連接,默認爲空 success: function() { console.log("分享成功"); // 用戶確認分享後執行的回調函數 }, cancel: function() { // 用戶取消分享後執行的回調函數 } }); wx.onMenuShareTimeline({ title: title, // 分享標題 link: link, // 分享連接 imgUrl: imgUrl, // 分享圖標 success: