Created
August 9, 2018 09:22
-
-
Save Yang03/bb54abea2154f1e431799f2a3915ed59 to your computer and use it in GitHub Desktop.
share.js
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
void function(){ | |
var Base64 = { | |
// private property | |
_keyStr : "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=", | |
// public method for encoding | |
encode : function (input) { | |
var output = ""; | |
var chr1, chr2, chr3, enc1, enc2, enc3, enc4; | |
var i = 0; | |
input = Base64._utf8_encode(input); | |
while (i < input.length) { | |
chr1 = input.charCodeAt(i++); | |
chr2 = input.charCodeAt(i++); | |
chr3 = input.charCodeAt(i++); | |
enc1 = chr1 >> 2; | |
enc2 = ((chr1 & 3) << 4) | (chr2 >> 4); | |
enc3 = ((chr2 & 15) << 2) | (chr3 >> 6); | |
enc4 = chr3 & 63; | |
if (isNaN(chr2)) { | |
enc3 = enc4 = 64; | |
} else if (isNaN(chr3)) { | |
enc4 = 64; | |
} | |
output = output + | |
this._keyStr.charAt(enc1) + this._keyStr.charAt(enc2) + | |
this._keyStr.charAt(enc3) + this._keyStr.charAt(enc4); | |
} | |
return output; | |
}, | |
// public method for decoding | |
decode : function (input) { | |
var output = ""; | |
var chr1, chr2, chr3; | |
var enc1, enc2, enc3, enc4; | |
var i = 0; | |
input = input.replace(/[^A-Za-z0-9+/=]/g, ""); | |
while (i < input.length) { | |
enc1 = this._keyStr.indexOf(input.charAt(i++)); | |
enc2 = this._keyStr.indexOf(input.charAt(i++)); | |
enc3 = this._keyStr.indexOf(input.charAt(i++)); | |
enc4 = this._keyStr.indexOf(input.charAt(i++)); | |
chr1 = (enc1 << 2) | (enc2 >> 4); | |
chr2 = ((enc2 & 15) << 4) | (enc3 >> 2); | |
chr3 = ((enc3 & 3) << 6) | enc4; | |
output = output + String.fromCharCode(chr1); | |
if (enc3 != 64) { | |
output = output + String.fromCharCode(chr2); | |
} | |
if (enc4 != 64) { | |
output = output + String.fromCharCode(chr3); | |
} | |
} | |
output = Base64._utf8_decode(output); | |
return output; | |
}, | |
// private method for UTF-8 encoding | |
_utf8_encode : function (string) { | |
string = string.replace(/\r\n/g,"\n"); | |
var utftext = ""; | |
for (var n = 0; n < string.length; n++) { | |
var c = string.charCodeAt(n); | |
if (c < 128) { | |
utftext += String.fromCharCode(c); | |
} | |
else if((c > 127) && (c < 2048)) { | |
utftext += String.fromCharCode((c >> 6) | 192); | |
utftext += String.fromCharCode((c & 63) | 128); | |
} | |
else { | |
utftext += String.fromCharCode((c >> 12) | 224); | |
utftext += String.fromCharCode(((c >> 6) & 63) | 128); | |
utftext += String.fromCharCode((c & 63) | 128); | |
} | |
} | |
return utftext; | |
}, | |
// private method for UTF-8 decoding | |
_utf8_decode : function (utftext) { | |
var string = ""; | |
var i = 0; | |
var c = c1 = c2 = 0; | |
while ( i < utftext.length ) { | |
c = utftext.charCodeAt(i); | |
if (c < 128) { | |
string += String.fromCharCode(c); | |
i++; | |
} | |
else if((c > 191) && (c < 224)) { | |
c2 = utftext.charCodeAt(i+1); | |
string += String.fromCharCode(((c & 31) << 6) | (c2 & 63)); | |
i += 2; | |
} | |
else { | |
c2 = utftext.charCodeAt(i+1); | |
c3 = utftext.charCodeAt(i+2); | |
string += String.fromCharCode(((c & 15) << 12) | ((c2 & 63) << 6) | (c3 & 63)); | |
i += 3; | |
} | |
} | |
return string; | |
} | |
} | |
var Config = { | |
bxLogo: location.protocol + 'a.png', | |
appList: { | |
sinaweibo: ["kSinaWeibo", "SinaWeibo", 11, "\u65B0\u6D6A\u5FAE\u535A"], | |
wechatfriends: ["kWeixin", "WechatFriends", 1, "\u5FAE\u4FE1\u597D\u53CB"], | |
wechattimeline: ["kWeixinFriend", "WechatTimeline", "8", "\u5FAE\u4FE1\u670B\u53CB\u5708"], | |
qq: ["kQQ", "QQ", "4", "QQ\u597D\u53CB"], | |
qzone: ["kQZone", "QZone", "3", "QQ\u7A7A\u95F4"] | |
}, | |
shareList: { | |
'wechatfriends': '微信好友', | |
'wechattimeline': '朋友圈', | |
'qq': 'QQ好友', | |
'qzone': 'QQ空间', | |
'sinaweibo': '新浪微博', | |
'baidu': '百度贴吧', | |
'copy': '复制链接' | |
} | |
} | |
var Util = { | |
loadScript: function(src, callback){ | |
var script = document.createElement("script"); | |
var body = document.getElementsByTagName("body")[0]; | |
script.setAttribute("src", src), | |
script.onload = script.onreadystatechange = function() { | |
this.readyState && "loaded" != this.readyState && "complete" != this.readyState || (callback && callback(), | |
script.onload = script.onreadystatechange = null , | |
script.parentNode.removeChild(script)) | |
}; | |
body.appendChild(script); | |
}, | |
addParams: function(url, params) { | |
var query, key, value; | |
for (key in params){ | |
value = params[key], | |
query = new RegExp("(" + key + "=)[^&]+","i"), | |
url.match(query) ? url = url.replace(query, "$1" + value) : url += url.indexOf("?") === -1 ? "?" + key + "=" + value : "&" + key + "=" + value; | |
} | |
return url | |
}, | |
addIframe: function(url){ | |
var div = document.createElement("div"); | |
div.style.visibility = "hidden"; | |
div.innerHTML = '<iframe src="' + url + '" scrolling="no" width="1" height="1"></iframe>'; | |
document.body.appendChild(div); | |
setTimeout(function() { | |
div && div.parentNode && div.parentNode.removeChild(div) | |
}, 5000); | |
} | |
} | |
var Share = function(selector, options){ | |
this.selector = selector | |
// 设置基本的分享属性 | |
var defaultOptions = { | |
title: $("title").text() || "", | |
desc: $("meta[name=description]").attr("content") || $("title").text(), | |
url: document.location.href || "", | |
image: Config.bxLogo, | |
from: "\u767e\u59d3\u7f51", // 百姓网 | |
useDefaultPanel: true, | |
tag: 'default' // 用于打点标记 | |
} | |
if(options && $.isPlainObject(options)){ | |
$.extend(this, defaultOptions, options) | |
} | |
this.getDevice() | |
if(this.useDefaultPanel){ | |
this.addPanelAndMask() | |
this.bindBtnClickEvent() | |
}else{ | |
var browser = this.device.browser | |
if(!(browser.isQQ || browser.isSogou || browser.isUC)){ | |
$('[data-app="wechatfriends"], [data-app="wechattimeline"]').parents('li').hide() | |
} | |
} | |
this.bindSnsClickEvent() | |
this.init() | |
} | |
Share.prototype.bindBtnClickEvent = function(){ | |
$(this.selector).css({cursor: 'pointer'}); | |
$(document).on("click", this.selector, function(){ | |
var $container = Share.$container | |
var $mask = Share.$mask | |
$container && $container.show(); | |
$mask.show(); | |
}); | |
} | |
Share.prototype.bindSnsClickEvent = function(){ | |
var that = this; | |
$(document).on("click", '.sns', function(){ | |
var type = $(this).attr("data-app"); | |
window.tracker && tracker.evt('wap_share_component', {src: that.tag, type: type}) | |
if(type === 'copy'){ | |
that.useDefaultPanel && that.openCopyPanel(); | |
}else{ | |
that.shareto(type); | |
} | |
}); | |
} | |
Share.prototype.addPanelAndMask = function(){ | |
// 如果已经生成过一次分享组件的dom, 就不需要再执行以下的步骤了 | |
if(Share.$mask) return; | |
if(!this.selector) return; | |
var $mask = $('<div id="share-mask" class="hide page-mask"></div>') | |
var $container = null | |
var isWechat = this.device.browser.isWechat | |
if(isWechat) { | |
$mask = $mask.append('<div id="weixin-leading-img">') | |
$('body').append($mask) | |
} else { | |
$container = $('<div class="hide share-pop"></div>') | |
var $list = $('<ul></ul>') | |
var listStr = '' | |
var $copyPanel = $( | |
'<div id="copy-panel" class="hide">' + | |
'<div id="copy-return">返回</div>' + | |
'<p class="copy-hint">长按复制下方链接,粘贴给好友吧!</p>' + | |
'<div id="copy-link">' + | |
'<p>' + | |
Util.addParams(this.url, {shareWay: 'copy', sharePlatform: 'wap'}) + | |
'</p>' + | |
'</div>' + | |
'</div>') | |
for(var key in Config.shareList){ | |
// safari中不显示微信朋友圈和微信好友 | |
if((key === 'wechatfriends' || key === 'wechattimeline')){ | |
var browser = this.device.browser | |
var hasOriginalApi = browser.isQQ || browser.isSogou || browser.isUC | |
if(!hasOriginalApi) continue | |
} | |
listStr += '<li><a class="sns" href="javascript:;" data-app="' + key + '"><i class="share-component-icon share-component-icon-' + key + '"></i>' + Config.shareList[key] + '</a></li>' | |
} | |
$list.append(listStr); | |
$container.append($list).append($copyPanel).append('<div class="close">×</div>') | |
$('body').append($container).append($mask); | |
} | |
Share.$mask = $mask; | |
Share.$container = $container; | |
isWechat && $mask.on('click', function(){ | |
$(this).hide() | |
}) | |
$('.close').on('click', function(){ | |
$container && $container.hide(); | |
$mask.hide(); | |
}) | |
} | |
Share.prototype.getDevice = function(){ | |
var ua = this.ua = navigator.userAgent.toLowerCase(); | |
this.device = { | |
os: { | |
version: 0, | |
isiOS: ua.indexOf("iphone") > -1 || ua.indexOf("ipad") > -1 || ua.indexOf("ios") > -1, | |
isAndroid: ua.indexOf("android") > -1 || ua.indexOf("adr") > -1 || ua.indexOf("linux;") > -1 | |
}, | |
browser: { | |
version: 0, | |
isQQ: ua.indexOf("mqqbrowser/") > -1, | |
isUC: ua.indexOf("ucbrowser/") > -1, | |
isWechat: ua.indexOf("micromessenger") > -1, | |
isSamsung: ua.indexOf("samsungbrowser/") > -1, | |
isSogou: ua.indexOf("sogoumobilebrowser/") > -1, | |
isFirefox: ua.indexOf("firefox/") > -1, | |
isBaidu: ua.indexOf("baiduboxapp/") > -1, | |
isSafari: ua.indexOf("safari") > -1 && ua.indexOf("chrome") == -1, | |
isWeChat: ua.indexOf("micromessenger") > -1 | |
}, | |
brand: { | |
isOppo: ua.indexOf("oppo") > -1 | |
} | |
} | |
} | |
Share.prototype.getVersion = function(version){ | |
var versionNum = version.split("."); | |
return parseFloat(versionNum[0] + "." + versionNum[1]) | |
} | |
Share.prototype.init = function(){ | |
var device = this.device; | |
if(device.browser.isQQ){ | |
if(typeof browser == "undefined"){ | |
Util.loadScript("//jsapi.qq.com/get?api=app.setShareInfo,app.share", function() { | |
this.shareWechatByQQBrowser() | |
}.bind(this)) | |
}else{ | |
this.shareWechatByQQBrowser() | |
} | |
device.browser.version = this.getVersion(this.ua.split("mqqbrowser/")[1]) | |
}else{ | |
device.browser.isUC && (device.browser.version = this.getVersion(this.ua.split("ucbrowser/")[1])) | |
device.os.isiOS && (device.os.version = parseInt(this.ua.match(/\s*os\s*\d\d?/gi)[0].split(" ")[2], 10)) | |
} | |
} | |
Share.prototype.openCopyPanel = function(){ | |
var $container = Share.$container | |
if(!$container) return; | |
var $list = $container.find('ul') | |
var $copy = $container.find('#copy-panel') | |
$list.hide(); | |
$copy.show().find('#copy-return').on('click', function(){ | |
$list.show() | |
$copy.hide() | |
}); | |
} | |
Share.prototype.shareWechatByQQBrowser = function(){ | |
var app = window.location.href.match(/shareApp=(\w+)/i); | |
if (app) { | |
var type = app[1]; | |
if($.isFunction(history.replaceState)){ | |
history.replaceState(null , document.title, location.href.replace(/shareApp=wechatfriends/g, "")) | |
history.replaceState(null , document.title, location.href.replace(/shareApp=wechattimeline/g, "")) | |
} | |
this.shareto(type) | |
} | |
} | |
Share.prototype.shareto = function(type){ | |
var device = this.device, | |
title = this.title, | |
desc = this.desc, | |
url = Util.addParams(this.url, {shareWay: type, sharePlatform: 'wap'}), | |
image = this.image, | |
from = this.from, | |
encodedUrl = Base64.encode(url), | |
encodedImage = Base64.encode(image), | |
encodedTitle = Base64.encode(title), | |
encodedDesc = Base64.encode(desc), | |
encodedFrom = Base64.encode(from), | |
timestamp = Date.now(); | |
switch(type){ | |
case 'qzone': | |
var config = { | |
android: "mqqapi://share/to_qzone?src_type=app&version=1&file_type=news&req_type=1", | |
ios: "mqqapi://share/to_fri?file_type=news&src_type=app&version=1&generalpastboard=1&shareType=1&cflag=1&objectlocation=pasteboard&callback_type=scheme&callback_name=QQ41AF4B2A&" | |
} | |
if(device.os.isAndroid){ | |
if(device.brand.isOppo || device.browser.isBaidu){ // OPPO手机 以及 手机百度无法唤醒, 所以强制使用web share | |
this.shareWebQzone() | |
break | |
} | |
device.browser.isUC ? Util.addIframe(Util.addParams(config.android, { | |
url: encodedUrl, | |
image_url: encodedImage, | |
title: encodedTitle, | |
description: encodedDesc, | |
app_name: encodedFrom | |
})) : window.location.href = Util.addParams(config.android, { | |
url: encodedUrl, | |
previewimageUrl: encodedImage, | |
title: encodedTitle, | |
description: encodedDesc, | |
thirdAppDisplayName: encodedFrom | |
}) | |
}else{ | |
window.location.href = Util.addParams(config.ios, { | |
url: encodedUrl, | |
previewimageUrl: encodedImage, | |
title: encodedTitle, | |
description: encodedDesc, | |
thirdAppDisplayName: encodedFrom | |
}) | |
} | |
setTimeout(function() { | |
var offset = Date.now() - timestamp; | |
offset < 2100 && this.shareWebQzone() | |
}.bind(this), 2000) | |
break; | |
case 'qq': | |
window.location.href = Util.addParams("mqqapi://share/to_fri?src_type=web&version=1&file_type=news", { | |
title: encodedTitle, | |
description: encodedDesc, | |
thirdAppDisplayName: encodedFrom, // 百姓网 | |
share_id: 100584285, | |
url: encodedUrl | |
}) | |
break; | |
case 'baidu': | |
var openUrl = function(){ | |
window.location.href = Util.addParams("http://tieba.baidu.com/f/commit/share/openShareApi", { | |
url: encodeURIComponent(url), | |
title: encodeURIComponent(title) | |
//desc: encodeURIComponent(desc), | |
//comment: '', | |
//pic: encodeURIComponent(image) | |
}); | |
}; | |
if(device.browser.isFirefox){ | |
setTimeout(openUrl,0) | |
}else{ | |
openUrl() | |
} | |
break; | |
case 'wechatfriends': | |
case 'wechattimeline': | |
case 'sinaweibo': | |
if (device.browser.isUC){ | |
var uctype; | |
if(device.os.isiOS && typeof ucbrowser != "undefined"){ | |
uctype = Config.appList[type][0]; | |
ucbrowser.web_share(title, title, url, uctype, "", " @" + desc + " ", "") | |
}else{ | |
if(typeof ucweb != "undefined"){ | |
uctype = Config.appList[type][1]; | |
ucweb.startRequest("shell.page_share", [title, title + " @" + desc + " ", url, uctype, "", "", ""]); | |
}else{ | |
console.log("UCBrowser native share bypass.") | |
} | |
} | |
}else if(device.browser.isQQ) { | |
var qqtype = Config.appList[type][2]; | |
var data = { | |
url: url, | |
title: title, | |
img_url: image, | |
to_app: qqtype, | |
cus_txt: title + " @\u767e\u59d3\u7f51 " | |
}; | |
browser && browser.app && browser.app.share ? browser.app.share(data) : console.log("QQBrowser native share bypass.") | |
}else if(device.browser.isSogou) { | |
var data = { | |
shareTitle: title, | |
shareContent: desc, | |
shareImageUrl: image, | |
shareUrl: url, | |
shareSnapshotTab: "", | |
shareType: null | |
}; | |
if(type == "wechatfriends" || type == "wechattimeline"){ | |
if(type == "wechatfriends"){ | |
data.shareType = 2 | |
} | |
if(type == "wechattimeline"){ | |
data.shareType = 4 | |
} | |
SogouMse && SogouMse.Utility && SogouMse.Utility.shareWithInfo ? SogouMse.Utility.shareWithInfo(data) : console.log("sogouBrowser native share error."); | |
}else{ | |
window.location.href = Util.addParams("http://v.t.sina.com.cn/share/share.php", { | |
title: encodeURIComponent(title), | |
url: encodeURIComponent(url), | |
appkey: "217550396", | |
pic: encodeURIComponent(image), | |
source: '', | |
sourceUrl: '', | |
content: 'gb2312' | |
//ralateUid: "1934323297", | |
//count: "n", | |
//size: "middle" | |
}) | |
} | |
}else if(type == "wechatfriends"|| type == "wechattimeline") { | |
url = Util.addParams(url, { | |
shareApp: type | |
}); | |
if(device.os.isiOS && device.os.version > 8){ | |
window.location.href = "mttbrowser://url=" + url; | |
}else{ | |
Util.addIframe("mttbrowser://url=" + url); | |
} | |
}else{ | |
if(type == "sinaweibo"){ | |
window.location.href = Util.addParams("http://v.t.sina.com.cn/share/share.php", { | |
title: encodeURIComponent(title), | |
url: encodeURIComponent(url), | |
appkey: "217550396", | |
pic: encodeURIComponent(image), | |
source: '', | |
sourceUrl: '', | |
content: 'gb2312' | |
//ralateUid: "1934323297", | |
//count: "n", | |
//size: "middle" | |
}) | |
} | |
} | |
break; | |
} | |
} | |
Share.prototype.shareWebQzone = function(){ | |
var api = "//openmobile.qq.com/api/check2?page=qzshare.html&loginpage=loginindex.html&logintype=qzone" | |
var desc = this.desc.substring(0, 200) | |
var query = ["title=" + encodeURIComponent(this.title), "imageUrl=" + encodeURIComponent(this.image), "desc=" + encodeURIComponent(desc), "url=" + this.url, "successUrl=" + this.url].join("&"); | |
window.location.href = api + "&" + query | |
} | |
window.Share = Share; | |
}() |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment