/** * mshare.js * 此插件主要作用是在UC和QQ两个主流浏览器 * 上面触发微信分享到朋友圈或发送给朋友的功能 * 代码编写过程中 参考: * http://mjs.sinaimg.cn/wap/module/share/201501261608/js/addShare.js * 此外,JefferyWang的项目对我也有一定启示: * https://github.com/JefferyWang/nativeShare.js * * @revisor angusfu1126@qq.com * @date 2015-07-22 */ !(function(global) { 'use strict'; var UA, uc, qq, wx, tc, qqVs, ucVs, os,qqBridgeDone; UA = navigator.appVersion; // 是否是 UC 浏览器 uc = UA.split('UCBrowser/').length > 1 ? 1 : 0; // 判断 qq 浏览器 // 然而qq浏览器分高低版本 2代表高版本 1代表低版本 qq = UA.split('MQQBrowser/').length > 1 ? 2 : 0; // 是否是微信 wx = ((UA.match(/MicroMessenger/i)) && (UA.match(/MicroMessenger/i).toString().toLowerCase() == 'micromessenger')); // 浏览器版本 qqVs = qq ? parseFloat(UA.split('MQQBrowser/')[1]) : 0; ucVs = uc ? parseFloat(UA.split('UCBrowser/')[1]) : 0; //获取操作系统信息 iPhone(1) Android(2) os = (function () { var ua = navigator.userAgent; if (/iphone|ipod/i.test(ua)) { return 1; } else if(/android/i.test(ua)){ return 2; } else { return 0; } }()); // qq浏览器下面 是否加载好了相应的api文件 qqBridgeDone = false; // 进一步细化版本和平台判断 // 参考: https://github.com/JefferyWang/nativeShare.js // http://mjs.sinaimg.cn/wap/module/share/201501261608/js/addShare.js if ((qq && qqVs < 5.4 && os == 1) || (qq && qqVs < 5.3 && os == 1)) { qq = 0; } else { if (qq && qqVs < 5.4 && os == 2) { qq = 1; } else { if (uc && ( (ucVs < 10.2 && os == 1) || (ucVs < 9.7 && os == 2) )) { uc = 0; } } } /** * qq浏览器下面 根据不同版本 加载对应的bridge * @method loadqqApi * @param {Function} cb 回调函数 */ function loadqqApi(cb) { if (!qq) { // qq == 0 return cb && cb(); } var qqApiScript = document.createElement('script'); //需要等加载过qq的接口文档之后,再去初始化分享组件 qqApiScript.onload = function () {cb && cb();}; qqApiScript.onerror = function () {}; // qq == 1 低版本 // qq == 2 高版本 qqApiScript.src = (qq == 1 ) ? 'http://3gimg.qq.com/html5/js/qb.js' : 'http://jsapi.qq.com/get?api=app.share'; document.body.appendChild(qqApiScript); } /** * UC浏览器分享 * @method ucShare */ function ucShare(config) { // ['title', 'content', 'url', 'platform', 'disablePlatform', 'source', 'htmlID'] // 关于platform // ios: kWeixin || kWeixinFriend; // android: WechatFriends || WechatTimeline // uc 分享会直接使用截图 var platform = '', shareInfo; // 指定了分享类型 if (config.type) { if (os == 2) { platform = config.type == 1 ? 'WechatTimeline' : 'WechatFriends'; } else if (os == 1) { platform = config.type == 1 ? 'kWeixinFriend' : 'kWeixin'; } } shareInfo = [ config.title, config.desc, config.url, platform, '', '', '' ]; // android if (window.ucweb) { ucweb.startRequest && ucweb.startRequest('shell.page_share', shareInfo); } // ios else if (window.ucbrowser) { ucbrowser.web_share && ucbrowser.web_share.apply(null, shareInfo); } }; /** * qq浏览器分享函数 * @method qqShare */ function qqShare(config) { var type = config.type; //微信好友1, 微信朋友圈8 type = type ? ((type == 1) ? 8 : 1) : ''; var share = function () { var shareInfo = { 'url': config.url, 'title': config.title, 'description': config.desc, 'img_url': config.img, 'img_title': config.title, 'to_app': type, 'cus_txt': '' }; if (window.browser) { browser.app && browser.app.share(shareInfo); } else if (window.qb) { qb.share && qb.share(shareInfo); } }; if (qqBridgeDone) { share(); } else { loadqqApi(share); } }; /** * 对外暴露的接口函数 * @method mShare * @param {Object} config 配置对象 参数见示例 * var config = { * title : 'Lorem ipsum dolor sit.' * , url : 'http://m.ly.com' * , desc : 'Lorem ipsum dolor sit amet, consectetur adipisicing elit. Quaerat inventore minima voluptates.' * , img : 'http://img1.40017.cn/cn/s/c/2015/loading.gif' * , type : type // 1 ==> 朋友圈 2 ==> 朋友 0 ==> 直接弹出原生 * } */ function mShare(config) { this.check = function (succssFn, wxFn, failFn) { if (uc) { succssFn(); } else if (qq && !wx) { succssFn(); } else if (wx) { wxFn(); } else { failFn(); } } this.config = config; this.init = function (type) { if (typeof type != 'undefined') this.config.type = type; try { if (uc) { ucShare(this.config); } else if (qq && !wx) { qqShare(this.config); } } catch (e) {} } } // 预加载 qq bridge loadqqApi(function () { qqBridgeDone = true; }); // 方法暴露给全局变量 global.mShare = mShare; })(this); //=====================这是分割线===================================== <div class="sharePage"> <div class="sharePage_background"></div> <div class="sharePage_bottom"> <div class="share_mode"> <div class="share_mode_header">分享至</div> <div class="share_mode_content"> <ul class="clearfix"> <li class="WeChat mshare" mshare="2"> <span></span> <i>微信</i> </li> <li class="moments mshare" mshare="1"> <span></span> <i>朋友圈</i> </li> </ul> </div> </div> <div class="share_cancel"> 取消 </div> </div> <div class="sharePage_arrow"> <span></span> <p>点击微信右上角按钮进行分享</p> </div> </div> <script src="http://res.wx.qq.com/open/js/jweixin-1.0.0.js"></script> <script src="/mobile/js/lib/jquery-2.0.3.min.js"></script> <script src="/mobile/js/lib/mshare.js"></script> <script> var mshare = new mShare({ title : '{{shareTitle}}', url : '{{shareUrl}}', desc : '{{shareDesc}}', img : '{{sharePic}}' }); mshare.check( function () {//支持原生分享 browserShow (); $('.mshare').click(function () { // 1 ==> 朋友圈 2 ==> 朋友 0 ==> 直接弹出原生 mshare.init(+$(this).attr('mshare')); }); }, function () {//微信中支持微信分享 WeChatShow (); wx.config({ debug: false, appId: "{{options['appid']}}", timestamp: "{{options['timestamp']}}", nonceStr: "{{options['nonceStr']}}", signature: "{{options['signature']}}", jsApiList: [ 'checkJsApi', 'onMenuShareTimeline', 'onMenuShareAppMessage' ] }); wx.ready(function(){ wx.checkJsApi({ jsApiList: ['onMenuShareTimeline', 'onMenuShareAppMessage'], // 需要检测的JS接口列表,所有JS接口列表见附录2, success: function(res) { //alert("检测结果" + res.errMsg); // 以键值对的形式返回,可用的api值true,不可用为false // 如:{"checkResult":{"chooseImage":true},"errMsg":"checkJsApi:ok"} } }); wx.onMenuShareTimeline({ title: '{{shareTitle}}', // 分享标题 link: '{{shareUrl}}', // 分享链接 imgUrl: '{{sharePic}}', // 分享图标 success: function () { //alert("分享到微信朋友圈成功"); // 用户确认分享后执行的回调函数 }, cancel: function () { //alert("取消分享"); // 用户取消分享后执行的回调函数 } }); wx.onMenuShareAppMessage({ title: '{{shareTitle}}', // 分享标题 link: '{{shareUrl}}', // 分享链接 imgUrl: '{{sharePic}}', // 分享图标 desc: "{{shareDesc}}", // 分享描述 type: 'link', // 分享类型,music、video或link,不填默认为link dataUrl: '', // 如果type是music或video,则要提供数据链接,默认为空 success: function () { //alert("分享到微信好友成功"); // 用户确认分享后执行的回调函数 }, cancel: function () { // 用户取消分享后执行的回调函数 //alert("取消分享") } }); // config信息验证后会执行ready方法,所有接口调用都必须在config接口获得结果之后,config是一个客户端的异步操作,所以如果需要在页面加载时就调用相关接口,则须把相关接口放在ready函数中调用来确保正确执行。对于用户触发时才调用的接口,则可以直接调用,不需要放在ready函数中。 }); wx.error(function(res){ //alert('error'); // config信息验证失败会执行error函数,如签名过期导致验证失败,具体错误信息可以打开config的debug模式查看,也可以在返回的res参数中查看,对于SPA可以在这里更新签名。 }); }, function () {//不支持分享 shareHide(); } ); //在浏览器中打开 function browserShow () { //点击分享按钮 $('.share_button').show(); $('.share_button').click(function () { $('.sharePage').addClass('sharePage_active'); $('.sharePage_bottom').animate({ bottom:0 },300); }); //点击取消按钮 $('.share_cancel').click(function () { $('.sharePage_bottom').animate({ bottom:-$('.sharePage_bottom').height()+'px' },300,function () { $('.sharePage').removeClass('sharePage_active'); }); }); //点击黑色背景,整个分享页面消失 $('.sharePage_background').click(function () { $('.sharePage_bottom').animate({ bottom:-$('.sharePage_bottom').height()+'px' },300,function () { $('.sharePage').removeClass('sharePage_active'); }); }); } //在微信中打开 function WeChatShow () { //点击分享按钮 $('.share_button').show(); $('.share_button').click(function () { $('.sharePage').addClass('sharePage_active'); $('.sharePage_arrow').addClass('sharePage_arrow_active'); }); //点击黑色背景整个分享页面消失 $('.sharePage_arrow').click(function () { $('.sharePage').removeClass('sharePage_active'); $('.sharePage_arrow').removeClass('sharePage_arrow_active'); }); } function shareHide() { $('.share_button').hide(); } </script> 作者:beijing_beijing 链接:https://www.jianshu.com/p/3d6503c68474 來源:简书 简书著作权归作者所有,任何形式的转载都请联系作者获得授权并注明出处。
评论(0)