PageSourceSearch

https://dinghuang.github.io/lib/needsharebutton/needsharebutton.js

js dinghuang.github.io collected 2026-10-03 09:00:44 UTC 19,873 bytes, 537 lines download raw bytes

1/***********************************************
2  needShareButton
3  - Version 1.0.0
4  - Copyright 2015 Dzmitry Vasileuski
5	- Licensed under MIT (http://opensource.org/licenses/MIT)
6***********************************************/
7
8(function () {
9
10  // find closest
11  function closest(elem, parent) {
12    if (typeof (parent) == "string") {
13      var matchesSelector = elem.matches || elem.webkitMatchesSelector ||
14                            elem.mozMatchesSelector || elem.msMatchesSelector;
15
16      if (!!matchesSelector) {
17        while (elem) {
18          if (matchesSelector.bind(elem)(parent)) {
19            return elem;
20          } else {
21            elem = elem.parentElement;
22          }
23        }
24      }
25      return false;
26    } else {
27      while (elem) {
28        if (elem == parent) {
29          return elem;
30        } else {
31          elem = elem.parentElement;
32        }
33      }
34      return false;
35    }
36  }
37
38  // share button class
39  window.needShareButton = function (elem, options) {
40    // create element reference
41    var root = this;
42    root.elem = elem || "need-share-button";
43
44    /* Helpers
45     ***********************************************/
46
47    // get title from html
48    root.getTitle = function () {
49      var content;
50      // check querySelector existance for old browsers
51      if (document.querySelector) {
52        content = document.querySelector("title");
53        if (content) {
54          return content.innerText;
55        }
56      }
57      return document.title;
58    };
59
60    // get image from html
61    root.getImage = function () {
62      var content;
63      // check querySelector existance for old browsers
64      if (document.querySelector) {
65        content = document.querySelector("meta[property=\"og:image\"]") ||
66                  document.querySelector("meta[name=\"twitter:image\"]");
67        if (content) {
68          return content.getAttribute("content");
69        } else {
70          return "";
71        }
72      } else {
73        return "";
74      }
75    };
76
77    // get description from html
78    root.getDescription = function () {
79      var content;
80      // check querySelector existance for old browsers
81      if (document.querySelector) {
82        content = document.querySelector("meta[property=\"og:description\"]") ||
83                  document.querySelector("meta[name=\"twitter:description\"]") ||
84                  document.querySelector("meta[name=\"description\"]");
85        if (content) {
86          return content.getAttribute("content");
87        } else {
88          return "";
89        }
90      } else {
91        content = document.getElementsByTagName("meta").namedItem("description");
92        if (content) {
93          return content.getAttribute("content");
94        } else {
95          return "";
96        }
97      }
98    };
99
100    // share urls for all networks
101    root.share = {
102      "weibo": function (el) {
103        var myoptions = getOptions(el);
104        var url = "http://v.t.sina.com.cn/share/share.php?title=" +
105          encodeURIComponent(myoptions.title) +
106          "&url=" + encodeURIComponent(myoptions.url) +
107          "&pic=" + encodeURIComponent(myoptions.image);
108        root.popup(url);
109      },
110      "wechat": function (el) {
111        var myoptions = getOptions(el);
112        var imgSrc = "https://api.qinco.me/api/qr?size=400&content=" + encodeURIComponent(myoptions.url);
113        var dropdownEl = el.querySelector(".need-share-button_dropdown");
114        var img = dropdownEl.getElementsByClassName("need-share-wechat-code-image")[0];
115        if (img) {
116          img.remove();
117        } else {
118          img = document.createElement("img");
119          img.src = imgSrc;
120          img.alt = "loading wechat image...";
121          img.setAttribute("class", "need-share-wechat-code-image");
122          dropdownEl.appendChild(img);
123        }
124      },
125      "douban": function (el) {
126        var myoptions = getOptions(el);
127        var url = "https://www.douban.com/share/service?name=" +
128          encodeURIComponent(myoptions.title) +
129          "&href=" + encodeURIComponent(myoptions.url) +
130          "&image=" + encodeURIComponent(myoptions.image);
131        root.popup(url);
132      },
133      "qqzone": function (el) {
134        var myoptions = getOptions(el);
135        var url = "http://sns.qzone.qq.com/cgi-bin/qzshare/cgi_qzshare_onekey?title=" +
136          encodeURIComponent(myoptions.title) +
137          "&url=" + encodeURIComponent(myoptions.url) +
138          "&pics=" + encodeURIComponent(myoptions.image) +
139          "&desc=" + encodeURIComponent(myoptions.description);
140        root.popup(url);
141      },
142      "renren": function (el) {
143        var myoptions = getOptions(el);
144        var url = "http://widget.renren.com/dialog/share?title=" +
145          encodeURIComponent(myoptions.title) +
146          "&resourceUrl=" + encodeURIComponent(myoptions.url) +
147          "&pic=" + encodeURIComponent(myoptions.image) +
148          "&description=" + encodeURIComponent(myoptions.description);
149        root.popup(url);
150      },
151      "mailto": function (el) {
152        var myoptions = getOptions(el);
153        var url = "mailto:?subject=" + encodeURIComponent(myoptions.title) +
154          "&body=Thought you might enjoy reading this: " + encodeURIComponent(myoptions.url) +
155          " - " + encodeURIComponent(myoptions.description);
156
157        window.location.href = url;
158      },
159      "twitter": function (el) {
160        var myoptions = getOptions(el);
161        var url = myoptions.protocol + "twitter.com/intent/tweet?text=";
162        url += encodeURIComponent(myoptions.title) + "&url=" + encodeURIComponent(myoptions.url);
163
164        root.popup(url);
165      },
166      "pinterest": function (el) {
167        var myoptions = getOptions(el);
168        var url = myoptions.protocol + "pinterest.com/pin/create/bookmarklet/?is_video=false";
169        url += "&media=" + encodeURIComponent(myoptions.image);
170        url += "&url=" + encodeURIComponent(myoptions.url);
171        url += "&description=" + encodeURIComponent(myoptions.title);
172
173        root.popup(url);
174      },
175      "facebook": function (el) {
176        var myoptions = getOptions(el);
177        var url = myoptions.protocol + "www.facebook.com/share.php?";
178        url += "u=" + encodeURIComponent(myoptions.url);
179        url += "&title=" + encodeURIComponent(myoptions.title);
180
181        root.popup(url);
182      },
183      "googleplus": function (el) {
184        var myoptions = getOptions(el);
185        var url = myoptions.protocol + "plus.google.com/share?";
186        url += "url=" + encodeURIComponent(myoptions.url);
187
188        root.popup(url);
189      },
190      "reddit": function (el) {
191        var myoptions = getOptions(el);
192        var url = myoptions.protocol + "www.reddit.com/submit?";
193        url += "url=" + encodeURIComponent(myoptions.url);
194        url += "&title=" + encodeURIComponent(myoptions.title);
195
196        root.popup(url);
197      },
198      "delicious": function (el) {
199        var myoptions = getOptions(el);
200        var url = myoptions.protocol + "del.icio.us/post?";
201        url += "url=" + encodeURIComponent(myoptions.url);
202        url += "&title=" + encodeURIComponent(myoptions.title);
203        url += "&notes=" + encodeURIComponent(myoptions.description);
204
205        root.popup(url);
206      },
207      "stumbleupon": function (el) {
208        var myoptions = getOptions(el);
209        var url = myoptions.protocol + "www.stumbleupon.com/submit?";
210        url += "url=" + encodeURIComponent(myoptions.url);
211        url += "&title=" + encodeURIComponent(myoptions.title);
212
213        root.popup(url);
214      },
215      "linkedin": function (el) {
216        var myoptions = getOptions(el);
217        var url = myoptions.protocol + "www.linkedin.com/shareArticle?mini=true";
218        url += "&url=" + encodeURIComponent(myoptions.url);
219        url += "&title=" + encodeURIComponent(myoptions.title);
220        url += "&source=" + encodeURIComponent(myoptions.source);
221
222        root.popup(url);
223      },
224      "slashdot": function (el) {
225        var myoptions = getOptions(el);
226        var url = myoptions.protocol + "slashdot.org/bookmark.pl?";
227        url += "url=" + encodeURIComponent(myoptions.url);
228        url += "&title=" + encodeURIComponent(myoptions.title);
229
230        root.popup(url);
231      },
232      "technorati": function (el) {
233        var myoptions = getOptions(el);
234        var url = myoptions.protocol + "technorati.com/faves?";
235        url += "add=" + encodeURIComponent(myoptions.url);
236        url += "&title=" + encodeURIComponent(myoptions.title);
237
238        root.popup(url);
239      },
240      "posterous": function (el) {
241        var myoptions = getOptions(el);
242        var url = myoptions.protocol + "posterous.com/share?";
243        url += "linkto=" + encodeURIComponent(myoptions.url);
244
245        root.popup(url);
246      },
247      "tumblr": function (el) {
248        var myoptions = getOptions(el);
249        var url = myoptions.protocol + "www.tumblr.com/share?v=3";
250        url += "&u=" + encodeURIComponent(myoptions.url);
251        url += "&t=" + encodeURIComponent(myoptions.title);
252
253        root.popup(url);
254      },
255      "googlebookmarks": function (el) {
256        var myoptions = getOptions(el);
257        var url = myoptions.protocol + "www.google.com/bookmarks/mark?op=edit";
258        url += "&bkmk=" + encodeURIComponent(myoptions.url);
259        url += "&title=" + encodeURIComponent(myoptions.title);
260        url += "&annotation=" + encodeURIComponent(myoptions.description);
261
262        root.popup(url);
263      },
264      "newsvine": function (el) {
265        var myoptions = getOptions(el);
266        var url = myoptions.protocol + "www.newsvine.com/_tools/seed&save?";
267        url += "u=" + encodeURIComponent(myoptions.url);
268        url += "&h=" + encodeURIComponent(myoptions.title);
269
270        root.popup(url);
271      },
272      "evernote": function (el) {
273        var myoptions = getOptions(el);
274        var url = myoptions.protocol + "www.evernote.com/clip.action?";
275        url += "url=" + encodeURIComponent(myoptions.url);
276        url += "&title=" + encodeURIComponent(myoptions.title);
277
278        root.popup(url);
279      },
280      "friendfeed": function (el) {
281        var myoptions = getOptions(el);
282        var url = myoptions.protocol + "www.friendfeed.com/share?";
283        url += "url=" + encodeURIComponent(myoptions.url);
284        url += "&title=" + encodeURIComponent(myoptions.title);
285
286        root.popup(url);
287      },
288      "vkontakte": function (el) {
289        var myoptions = getOptions(el);
290        var url = myoptions.protocol + "vkontakte.ru/share.php?";
291        url += "url=" + encodeURIComponent(myoptions.url);
292        url += "&title=" + encodeURIComponent(myoptions.title);
293        url += "&description=" + encodeURIComponent(myoptions.description);
294        url += "&image=" + encodeURIComponent(myoptions.image);
295        url += "&noparse=true";
296
297        root.popup(url);
298      },
299      "odnoklassniki": function (el) {
300        var myoptions = getOptions(el);
301        var url = myoptions.protocol + "www.odnoklassniki.ru/dk?st.cmd=addShare&st.s=1";
302        url += "&st.comments=" + encodeURIComponent(myoptions.description);
303        url += "&st._surl=" + encodeURIComponent(myoptions.url);
304
305        root.popup(url);
306      },
307      "mailru": function (el) {
308        var myoptions = getOptions(el);
309        var url = myoptions.protocol + "connect.mail.ru/share?";
310        url += "url=" + encodeURIComponent(myoptions.url);
311        url += "&title=" + encodeURIComponent(myoptions.title);
312        url += "&description=" + encodeURIComponent(myoptions.description);
313        url += "&imageurl=" + encodeURIComponent(myoptions.image);
314
315        root.popup(url);
316      }
317
318    };
319
320    // open share link in a popup
321    root.popup = function (url) {
322      // set left and top position
323      var popupWidth = 600,
324        popupHeight = 500,
325        // fix dual screen mode
326        dualScreenLeft = window.screenLeft !== undefined ? window.screenLeft : screen.left,
327        dualScreenTop = window.screenTop !== undefined ? window.screenTop : screen.top,
328        width = window.innerWidth ?
329                window.innerWidth :
330                document.documentElement.clientWidth ?
331                document.documentElement.clientWidth :
332                screen.width,
333        height = window.innerHeight ?
334                 window.innerHeight :
335                 document.documentElement.clientHeight ?
336                 document.documentElement.clientHeight :
337                 screen.height,
338        // calculate top and left position
339        left = ((width / 2) - (popupWidth / 2)) + dualScreenLeft,
340        top = ((height / 2) - (popupHeight / 2)) + dualScreenTop,
341
342        // show popup
343        shareWindow = window.open(url, "targetWindow",
344          "toolbar=no,location=no,status=no,menubar=no,scrollbars=yes,resizable=yes,width=" 
344+ popupWidth +
345          ", height=" + popupHeight + ", top=" + top + ", left=" + left);
346
347      // Puts focus on the newWindow
348      if (window.focus) {
349        shareWindow.focus();
350      }
351    };
352
353    /* Set options
354     ***********************************************/
355
356    // create default options
357    root.options = {
358      iconStyle: "default", // default or box
359      boxForm: "horizontal", // horizontal or vertical
360      position: "bottomCenter", // top / middle / bottom + Left / Center / Right
361      protocol: ["http", "https"].indexOf(window.location.href.split(":")[0]) === -1 ? "https://" : "//",
362      networks: "Weibo,Wechat,Douban,QQZone,Twitter,Pinterest,Facebook,GooglePlus,Reddit,Linkedin,Tumblr,Evernote"
363    };
364
365    // integrate custom options
366    for (var i in options) {
367      if (options.hasOwnProperty(i)) {
368        root.options[i] = options[i];
369      }
370    }
371    // convert networks string into array
372    //root.options.networks = root.options.networks.toLowerCase().split(",");
373    root.options.networks = root.options.networks.split(",");
374
375    function getOptions(el) {
376      // integrate data attribute options
377      var ret = {};
378      for (var i in root.options) {
379        if (root.options.hasOwnProperty(i)) {
380          ret[i] = root.options[i];
381        }
382      }
383
384      // these attrs must get dynamically.
385      ret.url = window.location.href;
386      ret.title = root.getTitle();
387      ret.image = root.getImage();
388      ret.description = root.getDescription();
389
390      for (var option in el.dataset) {
391        // replace only 'share-' prefixed data-attributes
392        if (option.match(/share/)) {
393          var newOption = option.replace(/share/, "");
394          if (!newOption.length) {
395            continue;
396          }
397          newOption = newOption.charAt(0).toLowerCase() + newOption.slice(1);
398          var val = el.dataset[option];
399          if (newOption === "networks") {
400            //val = val.toLowerCase().split(",");
401            val = val.split(",");
402          } else if (newOption === "url" && val && val[0] === "/") {
403            // fix relative url problem.
404            val = location.origin + val;
405          }
406          ret[newOption] = val;
407        }
408      }
409      return ret;
410    }
411
412    function createDropdown(el) {
413      // create dropdown
414      var dropdownEl = document.createElement("span");
415      dropdownEl.className = "need-share-button_dropdown";
416      if (el.querySelector(".need-share-button_dropdown")) {
417        return;
418      }
419      var myoptions = getOptions(el);
420
421      // set dropdown row length
422      if (myoptions.iconStyle == "box" && myoptions.boxForm == "horizontal") {
423        dropdownEl.className += " need-share-button_dropdown-box-horizontal";
424      } else if (myoptions.iconStyle == "box" && myoptions.boxForm == "vertical") {
425        dropdownEl.className += " need-share-button_dropdown-box-vertical";
426      }
427
428      // set dropdown position
429      setTimeout(function () {
430        switch (myoptions.position) {
431          case "topLeft":
432            dropdownEl.className += " need-share-button_dropdown-top-left";
433            break;
434          case "topRight":
435            dropdownEl.className += " need-share-button_dropdown-top-right";
436            break;
437          case "topCenter":
438            dropdownEl.className += " need-share-button_dropdown-top-center";
439            dropdownEl.style.marginLeft = -dropdownEl.offsetWidth / 2 + "px";
440            break;
441          case "middleLeft":
442            dropdownEl.className += " need-share-button_dropdown-middle-left";
443            dropdownEl.style.marginTop = -dropdownEl.offsetHeight / 2 + "px";
444            break;
445          case "middleRight":
446            dropdownEl.className += " need-share-button_dropdown-middle-right";
447            dropdownEl.style.marginTop = -dropdownEl.offsetHeight / 2 + "px";
448            break;
449          case "bottomLeft":
450            dropdownEl.className += " need-share-button_dropdown-bottom-left";
451            break;
452          case "bottomRight":
453            dropdownEl.className += " need-share-button_dropdown-bottom-right";
454            break;
455          case "bottomCenter":
456            dropdownEl.className += " need-share-button_dropdown-bottom-center";
457            dropdownEl.style.marginLeft = -dropdownEl.offsetWidth / 2 + "px";
458            break;
459          default:
460            dropdownEl.className += " need-share-button_dropdown-bottom-center";
461            dropdownEl.style.marginLeft = -dropdownEl.offsetWidth / 2 + "px";
462            break;
463        }
464      }, 1);
465
466
467      // fill fropdown with buttons
468      var iconClass = myoptions.iconStyle == "default" ? 
469                      "need-share-button_link need-share-button_" : 
470                      "need-share-button_link-" + myoptions.iconStyle + " need-share-button_link need-share-button_";
471      for (var network in myoptions.networks) {
472        if (myoptions.networks.hasOwnProperty(network)) {
473          var link = document.createElement("span");
474          network = myoptions.networks[network].trim();
475          var networkLC = network.toLowerCase();
476          link.className = iconClass + networkLC;
477          var fontello = ["weibo", "wechat", "douban", "qqzone", "renren"];
478          if (fontello.indexOf(networkLC) === -1) {
479            link.className += " social-" + networkLC;
480          } else {
481            link.className += " icon-" + networkLC;
482          }
483          link.dataset.network = networkLC;
484          link.title = network;
485          dropdownEl.appendChild(link);
486        }
487      }
488
489      dropdownEl.addEventListener("click", function (event) {
490        if (closest(event.target, ".need-share-button_link")) {
491          event.preventDefault();
492          event.stopPropagation();
493
494          root.share[event.target.dataset.network](el);
495          return false;
496        }
497      });
498
499      el.appendChild(dropdownEl);
500    }
501
502    // close on click outside
503    document.addEventListener("click", function (event) {
504      var openedEl = document.querySelector(".need-share-button-opened");
505      if (!closest(event.target, ".need-share-button-opened")) {
506        if (openedEl) {
507          openedEl.classList.remove("need-share-button-opened");
508
509          // hide wechat code image when close the dropdown.
510          if (openedEl.querySelector(".need-share-wechat-code-image")) {
511            openedEl.querySelector(".need-share-wechat-code-image").remove();
512          }
513        } else {
514          var el = closest(event.target, root.elem);
515          if (el) {
516            if (!el.classList.contains("need-share-button-opened")) {
517              createDropdown(el);
518              setTimeout(function () {
519                el.classList.add("need-share-button-opened");
520              }, 1);
521            }
522          }
523        }
524      } else {
525        setTimeout(function () {
526          openedEl.classList.remove("need-share-button-opened");
527
528          // hide wechat code image when close the dropdown.
529          if (openedEl.querySelector(".need-share-wechat-code-image")) {
530            openedEl.querySelector(".need-share-wechat-code-image").remove();
531          }
532        }, 1);
533      }
534    });
535
536  };
537})();

Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.