博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
微信开发-微信内置浏览器的Javascript API
阅读量:4967 次
发布时间:2019-06-12

本文共 17562 字,大约阅读时间需要 58 分钟。

源代码来自

/**! * 微信内置浏览器的Javascript API,功能包括: * * 1、分享到微信朋友圈 * 2、分享给微信好友 * 3、分享到腾讯微博 * 4、隐藏/显示右上角的菜单入口 * 5、隐藏/显示底部浏览器工具栏 * 6、获取当前的网络状态 * 7、调起微信客户端的图片播放组件 * 8、关闭公众平台Web页面 * 9、判断当前网页是否在微信内置浏览器中打开 * 10、支持WeixinApi的错误监控 * 11、发送电子邮件 * 12、禁止用户分享 * */(function (window) {    "use strict";    /**     * 定义WeixinApi     */    var WeixinApi = {        version: 4.3    };    // 将WeixinApi暴露到window下:全局可使用,对旧版本向下兼容    window.WeixinApi = WeixinApi;    /// CommonJS /    if (typeof define === 'function' && (define.amd || define.cmd)) {        if (define.amd) {            // AMD 规范,for:requirejs            define(function () {                return WeixinApi;            });        } else if (define.cmd) {            // CMD 规范,for:seajs            define(function (require, exports, module) {                module.exports = WeixinApi;            });        }    }    /**     * 对象简单继承,后面的覆盖前面的,继承深度:deep=1     * @private     */    var _extend = function () {        var result = {}, obj, k;        for (var i = 0, len = arguments.length; i < len; i++) {            obj = arguments[i];            if (typeof obj === 'object') {                for (k in obj) {                    obj[k] && (result[k] = obj[k]);                }            }        }        return result;    };    /**     * 内部私有方法,分享用     * @private     */    var _share = function (cmd, data, callbacks) {        callbacks = callbacks || {};        // 分享过程中的一些回调        var progress = function (resp) {            switch (true) {                // 用户取消                case /\:cancel$/i.test(resp.err_msg) :                    callbacks.cancel && callbacks.cancel(resp);                    break;                // 发送成功                case /\:(confirm|ok)$/i.test(resp.err_msg):                    callbacks.confirm && callbacks.confirm(resp);                    break;                // fail 发送失败                case /\:fail$/i.test(resp.err_msg) :                default:                    callbacks.fail && callbacks.fail(resp);                    break;            }            // 无论成功失败都会执行的回调            callbacks.all && callbacks.all(resp);        };        // 执行分享,并处理结果        var handler = function (theData, argv) {            // 加工一下数据            if (cmd.menu == 'menu:share:timeline' ||                (cmd.menu == 'general:share' && argv.shareTo == 'timeline')) {                var title = theData.title;                theData.title = theData.desc || title;                theData.desc = title || theData.desc;            }            // 如果是收藏操作,并且在wxCallbacks中配置了favorite为false,则不执行回调            if (argv && (argv.shareTo == 'favorite' || argv.scene == 'favorite')) {                if (callbacks.favorite === false) {                    WeixinJSBridge.invoke('sendAppMessage', theData, new Function());                } else {                    WeixinJSBridge.invoke(cmd.action, theData, progress);                }            } else {                // 新的分享接口,单独处理                if (cmd.menu === 'general:share') {                    if (argv.shareTo === 'timeline') {                        WeixinJSBridge.invoke('shareTimeline', theData, progress);                    } else if (argv.shareTo === 'friend') {                        WeixinJSBridge.invoke('sendAppMessage', theData, progress);                    } else if (argv.shareTo === 'QQ') {                        WeixinJSBridge.invoke('shareQQ', theData, progress);                    } else if (argv.shareTo === 'weibo') {                        WeixinJSBridge.invoke('shareWeibo', theData, progress);                    }                } else {                    WeixinJSBridge.invoke(cmd.action, theData, progress);                }            }        };        // 监听分享操作        WeixinJSBridge.on(cmd.menu, function (argv) {            callbacks.dataLoaded = callbacks.dataLoaded || new Function();            if (callbacks.async && callbacks.ready) {                WeixinApi["_wx_loadedCb_"] = callbacks.dataLoaded;                if (WeixinApi["_wx_loadedCb_"].toString().indexOf("_wx_loadedCb_") > 0) {                    WeixinApi["_wx_loadedCb_"] = new Function();                }                callbacks.dataLoaded = function (newData) {                    callbacks.__cbkCalled = true;                    var theData = _extend(data, newData);                    theData.img_url = theData.imgUrl || theData.img_url;                    delete theData.imgUrl;                    WeixinApi["_wx_loadedCb_"](theData);                    handler(theData, argv);                };                // 然后就绪                if (!(argv && (argv.shareTo == 'favorite' || argv.scene == 'favorite') && callbacks.favorite === false)) {                    callbacks.ready && callbacks.ready(argv, data);                    // 如果设置了async为true,但是在ready方法中并没有手动调用dataLoaded方法,则自动触发一次                    if (!callbacks.__cbkCalled) {                        callbacks.dataLoaded({});                        callbacks.__cbkCalled = false;                    }                }            } else {                // 就绪状态                var theData = _extend(data);                if (!(argv && (argv.shareTo == 'favorite' || argv.scene == 'favorite') && callbacks.favorite === false)) {                    callbacks.ready && callbacks.ready(argv, theData);                }                handler(theData, argv);            }        });    };    /**     * 分享到微信朋友圈     * @param       {Object}    data       待分享的信息     * @p-config    {String}    appId      公众平台的appId(服务号可用)     * @p-config    {String}    imgUrl     图片地址     * @p-config    {String}    link       链接地址     * @p-config    {String}    desc       描述     * @p-config    {String}    title      分享的标题     *     * @param       {Object}    callbacks  相关回调方法     * @p-config    {Boolean}   async                   ready方法是否需要异步执行,默认false     * @p-config    {Function}  ready(argv, data)       就绪状态     * @p-config    {Function}  dataLoaded(data)        数据加载完成后调用,async为true时有用,也可以为空     * @p-config    {Function}  cancel(resp)    取消     * @p-config    {Function}  fail(resp)      失败     * @p-config    {Function}  confirm(resp)   成功     * @p-config    {Function}  all(resp)       无论成功失败都会执行的回调     */    WeixinApi.shareToTimeline = function (data, callbacks) {        _share({            menu: 'menu:share:timeline',            action: 'shareTimeline'        }, {            "appid": data.appId ? data.appId : '',            "img_url": data.imgUrl,            "link": data.link,            "desc": data.desc,            "title": data.title,            "img_width": "640",            "img_height": "640"        }, callbacks);    };    /**     * 发送给微信上的好友     * @param       {Object}    data       待分享的信息     * @p-config    {String}    appId      公众平台的appId(服务号可用)     * @p-config    {String}    imgUrl     图片地址     * @p-config    {String}    link       链接地址     * @p-config    {String}    desc       描述     * @p-config    {String}    title      分享的标题     *     * @param       {Object}    callbacks  相关回调方法     * @p-config    {Boolean}   async                   ready方法是否需要异步执行,默认false     * @p-config    {Function}  ready(argv, data)       就绪状态     * @p-config    {Function}  dataLoaded(data)        数据加载完成后调用,async为true时有用,也可以为空     * @p-config    {Function}  cancel(resp)    取消     * @p-config    {Function}  fail(resp)      失败     * @p-config    {Function}  confirm(resp)   成功     * @p-config    {Function}  all(resp)       无论成功失败都会执行的回调     */    WeixinApi.shareToFriend = function (data, callbacks) {        _share({            menu: 'menu:share:appmessage',            action: 'sendAppMessage'        }, {            "appid": data.appId ? data.appId : '',            "img_url": data.imgUrl,            "link": data.link,            "desc": data.desc,            "title": data.title,            "img_width": "640",            "img_height": "640"        }, callbacks);    };    /**     * 分享到腾讯微博     * @param       {Object}    data       待分享的信息     * @p-config    {String}    link       链接地址     * @p-config    {String}    desc       描述     *     * @param       {Object}    callbacks  相关回调方法     * @p-config    {Boolean}   async                   ready方法是否需要异步执行,默认false     * @p-config    {Function}  ready(argv, data)       就绪状态     * @p-config    {Function}  dataLoaded(data)        数据加载完成后调用,async为true时有用,也可以为空     * @p-config    {Function}  cancel(resp)    取消     * @p-config    {Function}  fail(resp)      失败     * @p-config    {Function}  confirm(resp)   成功     * @p-config    {Function}  all(resp)       无论成功失败都会执行的回调     */    WeixinApi.shareToWeibo = function (data, callbacks) {        _share({            menu: 'menu:share:weibo',            action: 'shareWeibo'        }, {            "content": data.desc,            "url": data.link        }, callbacks);    };    /**     * 新的分享接口     * @param       {Object}    data       待分享的信息     * @p-config    {String}    appId      公众平台的appId(服务号可用)     * @p-config    {String}    imgUrl     图片地址     * @p-config    {String}    link       链接地址     * @p-config    {String}    desc       描述     * @p-config    {String}    title      分享的标题     *     * @param       {Object}    callbacks  相关回调方法     * @p-config    {Boolean}   async                   ready方法是否需要异步执行,默认false     * @p-config    {Function}  ready(argv, data)       就绪状态     * @p-config    {Function}  dataLoaded(data)        数据加载完成后调用,async为true时有用,也可以为空     * @p-config    {Function}  cancel(resp)    取消     * @p-config    {Function}  fail(resp)      失败     * @p-config    {Function}  confirm(resp)   成功     * @p-config    {Function}  all(resp)       无论成功失败都会执行的回调     */    WeixinApi.generalShare = function (data, callbacks) {        _share({            menu: 'general:share'        }, {            "appid": data.appId ? data.appId : '',            "img_url": data.imgUrl,            "link": data.link,            "desc": data.desc,            "title": data.title,            "img_width": "640",            "img_height": "640"        }, callbacks);    };    /**     * 设置页面禁止分享:包括朋友圈、好友、腾讯微博、qq     * @param callback     */    WeixinApi.disabledShare = function (callback) {        callback = callback || function () {            alert('当前页面禁止分享!');        };        ['menu:share:timeline', 'menu:share:appmessage', 'menu:share:qq',            'menu:share:weibo', 'general:share'].forEach(function (menu) {                WeixinJSBridge.on(menu, function () {                    callback();                    return false;                });            });    };    /**     * 调起微信Native的图片播放组件。     * 这里必须对参数进行强检测,如果参数不合法,直接会导致微信客户端crash     *     * @param {String} curSrc 当前播放的图片地址     * @param {Array} srcList 图片地址列表     */    WeixinApi.imagePreview = function (curSrc, srcList) {        if (!curSrc || !srcList || srcList.length == 0) {            return;        }        WeixinJSBridge.invoke('imagePreview', {            'current': curSrc,            'urls': srcList        });    };    /**     * 显示网页右上角的按钮     */    WeixinApi.showOptionMenu = function () {        WeixinJSBridge.call('showOptionMenu');    };    /**     * 隐藏网页右上角的按钮     */    WeixinApi.hideOptionMenu = function () {        WeixinJSBridge.call('hideOptionMenu');    };    /**     * 显示底部工具栏     */    WeixinApi.showToolbar = function () {        WeixinJSBridge.call('showToolbar');    };    /**     * 隐藏底部工具栏     */    WeixinApi.hideToolbar = function () {        WeixinJSBridge.call('hideToolbar');    };    /**     * 返回如下几种类型:     *     * network_type:wifi     wifi网络     * network_type:edge     非wifi,包含3G/2G     * network_type:fail     网络断开连接     * network_type:wwan     2g或者3g     *     * 使用方法:     * WeixinApi.getNetworkType(function(networkType){     *     * });     *     * @param callback     */    WeixinApi.getNetworkType = function (callback) {        if (callback && typeof callback == 'function') {            WeixinJSBridge.invoke('getNetworkType', {}, function (e) {                // 在这里拿到e.err_msg,这里面就包含了所有的网络类型                callback(e.err_msg);            });        }    };    /**     * 关闭当前微信公众平台页面     * @param       {Object}    callbacks       回调方法     * @p-config    {Function}  fail(resp)      失败     * @p-config    {Function}  success(resp)   成功     */    WeixinApi.closeWindow = function (callbacks) {        callbacks = callbacks || {};        WeixinJSBridge.invoke("closeWindow", {}, function (resp) {            switch (resp.err_msg) {                // 关闭成功                case 'close_window:ok':                    callbacks.success && callbacks.success(resp);                    break;                // 关闭失败                default :                    callbacks.fail && callbacks.fail(resp);                    break;            }        });    };    /**     * 当页面加载完毕后执行,使用方法:     * WeixinApi.ready(function(Api){     *     // 从这里只用Api即是WeixinApi     * });     * @param readyCallback     */    WeixinApi.ready = function (readyCallback) {        /**         * 加一个钩子,同时解决Android和iOS下的分享问题         * @private         */        var _hook = function () {            var _WeixinJSBridge = {};            Object.keys(WeixinJSBridge).forEach(function (key) {                _WeixinJSBridge[key] = WeixinJSBridge[key];            });            Object.keys(WeixinJSBridge).forEach(function (key) {                if (typeof WeixinJSBridge[key] === 'function') {                    WeixinJSBridge[key] = function () {                        try {                            var args = arguments.length > 0 ? arguments[0] : {},                                runOn3rd_apis = args.__params ? args.__params.__runOn3rd_apis || [] : [];                            ['menu:share:timeline', 'menu:share:appmessage', 'menu:share:weibo',                                'menu:share:qq', 'general:share'].forEach(function (menu) {                                    runOn3rd_apis.indexOf(menu) === -1 && runOn3rd_apis.push(menu);                                });                        } catch (e) {                        }                        return _WeixinJSBridge[key].apply(WeixinJSBridge, arguments);                    };                }            });        };        if (readyCallback && typeof readyCallback == 'function') {            var Api = this;            var wxReadyFunc = function () {                _hook();                readyCallback(Api);            };            if (typeof window.WeixinJSBridge == "undefined") {                if (document.addEventListener) {                    document.addEventListener('WeixinJSBridgeReady', wxReadyFunc, false);                } else if (document.attachEvent) {                    document.attachEvent('WeixinJSBridgeReady', wxReadyFunc);                    document.attachEvent('onWeixinJSBridgeReady', wxReadyFunc);                }            } else {                wxReadyFunc();            }        }    };    /**     * 判断当前网页是否在微信内置浏览器中打开     */    WeixinApi.openInWeixin = function () {        return /MicroMessenger/i.test(navigator.userAgent);    };    /**     * 发送邮件     * @param       {Object}  data      邮件初始内容     * @p-config    {String}  subject   邮件标题     * @p-config    {String}  body      邮件正文     *     * @param       {Object}    callbacks       相关回调方法     * @p-config    {Function}  fail(resp)      失败     * @p-config    {Function}  success(resp)   成功     * @p-config    {Function}  all(resp)       无论成功失败都会执行的回调     */    WeixinApi.sendEmail = function (data, callbacks) {        callbacks = callbacks || {};        WeixinJSBridge.invoke("sendEmail", {            "title": data.subject,            "content": data.body        }, function (resp) {            if (resp.err_msg === 'send_email:sent') {                callbacks.success && callbacks.success(resp);            } else {                callbacks.fail && callbacks.fail(resp);            }            callbacks.all && callbacks.all(resp);        })    };    /**     * 开启Api的debug模式,比如出了个什么错误,能alert告诉你,而不是一直很苦逼的在想哪儿出问题了     * @param    {Function}  callback(error) 出错后的回调,默认是alert     */    WeixinApi.enableDebugMode = function (callback) {        /**         * @param {String}  errorMessage   错误信息         * @param {String}  scriptURI      出错的文件         * @param {Long}    lineNumber     出错代码的行号         * @param {Long}    columnNumber   出错代码的列号         */        window.onerror = function (errorMessage, scriptURI, lineNumber, columnNumber) {            // 有callback的情况下,将错误信息传递到options.callback中            if (typeof callback === 'function') {                callback({                    message: errorMessage,                    script: scriptURI,                    line: lineNumber,                    column: columnNumber                });            } else {                // 其他情况,都以alert方式直接提示错误信息                var msgs = [];                msgs.push("额,代码有错。。。");                msgs.push("\n错误信息:", errorMessage);                msgs.push("\n出错文件:", scriptURI);                msgs.push("\n出错位置:", lineNumber + '行,' + columnNumber + '列');                alert(msgs.join(''));            }        }    };    /**     * 通用分享,一种简便的写法     * @param wxData     * @param wxCallbacks     */    WeixinApi.share = function (wxData, wxCallbacks) {        WeixinApi.ready(function (Api) {            // 用户点开右上角popup菜单后,点击分享给好友,会执行下面这个代码            Api.shareToFriend(wxData, wxCallbacks);            // 点击分享到朋友圈,会执行下面这个代码            Api.shareToTimeline(wxData, wxCallbacks);            // 点击分享到腾讯微博,会执行下面这个代码            Api.shareToWeibo(wxData, wxCallbacks);            // 分享到各渠道            Api.generalShare(wxData, wxCallbacks);        });    };})(window);

 

转载于:https://www.cnblogs.com/tiggerinchengdu/p/4511989.html

你可能感兴趣的文章
Xml处理工具类(Jdom)
查看>>
返回文件路径中的想要的值
查看>>
hdu1502 , Regular Words, dp,高精度加法
查看>>
maven常用配置信息和常量
查看>>
20120227_CET6
查看>>
SpringBoot在idea中的热部署配置
查看>>
MyEclipse连接SQL Server 2008数据库的操作方法
查看>>
SqlCel 和MySQL for Excel在批量处理数据上的优劣
查看>>
leetcode【67】-Bulb Switcher
查看>>
JS验证图片格式和大小并预览
查看>>
调节心态的十种做法
查看>>
laravel5.2 移植到新服务器上除了“/”路由 ,其它路由对应的页面显示报404错误(Object not found!)———新装的LAMP没有加载Rewrite模块...
查看>>
潜罪犯
查看>>
编写高质量代码--改善python程序的建议(六)
查看>>
windows xp 中的administrator帐户不在用户登录内怎么解决?
查看>>
[spfa] Jzoj P4722 跳楼机
查看>>
代码审计入门后审计技巧
查看>>
Linux-Rsync服务器/客户端搭建实战
查看>>
接口和抽象类有什么区别
查看>>
简单通过百度api自动获取定位-前端实现
查看>>