/****
1、需要依赖qqapi(http://pub.idqqimg.com/qqmobile/qqapi.js?v=201411031048)
2、动态修改主动分享内容需调用paipai_h5_share.setWXMsg或paipai_h5_share.setQQMsg
3、微信中分享支持回调,手q中暂不支持
调用方法:
1、引用本文件。
2、监听加载完毕后,可通过paipai_h5_share对象的init方法来初始化组件。
传入参数的数据结构如下:
{
hideWXOptionMenu:false,
hideQQOptionMenu:false,
hideQQ: false,
hideQzone: false,
hideTqq: false,
hideWeibo: false,
hideMask: false,
beforeSend: function() {},
done: function() {},
weibo: {
title: "",
share_url: "",
ptag: "",
image_url: "",
appkey: ""
},
qq: {
title: "",
desc: "",
share_url: "",
ptag: "",
image_url: ""
},
qzone: {
title: "",
desc: "",
share_url: "",
ptag: "",
image_url: ""
},
weixin: {
title: "",
desc: "",
share_url: "",
ptag: "",
image_url: ""
},
weixinFriend: {
title: "",
share_url: "",
desc: "",
ptag: "",
image_url: ""
},
tqq: {
title: "",
desc: "",
share_url: "",
ptag: "",
image_url: ""
}
};
****/
window.SHARE_SOURCECODE = (function() {
(function(window) {
var isWXReady = false,
requestCount = 0;
var globalParams = {
hideWXOptionMenu: false,
hideQQOptionMenu: false,
hideQQ: false,
hideQzone: false,
hideTqq: false,
hideWeibo: false,
hideMask: false,
beforeSend: function() {},
done: function() {},
weibo: {
title: "",
share_url: "",
ptag: "",
image_url: "",
appkey: ""
},
qq: {
title: "",
desc: "",
share_url: "",
ptag: "",
image_url: "",
trigger: function(res) {
// 不要尝试在trigger中使用ajax异步请求修改本次分享的内容,因为客户端分享操作是一个同步操作,这时候使用ajax的回包会还没有返回
},
success: function(res) {
globalParams.done({'status':'ok'});
},
cancel: function(res) {
globalParams.done({'status':'cancel'});
},
fail: function(res) {
globalParams.done({'status':'fail'});
}
},
qzone: {
title: "",
desc: "",
share_url: "",
ptag: "",
image_url: ""
},
weixin: {
title: "",
desc: "",
share_url: "",
ptag: "",
image_url: "",
trigger: function(res) {
// 不要尝试在trigger中使用ajax异步请求修改本次分享的内容,因为客户端分享操作是一个同步操作,这时候使用ajax的回包会还没有返回
},
success: function(res) {
globalParams.done({'status':'ok'});
},
cancel: function(res) {
globalParams.done({'status':'cancel'});
},
fail: function(res) {
globalParams.done({'status':'fail'});
}
},
weixinFriend: {
title: "",
share_url: "",
desc: "",
ptag: "",
image_url: "",
trigger: function(res) {
// 不要尝试在trigger中使用ajax异步请求修改本次分享的内容,因为客户端分享操作是一个同步操作,这时候使用ajax的回包会还没有返回
},
success: function(res) {
globalParams.done({'status':'ok'});
},
cancel: function(res) {
globalParams.done({'status':'cancel'});
},
fail: function(res) {
globalParams.done({'status':'fail'});
}
},
tqq: {
title: "",
desc: "",
share_url: "",
ptag: "",
image_url: ""
}
};
var UA = navigator.userAgent;
var Utils = {
JSONP: function(options) {
if (!options.url) {
return;
}
var t = +new Date(),
empty = function() {},
callbackName = typeof options.callbackName === 'string' ? options.callbackName : 'Jsonp' + (Math.random() + '').replace(/\D/g, '') + '_' + t,
callback = typeof options.callback === 'function' ? options.callback : empty,
timeout = options.timeout || 5000,
timer = null,
head = document.head || document.getElementsByTagName('head')[0] || document.documentElement,
script = document.createElement('script'),
isCleared = false;
function clear() {
if (isCleared) {
return;
}
isCleared = true;
delete window[callbackName];
script.onerror = script.onload = null;
head.removeChild(script);
if (timer) {
clearTimeout(timer);
timer = null;
}
}
function getFormattedUrl() {
var data = options.data || {},
param = [],
url = options.url,
callbackParam = options.callbackParam || 'callback';
data[callbackParam] = callbackName;
for (var key in data) {
param.push(key + '=' + data[key]);
}
url += (url.indexOf('?') > -1 ? '&' : '?') + param.join('&');
return url;
}
function abort() {
clear();
window[callbackName] = function() {};
}
window[callbackName] = function(data) {
callback.apply(null, arguments);
clear();
}
if (timer) {
window.setTimeout(clear, timeout);
}
script.type = 'text/javascript';
script.src = getFormattedUrl();
script.onerror = script.onload = clear;
head.appendChild(script);
return {
abort: abort
};
},
getCookie: function(name) {
var reg = new RegExp("(^| )" + name + "(?:=([^;]*))?(;|$)"),
val = document.cookie.match(reg);
return val ? (val[2] ? unescape(val[2]) : "") : null;
},
'loadJS': function(src, callback) {
var readyRE = /complete|loaded|interactive/;
var doc = document.body;
var script = document.createElement("script");
var W3C = document.dispatchEvent;
script.type = "text/javascript";
script.src = src;
script.charset = "utf-8";
doc.appendChild(script);
script.onload = function() {
if (W3C || readyRE.test(script.readyState)) {
if (typeof callback === "function") {
callback();
}
script.onload = script.onreadystatechange = null;
}
}
},
isIOS: function() {
var os = {};
var ipad = UA.match(/(iPad).*OS\s([\d_]+)/),
ipod = UA.match(/(iPod)(.*OS\s([\d_]+))?/),
iphone = !ipad && UA.match(/(iPhone\sOS)\s([\d_]+)/);
if (iphone && !ipod) os.ios = os.iphone = true;
if (ipad) os.ios = os.ipad = true;
if (ipod) os.ios = os.ipod = true;
return os.ios;
},
isWX: function() {
return /MicroMessenger/i.test(UA);
},
isMQQ: function() {
return /qq\/([\d\.]+)*/i.test(UA);
},
extend: function() {
var _extend = function me(dest, source) {
for (var name in dest) {
if (dest.hasOwnProperty(name)) {
//当前属性是否为对象,如果为对象,则进行递归
if ((dest[name] instanceof Object) && (source[name] instanceof Object)) {
me(dest[name], source[name]);
}
//检测该属性是否存在
if (source.hasOwnProperty(name)) {
continue;
} else {
source[name] = dest[name];
}
}
}
}
var _result = {},
arr = arguments;
//遍历属性,至后向前
if (!arr.length) return {};
for (var i = arr.length - 1; i >= 0; i--) {
_extend(arr[i], _result);
}
arr[0] = _result;
return _result;
},
parseParams: function(params) {
var params = params;
if (window.$PASSIVE_SHARE_CONFIG && typeof window.$PASSIVE_SHARE_CONFIG == "object") {
if (window.$PASSIVE_SHARE_CONFIG != undefined && typeof window.$PASSIVE_SHARE_CONFIG == 'object') {
params = Utils.extend(params, window.$PASSIVE_SHARE_CONFIG);
}
}
return params;
},
replaceParam: function(param, value, url) {
var reg = new RegExp("([\\?&]" + param + "=)[^&#]*");
if (url.match(reg)) {
return url.replace(reg, "$1" + value);
} else {
var link = document.createElement("a");
link.href = url;
var search = link.search,
hash = link.hash,
host = link.host,
protocol = link.protocol,
pathname = link.pathname;
return protocol + "//" + host + pathname + search + ((search ? "&" : "?") + param + "=" + value) + hash;
}
},
replaceUin: function(uin, url) {
return Utils.replaceParam('suin', uin, url);
}
}
var Share = {
'VERSION_LEVEL': "4.7.2",
'importMQQAPI': function(callback) {
// 判断是否已经引用了mqq类库,没有则动态插入mqq类库js。
if (typeof window.mqq == "object"&&window.mqq.ui&&typeof window.mqq.ui.shareMessage=='function') {
typeof callback == "function" ? callback() : '';
return;
}
Utils.loadJS("http://static.paipaiimg.com/sinclude/mobile/common/qqapi.custom.js?_bid=152", callback);
},
'importWXAPI': function(callback) {
if (window.wx && typeof window.wx.config == 'function') {
typeof callback == "function" ? callback() : '';
return;
}
Utils.loadJS("http://res.wx.qq.com/open/js/jweixin-1.0.0.js", callback);
},
'initShareDom': function(opt) {
var qqOpt = opt.qq,
qzoneOpt = opt.qzone,
weixinOpt = opt.weixin,
weixinFriendOpt = opt.weixinFriend,
tqqOpt = opt.tqq,
weiboOpt = opt.weibo;
// 如果是qq客户端且版本大于等于4.7.2或微信客户端则引导用户使用原生分享,否则h5网页版分享
if ((Utils.isMQQ() && mqq.compare(Share.VERSION_LEVEL) >= 0) || Utils.isWX()) {
if (!opt.hideMask) {
Share.showWeixinDialogTip();
}
return;
}
var _wrp = document.createElement("div"),
btns = document.createElement("ul");
_wrp.style.cssText = 'position:fixed; left:0; top:0; right:0; bottom:0; background-color:rgba(0,0,0,.8); z-index:9999;';
btns.style.cssText = 'position:absolute; left:10px; right:10px; bottom:10px; list-style:none; margin:0; padding:0;z-index:10000;';
_wrp.addEventListener("touchstart", function(e) {
e.preventDefault();
}, false);
var shareto = document.createElement('li'),
qq = document.createElement('li'),
qzone = document.createElement('li'),
tqq = document.createElement("li"),
weibo = document.createElement("li"),
cancel = document.createElement('li'),
liCssText = 'background-color:#fff; color:rgba(0,0,0,.8); font-size:18px; line-height:49px; height:49px; border-top:1px solid #cfcfcf; text-align:center;';
shareto.innerHTML = '分享到';
shareto.style.cssText = liCssText + 'color:rgba(0,0,0,.3); border-top:0 none; height:50px;';
qq.innerHTML = 'QQ';
qq.style.cssText = liCssText;
qq.addEventListener("touchend", function(e) {
Share.qq(qqOpt);
}, false);
qzone.innerHTML = 'QQ空间';
qzone.style.cssText = liCssText;
qzone.addEventListener("touchend", function(e) {
Share.qzone(qzoneOpt);
}, false);
tqq.innerHTML = '腾讯微博';
tqq.style.cssText = liCssText;
tqq.addEventListener("touchend", function(e) {
Share.tqq(tqqOpt);
}, false);
weibo.innerHTML = '新浪微博';
weibo.style.cssText = liCssText;
weibo.addEventListener("touchend", function(e) {
Share.weibo(weiboOpt);
}, false);
cancel.innerHTML = '取消';
cancel.style.cssText = liCssText + 'color:rgba(0, 0, 0, 0.298039)';
cancel.addEventListener("touchend", function(e) {
_wrp.parentNode.removeChild(_wrp);
}, false);
btns.appendChild(shareto);
if (!opt.hideQQ) {
btns.appendChild(qq);
}
if (!opt.hideQzone) {
btns.appendChild(qzone);
}
if (!opt.hideTqq) {
btns.appendChild(tqq);
}
if (!opt.hideWeibo) {
btns.appendChild(weibo);
}
btns.appendChild(cancel);
_wrp.appendChild(btns);
document.body.appendChild(_wrp);
},
showWeixinDialogTip: function() {
var tip = document.getElementById("share-module-share-tip");
if (!tip) {
var mask = document.createElement("div"),
shareTip = document.createElement("div");
mask.id = "share-module-mask";
shareTip.id = "share-module-share-tip";
mask.style.cssText = "position:fixed;top:0px;left:0px;bottom:0px;right:0px;width:100%;height:100%;background-color:#000;opacity: 0.7;z-index:9999";
shareTip.style.cssText = "position:fixed;top:20px;right:25px;width:143px;height:101px;z-index:10001;background-image:url(http://static.paipaiimg.com/fd/h5/wd/gb/img/share_sp.png);background-repeat:no-repeat;-webkit-background-size: 143px 101px;background-size: 143px 101px;";
mask.addEventListener("touchstart", function(e) {
e.preventDefault();
}, false);
mask.addEventListener("touchend", function(e) {
document.getElementById("share-module-mask").style.display = "none";
document.getElementById("share-module-share-tip").style.display = "none";
}, false);
document.body.appendChild(mask);
document.body.appendChild(shareTip);
} else {
document.getElementById("share-module-mask").style.display = "";
document.getElementById("share-module-share-tip").style.display = "";
}
},
replacePtagUin: function(opt, ptag) {
var uin = Utils.getCookie('uin') || '0';
var shareUrl = Utils.replaceParam("ptag", opt.ptag || ptag, opt.share_url);
shareUrl = Utils.replaceUin(uin, shareUrl);
return shareUrl;
},
getShareUrl: function(p, urlprefix) {
var s = [];
for (var i in p) {
s.push(i + '=' + encodeURIComponent(p[i] || ''));
}
location.href = urlprefix + s.join("&");
},
qq: function(opt) {
if (opt.share_url.length > 128) {
opt.share_url = opt.share_url.slice(0, 128);
console.warn("qq分享有链接长度限制的,你分享的链接长度已经超过128,为了成功分享此链接,此处将你的链接截断到第128位。");
}
var shareUrl = Share.replacePtagUin(opt, "12475.18.1");
var p = {
site: '拍拍',
summary: opt.desc,
title: opt.title,
appid: "1102335388",
imageUrl: opt.image_url,
targetUrl: shareUrl,
page_url: location.href,
pagetitle: opt.title
};
Share.getShareUrl(p, "http://openmobile.qq.com/api/check?page=shareindex.html&style=9&status_os=0&sdkp=0&");
},
// h5版qzone分享
qzone: function(opt) {
var shareUrl = Share.replacePtagUin(opt, "12475.18.2");
var p = {
site: '拍拍',
summary: opt.desc,
title: opt.title,
appid: "1102335388",
imageUrl: opt.image_url,
targetUrl: shareUrl,
page_url: location.href,
pagetitle: opt.title
};
Share.getShareUrl(p, "http://openmobile.qq.com/oauth2.0/m_jump?page=qzshare.html&loginpage=loginindex.html&logintype=qzone&");
},
// h5版腾讯微博分享
tqq: function(opt) {
var shareUrl = Share.replacePtagUin(opt, "12475.18.5");
var p = {
title: opt.title,
url: shareUrl,
site: '拍拍',
pic: opt.image_url
};
Share.getShareUrl(p, "http://v.t.qq.com/share/share.php?");
},
// h5版新浪微博分享
weibo: function(opt) {
var shareUrl = Share.replacePtagUin(opt, "12475.18.6");
var p = {
title: opt.title,
url: shareUrl,
appkey: opt.appkey,
pic: opt.image_url
};
Share.getShareUrl(p, "http://service.weibo.com/share/share.php?");
},
setQQMsg: function(opt) {
if (!window.mqq) {
globalParams = Utils.extend(globalParams, opt);
return;
}
if (globalParams.hideQQOptionMenu) {
window.mqq.ui.setActionButton({
hidden: true
})
}
window.mqq.ui.setOnShareHandler(function(type) {
if (window.$PASSIVE_SHARE_CONFIG !== undefined) {
params = Utils.parseParams(opt);
opt = params;
}
var opt = Utils.extend(globalParams, opt);
var qqOpt = opt.qq,
qzoneOpt = opt.qzone,
weixinOpt = opt.weixin,
weixinFriendOpt = opt.weixinFriend;
opt.beforeSend();
var shareUrl;
switch (type) {
case "0":
shareUrl = Share.replacePtagUin(qqOpt, "12475.18.1");
break;
case "1":
shareUrl = Share.replacePtagUin(qzoneOpt, "12475.18.2");
break;
case "2":
shareUrl = Share.replacePtagUin(weixinOpt, "12475.18.3");
break;
default:
shareUrl = Share.replacePtagUin(weixinFriendOpt, "12475.18.4");
break;
}
var title = type == 0 ? qqOpt.title : (type == 1 ? qzoneOpt.title : (type == 2 ? weixinOpt.title : weixinFriendOpt.title));
var desc = type == 0 ? qqOpt.desc : (type == 1 ? qzoneOpt.desc : (type == 2 ? weixinOpt.desc : weixinFriendOpt.desc));
window.mqq.ui.shareMessage({
'title': title.toString() || window.document.title,
'desc': desc.toString() || "京东旗下大型电商平台,数千万商品在线热销!品质保证,超值优惠!",
'share_type': type,
'share_url': shareUrl,
'image_url': type == 0 ? qqOpt.image_url : (type == 1 ? qzoneOpt.image_url : (type == 2 ? weixinOpt.image_url : weixinFriendOpt.image_url)),
'back': true,
'shareElement': 'news',
'flash_url': '',
'puin': (Utils.isIOS()&&type==0)?'12345':' ',
'appid': '',
'uinType': ''
}, function(res) {
//result:{retCode: * } retCode 0:用户点击发送,完成整个分享流程;1:用户点击取消,中断分享流程
// 注意:分享给微信和朋友圈的消息获取不到回调,因此 callback 不会被执行
var status = "unknow";
switch (res.retCode) {
case 0:
status = "ok"
break;
case 1:
status = "cancel";
break;
default:
status = "unknow"
break;
}
res.status = status;
opt.done(res);
});
});
},
'configWX': function(data) {
wx.config({
debug: false,
appId: 'wxd8488ee8497bb6de',
timestamp: data.timestamp,
nonceStr: data.nonceStr,
signature: data.signature,
jsApiList: [
'checkJsApi',
'onMenuShareTimeline',
'onMenuShareAppMessage',
'onMenuShareQQ',
'hideOptionMenu'
]
});
wx.error(function(err) {
if (err.errMsg != 'config:ok') {
if (requestCount == 0) {
Share.requestWXTicket();
requestCount = 1;
}
}
})
wx.ready(function() {
isWXReady = true;
Share.setWXMsg(globalParams);
});
},
'requestWXTicket': function() {
Utils.JSONP({
'url': 'http://b.paipai.com/getwxticket/GetWxTicketEntry',
'data': {
'url': encodeURIComponent(location.href.split('#')[0]),
'authCode': '7g4Ey-5fxiC-S3gW5-68W9o-13KP8'
},
'callback': function(data) {
if (data.ret == 0) {
localStorage.setItem("WX_SHARE_CONFIGS", JSON.stringify(data));
Share.configWX(data);
}
}
});
},
'getWXTicket': function() {
if (localStorage.getItem("WX_SHARE_CONFIGS") === null) {
Share.requestWXTicket();
} else {
var data = JSON.parse(localStorage.getItem("WX_SHARE_CONFIGS"));
Share.configWX(data);
}
},
'setWXMsg': function(opts) {
var params = Utils.extend(globalParams, opts);
if (params.hideWXOptionMenu) {
wx.hideOptionMenu();
}
if (window.$HEADER_CONFIG && typeof window.$HEADER_CONFIG.right == "object") {
if (window.$HEADER_CONFIG.right.opts != undefined && typeof window.$HEADER_CONFIG.right.opts == 'object') {
params = Utils.extend(globalParams, window.$HEADER_CONFIG.right.opts)
}
}
if (location.host == "b.paipai.com") {
if (window.$PASSIVE_SHARE_CONFIG !== undefined) {
params = Utils.parseParams(params);
}
}
Share.setWXAPPParams(params.weixin); //分享给朋友
Share.setTimelineParams(params.weixinFriend); //分享给朋友圈
Share.setWXQQParams(params.qq); //分享到QQ
},
'setWXAPPParams': function(opts) {
var params = Utils.extend(globalParams.weixin, opts);
params.imgUrl = params.image_url;
params.link = Share.replacePtagUin(params, "12475.18.3");
window.wx.onMenuShareAppMessage(params); //分享给朋友
},
'setTimelineParams': function(opts) {
var params = Utils.extend(globalParams.weixinFriend, opts);
params.imgUrl = params.image_url;
params.link = Share.replacePtagUin(params, "12475.18.4");
window.wx.onMenuShareTimeline(params); //分享给朋友圈
},
'setWXQQParams': function(opts) {
var params = Utils.extend(globalParams.qq, opts);
params.imgUrl = params.image_url;
params.link = Share.replacePtagUin(params, "12475.18.1");
params.desc = (params.desc == "" ? " " : params.desc);
window.wx.onMenuShareQQ(params); //分享到QQ
},
'initWX': function() {
Share.importWXAPI(function() {
Share.getWXTicket();
});
}
}
var init = function(opts) {
globalParams = Utils.extend(globalParams, opts);
if (Utils.isWX()) {
Share.initWX(globalParams);
}
if (Utils.isMQQ()) {
Share.importMQQAPI(
function() {
Share.setQQMsg(globalParams);
}
);
}
};
var show = function(opts) {
globalParams = Utils.extend(globalParams, opts);
if (Utils.isMQQ()) {
Share.importMQQAPI(
function() {
Share.initShareDom(globalParams);
}
);
} else {
Share.initShareDom(globalParams);
}
}
window.paipai_h5_share = {
'init': init,
'show': show
};
})(window);
return arguments.callee;
})();
/* |xGv00|cb28fc23e659629f4244c1bd934f82cf */
//微信分享
var wxShare = function(img_url,img_width,img_height,link,title,desc,callback,appid){
document.addEventListener('WeixinJSBridgeReady', function onBridgeReady() {
WeixinJSBridge.on('menu:share:timeline', function(argv){
WeixinJSBridge.invoke('shareTimeline',{
"img_url":img_url,
"img_width":img_width,
"img_height":img_height,
"link":link,
"title": title,
"desc":desc
}, function() {
callback('timeline');
});
});
WeixinJSBridge.on('menu:share:appmessage', function(argv){
WeixinJSBridge.invoke('sendAppMessage',{
"appid":appid || "",
"img_url":img_url,
"img_width":img_width,
"img_height":img_height,
"link":link,
"title": title,
"desc":desc
}, function() {
callback('appmessage');
})
});
WeixinJSBridge.on('menu:share:weibo', function(argv){
WeixinJSBridge.invoke('shareWeibo',{
"content":title,
"url":link
}, function(res){
callback('weibo');
});
});
WeixinJSBridge.on('menu:share:facebook', function(argv){
(dataForWeixin.callback)();
WeixinJSBridge.invoke('shareFB',{
"img_url":img_url,
"img_width":img_width,
"img_height":img_height,
"link":link,
"title": title,
"desc":desc
}, function(res){
callback('facebook');
});
});
})
};
//QQ分享--lijianji添加--start
var qqShare = function(img_url,img_width,img_height,link,title,desc,callback,appid){
try {
console.log("qqShare start");
if(getEnv()!="qq"){
return ;
}
var initShareData = {
hideMask: false,
qq: {
title: title,
desc: desc,
share_url: link,
image_url: img_url
},
qzone: {
title: title,
desc: desc,
share_url: link,
image_url: img_url
},
weixin: {
title: title,
desc: desc,
share_url: link,
image_url: img_url
},
weixinFriend: {
title: title,
desc: desc,
share_url: link,
image_url: img_url
}
};
window.paipai_h5_share.setQQMsg(initShareData);
} catch (err) {
console.log("qqShare:"+err.message);
}
};
//QQ分享--lijianji添加--end
wxShare('http://pics1.paipaiimg.com/update/20141226/index_153155701.png',100,100,window.location.href,document.title,document.title);
qqShare('http://pics1.paipaiimg.com/update/20141226/index_153155701.png',100,100,window.location.href,document.title,document.title);