lxwphp
/**
 * 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
來源:简书
简书著作权归作者所有,任何形式的转载都请联系作者获得授权并注明出处。

 

分类:

技术点:

相关文章: