123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494 |
- /**
- * social-share.js
- *
- * @author 52cik <fe.52cik@gmail.com>
- * @license MIT
- *
- * @example
- * <pre>
- * socialShare('.share-components');
- *
- * // or
- *
- * socialShare('.share-bar', {
- * sites: ['qzone', 'qq', 'weibo','wechat'],
- * // ...
- * });
- * </pre>
- */
- ;(function (window, document, undefined) {
- // Initialize a variables.
- var Array$indexOf = Array.prototype.indexOf;
- var Object$assign = Object.assign;
- var runningInWeChat = /MicroMessenger/i.test(navigator.userAgent);
- var isMobileScreen = document.documentElement.clientWidth <= 768;
- var image = (document.images[0] || 0).src || '';
- var site = getMetaContentByName('site') || getMetaContentByName('Site') || document.title;
- var title = getMetaContentByName('title') || getMetaContentByName('Title') || document.title;
- var description = getMetaContentByName('description') || getMetaContentByName('Description') || '';
- var defaults = {
- url: location.href,
- origin: location.origin,
- source: site,
- title: title,
- description: description,
- image: image,
- imageSelector: undefined,
- weiboKey: '',
- // wechatQrcodeTitle: '微信扫一扫:分享',
- // wechatQrcodeHelper: '<p>微信里点“发现”,扫一下</p><p>二维码便可将本文分享至朋友圈。</p>',
- // wechatQrcodeSize: 100,
- sites: ['weibo', 'qq', 'wechat', 'tencent', 'douban', 'qzone', 'linkedin', 'diandian', 'facebook', 'twitter', 'google'],
- mobileSites: [],
- disabled: [],
- initialized: false
- };
- var templates = {
- qzone: 'http://sns.qzone.qq.com/cgi-bin/qzshare/cgi_qzshare_onekey?url={{URL}}&title={{TITLE}}&desc={{DESCRIPTION}}&summary={{SUMMARY}}&site={{SOURCE}}',
- qq: 'http://connect.qq.com/widget/shareqq/index.html?url={{URL}}&title={{TITLE}}&source={{SOURCE}}&desc={{DESCRIPTION}}&pics={{IMAGE}}&summary="{{SUMMARY}}"',
- tencent: 'http://share.v.t.qq.com/index.php?c=share&a=index&title={{TITLE}}&url={{URL}}&pic={{IMAGE}}',
- weibo: 'https://service.weibo.com/share/share.php?url={{URL}}&title={{TITLE}}&pic={{IMAGE}}&appkey={{WEIBOKEY}}',
- wechat: '#',//'javascript:',
- douban: 'http://shuo.douban.com/!service/share?href={{URL}}&name={{TITLE}}&text={{DESCRIPTION}}&image={{IMAGE}}&starid=0&aid=0&style=11',
- diandian: 'http://www.diandian.com/share?lo={{URL}}&ti={{TITLE}}&type=link',
- linkedin: 'http://www.linkedin.com/shareArticle?mini=true&ro=true&title={{TITLE}}&url={{URL}}&summary={{SUMMARY}}&source={{SOURCE}}&armin=armin',
- facebook: 'https://www.facebook.com/sharer/sharer.php?u={{URL}}',
- twitter: 'https://twitter.com/intent/tweet?text={{TITLE}}&url={{URL}}&via={{ORIGIN}}',
- google: 'https://plus.google.com/share?url={{URL}}'
- };
- /**
- * Expose API to the global
- *
- * @param {String|Element} elem
- * @param {Object} options
- */
- window.socialShare = function (elem, options) {
- elem = typeof elem === 'string' ? querySelectorAlls(elem) : elem;
- if (elem.length === undefined) {
- elem = [elem];
- }
- each(elem, function (el) {
- if (!el.initialized) {
- share(el, options);
- }
- });
- };
- // Domready after initialization
- alReady(function () {
- socialShare('.social-share, .share-component');
- });
- /**
- * Initialize a share bar.
- *
- * @param {Object} $options globals (optional).
- *
- * @return {Void}
- */
- function share(elem, options) {
- var data = mixin({}, defaults, options || {}, dataset(elem));
- if (data.imageSelector) {
- data.image = querySelectorAlls(data.imageSelector).map(function(item) {
- return item.src;
- }).join('||');
- }
- addClass(elem, 'share-component social-share');
- createIcons(elem, data);
- createWechat(elem, data);
- elem.initialized = true;
- }
- /**
- * Create site icons
- *
- * @param {Element} elem
- * @param {Object} data
- */
- function createIcons(elem, data) {
- var sites = getSites(data);
- var isPrepend = data.mode == 'prepend';
- each(isPrepend ? sites.reverse() : sites, function (name) {
- var url = makeUrl(name, data);
- var link = data.initialized ? getElementsByClassName(elem, 'icon-' + name) : createElementByString('<a class="social-share-icon icon-' + name + '"></a>');
- if (!link.length) {
- return true;
- }
- link[0].href = url;
- if (name === 'wechat') {
- link[0].tabindex = -1;
- } else {
- link[0].target = '_blank';
- }
- if (!data.initialized) {
- isPrepend ? elem.insertBefore(link[0], elem.firstChild) : elem.appendChild(link[0]);
- }
- });
- }
- /**
- * Create the wechat icon and QRCode.
- *
- * @param {Element} elem
- * @param {Object} data
- */
- function createWechat (elem, data) {
- var wechat = getElementsByClassName(elem, 'icon-wechat', 'a');
- if (wechat.length === 0) {
- return false;
- }
- /* var elems = createElementByString('<div class="wechat-qrcode"><h4>' + data.wechatQrcodeTitle + '</h4><div class="qrcode"></div><div class="help">' + data.wechatQrcodeHelper + '</div></div>');
- var qrcode = getElementsByClassName(elems[0], 'qrcode', 'div');
- wechat[0].appendChild(elems[0]);
- new QRCode(qrcode[0], {text: data.url, width: data.wechatQrcodeSize, height: data.wechatQrcodeSize});*/
- }
- /**
- * Get available site lists.
- *
- * @param {Object} data
- *
- * @returns {Array}
- */
- function getSites(data) {
- if (!data['mobileSites'].length) {
- data['mobileSites'] = data['sites'];
- }
- var sites = (isMobileScreen ? data['mobileSites'] : data['sites']).slice(0);
- var disabled = data['disabled'];
- if (typeof sites == 'string') {
- sites = sites.split(/\s*,\s*/);
- }
- if (typeof disabled == 'string') {
- disabled = disabled.split(/\s*,\s*/);
- }
- if (runningInWeChat) {
- disabled.push('wechat');
- }
- // Remove elements
- disabled.length && each(disabled, function (it) {
- sites.splice(inArray(it, sites), 1);
- });
- return sites;
- }
- /**
- * Build the url of icon.
- *
- * @param {String} name
- * @param {Object} data
- *
- * @returns {String}
- */
- function makeUrl(name, data) {
- if (! data['summary']){
- data['summary'] = data['description'];
- }
- return templates[name].replace(/\{\{(\w)(\w*)\}\}/g, function (m, fix, key) {
- var nameKey = name + fix + key.toLowerCase();
- key = (fix + key).toLowerCase();
- return encodeURIComponent((data[nameKey] === undefined ? data[key] : data[nameKey]) || '');
- });
- }
- /**
- * Supports querySelectorAll, jQuery, Zepto and simple selector.
- *
- * @param str
- *
- * @returns {*}
- */
- function querySelectorAlls(str) {
- return (document.querySelectorAll || window.jQuery || window.Zepto || selector).call(document, str);
- }
- /**
- * Simple selector.
- *
- * @param {String} str #ID or .CLASS
- *
- * @returns {Array}
- */
- function selector(str) {
- var elems = [];
- each(str.split(/\s*,\s*/), function(s) {
- var m = s.match(/([#.])(\w+)/);
- if (m === null) {
- throw Error('Supports only simple single #ID or .CLASS selector.');
- }
- if (m[1]) {
- var elem = document.getElementById(m[2]);
- if (elem) {
- elems.push(elem);
- }
- }
- elems = elems.concat(getElementsByClassName(str));
- });
- return elems;
- }
- /**
- * Add the classNames for element.
- *
- * @param {Element} elem
- * @param {String} value
- */
- function addClass(elem, value) {
- if (value && typeof value === "string") {
- var classNames = (elem.className + ' ' + value).split(/\s+/);
- var setClass = ' ';
- each(classNames, function (className) {
- if (setClass.indexOf(' ' + className + ' ') < 0) {
- setClass += className + ' ';
- }
- });
- elem.className = setClass.slice(1, -1);
- }
- }
- /**
- * Get meta element content value
- *
- * @param {String} name
- *
- * @returns {String|*}
- */
- function getMetaContentByName(name) {
- return (document.getElementsByName(name)[0] || 0).content;
- }
- /**
- * Get elements By className for IE8-
- *
- * @param {Element} elem element
- * @param {String} name className
- * @param {String} tag tagName
- *
- * @returns {HTMLCollection|Array}
- */
- function getElementsByClassName(elem, name, tag) {
- if (elem.getElementsByClassName) {
- return elem.getElementsByClassName(name);
- }
- var elements = [];
- var elems = elem.getElementsByTagName(tag || '*');
- name = ' ' + name + ' ';
- each(elems, function (elem) {
- if ((' ' + (elem.className || '') + ' ').indexOf(name) >= 0) {
- elements.push(elem);
- }
- });
- return elements;
- }
- /**
- * Create element by string.
- *
- * @param {String} str
- *
- * @returns {NodeList}
- */
- function createElementByString(str) {
- var div = document.createElement('div');
- div.innerHTML = str;
- return div.childNodes;
- }
- /**
- * Merge objects.
- *
- * @returns {Object}
- */
- function mixin() {
- var args = arguments;
- if (Object$assign) {
- return Object$assign.apply(null, args);
- }
- var target = {};
- each(args, function (it) {
- each(it, function (v, k) {
- target[k] = v;
- });
- });
- return args[0] = target;
- }
- /**
- * Get dataset object.
- *
- * @param {Element} elem
- *
- * @returns {Object}
- */
- function dataset(elem) {
- if (elem.dataset) {
- return JSON.parse(JSON.stringify(elem.dataset));
- }
- var target = {};
- if (elem.hasAttributes()) {
- each(elem.attributes, function (attr) {
- var name = attr.name;
- if (name.indexOf('data-') !== 0) {
- return true;
- }
- name = name.replace(/^data-/i, '')
- .replace(/-(\w)/g, function (all, letter) {
- return letter.toUpperCase();
- });
- target[name] = attr.value;
- });
- return target;
- }
- return {};
- }
- /**
- * found element in the array.
- *
- * @param {Array|Object} elem
- * @param {Array} arr
- * @param {Number} i
- *
- * @returns {Number}
- */
- function inArray(elem, arr, i) {
- var len;
- if (arr) {
- if (Array$indexOf) {
- return Array$indexOf.call(arr, elem, i);
- }
- len = arr.length;
- i = i ? i < 0 ? Math.max(0, len + i) : i : 0;
- for (; i < len; i++) {
- // Skip accessing in sparse arrays
- if (i in arr && arr[i] === elem) {
- return i;
- }
- }
- }
- return -1;
- }
- /**
- * Simple each.
- *
- * @param {Array|Object} obj
- * @param {Function} callback
- *
- * @returns {*}
- */
- function each(obj, callback) {
- var length = obj.length;
- if (length === undefined) {
- for (var name in obj) {
- if (obj.hasOwnProperty(name)) {
- if (callback.call(obj[name], obj[name], name) === false) {
- break;
- }
- }
- }
- } else {
- for (var i = 0; i < length; i++) {
- if (callback.call(obj[i], obj[i], i) === false) {
- break;
- }
- }
- }
- }
- /**
- * Dom ready.
- *
- * @param {Function} fn
- *
- * @link https://github.com/jed/alReady.js
- */
- function alReady ( fn ) {
- var add = 'addEventListener';
- var pre = document[ add ] ? '' : 'on';
- ~document.readyState.indexOf( 'm' ) ? fn() :
- 'load DOMContentLoaded readystatechange'.replace( /\w+/g, function( type, i ) {
- ( i ? document : window )
- [ pre ? 'attachEvent' : add ]
- (
- pre + type,
- function(){ if ( fn ) if ( i < 6 || ~document.readyState.indexOf( 'm' ) ) fn(), fn = 0 },
- !1
- )
- })
- }
- })(window, document);
|