PageSourceSearch

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

js genuifx.github.io collected 2026-10-03 09:14:11 UTC 20,208 bytes, 545 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://pan.baidu.com/share/qrcode?w=400&h=400&url=" + 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
123          if (root.options.position == 'middleRight') {
124            dropdownEl.insertBefore(img, dropdownEl.children[0]);
125          }
126          else {
127            dropdownEl.appendChild(img);
128          }
129        }
130      },
131      "douban": function (el) {
132        var myoptions = getOptions(el);
133        var url = "https://www.douban.com/share/service?name=" +
134          encodeURIComponent(myoptions.title) +
135          "&href=" + encodeURIComponent(myoptions.url) +
136          "&image=" + encodeURIComponent(myoptions.image);
137        root.popup(url);
138      },
139      "qqzone": function (el) {
140        var myoptions = getOptions(el);
141        var url = "http://sns.qzone.qq.com/cgi-bin/qzshare/cgi_qzshare_onekey?title=" +
142          encodeURIComponent(myoptions.title) +
143          "&url=" + encodeURIComponent(myoptions.url) +
144          "&pics=" + encodeURIComponent(myoptions.image) +
145          "&desc=" + encodeURIComponent(myoptions.description);
146        root.popup(url);
147      },
148      "renren": function (el) {
149        var myoptions = getOptions(el);
150        var url = "http://widget.renren.com/dialog/share?title=" +
151          encodeURIComponent(myoptions.title) +
152          "&resourceUrl=" + encodeURIComponent(myoptions.url) +
153          "&pic=" + encodeURIComponent(myoptions.image) +
154          "&description=" + encodeURIComponent(myoptions.description);
155        root.popup(url);
156      },
157      "mailto": function (el) {
158        var myoptions = getOptions(el);
159        var url = "mailto:?subject=" + encodeURIComponent(myoptions.title) +
160          "&body=Thought you might enjoy reading this: " + encodeURIComponent(myoptions.url) +
161          " - " + encodeURIComponent(myoptions.description);
162
163        window.location.href = url;
164      },
165      "twitter": function (el) {
166        var myoptions = getOptions(el);
167        var url = myoptions.protocol + "twitter.com/intent/tweet?text=";
168        url += encodeURIComponent(myoptions.title) + "&url=" + encodeURIComponent(myoptions.url);
169
170        root.popup(url);
171      },
172      "pinterest": function (el) {
173        var myoptions = getOptions(el);
174        var url = myoptions.protocol + "pinterest.com/pin/create/bookmarklet/?is_video=false";
175        url += "&media=" + encodeURIComponent(myoptions.image);
176        url += "&url=" + encodeURIComponent(myoptions.url);
177        url += "&description=" + encodeURIComponent(myoptions.title);
178
179        root.popup(url);
180      },
181      "facebook": function (el) {
182        var myoptions = getOptions(el);
183        var url = myoptions.protocol + "www.facebook.com/share.php?";
184        url += "u=" + encodeURIComponent(myoptions.url);
185        url += "&title=" + encodeURIComponent(myoptions.title);
186
187        root.popup(url);
188      },
189      "googleplus": function (el) {
190        var myoptions = getOptions(el);
191        var url = myoptions.protocol + "plus.google.com/share?";
192        url += "url=" + encodeURIComponent(myoptions.url);
193
194        root.popup(url);
195      },
196      "reddit": function (el) {
197        var myoptions = getOptions(el);
198        var url = myoptions.protocol + "www.reddit.com/submit?";
199        url += "url=" + encodeURIComponent(myoptions.url);
200        url += "&title=" + encodeURIComponent(myoptions.title);
201
202        root.popup(url);
203      },
204      "delicious": function (el) {
205        var myoptions = getOptions(el);
206        var url = myoptions.protocol + "del.icio.us/post?";
207        url += "url=" + encodeURIComponent(myoptions.url);
208        url += "&title=" + encodeURIComponent(myoptions.title);
209        url += "&notes=" + encodeURIComponent(myoptions.description);
210
211        root.popup(url);
212      },
213      "stumbleupon": function (el) {
214        var myoptions = getOptions(el);
215        var url = myoptions.protocol + "www.stumbleupon.com/submit?";
216        url += "url=" + encodeURIComponent(myoptions.url);
217        url += "&title=" + encodeURIComponent(myoptions.title);
218
219        root.popup(url);
220      },
221      "linkedin": function (el) {
222        var myoptions = getOptions(el);
223        var url = myoptions.protocol + "www.linkedin.com/shareArticle?mini=true";
224        url += "&url=" + encodeURIComponent(myoptions.url);
225        url += "&title=" + encodeURIComponent(myoptions.title);
226        url += "&source=" + encodeURIComponent(myoptions.source);
227
228        root.popup(url);
229      },
230      "slashdot": function (el) {
231        var myoptions = getOptions(el);
232        var url = myoptions.protocol + "slashdot.org/bookmark.pl?";
233        url += "url=" + encodeURIComponent(myoptions.url);
234        url += "&title=" + encodeURIComponent(myoptions.title);
235
236        root.popup(url);
237      },
238      "technorati": function (el) {
239        var myoptions = getOptions(el);
240        var url = myoptions.protocol + "technorati.com/faves?";
241        url += "add=" + encodeURIComponent(myoptions.url);
242        url += "&title=" + encodeURIComponent(myoptions.title);
243
244        root.popup(url);
245      },
246      "posterous": function (el) {
247        var myoptions = getOptions(el);
248        var url = myoptions.protocol + "posterous.com/share?";
249        url += "linkto=" + encodeURIComponent(myoptions.url);
250
251        root.popup(url);
252      },
253      "tumblr": function (el) {
254        var myoptions = getOptions(el);
255        var url = myoptions.protocol + "www.tumblr.com/share?v=3";
256        url += "&u=" + encodeURIComponent(myoptions.url);
257        url += "&t=" + encodeURIComponent(myoptions.title);
258
259        root.popup(url);
260      },
261      "googlebookmarks": function (el) {
262        var myoptions = getOptions(el);
263        var url = myoptions.protocol + "www.google.com/bookmarks/mark?op=edit";
264        url += "&bkmk=" + encodeURIComponent(myoptions.url);
265        url += "&title=" + encodeURIComponent(myoptions.title);
266        url += "&annotation=" + encodeURIComponent(myoptions.description);
267
268        root.popup(url);
269      },
270      "newsvine": function (el) {
271        var myoptions = getOptions(el);
272        var url = myoptions.protocol + "www.newsvine.com/_tools/seed&save?";
273        url += "u=" + encodeURIComponent(myoptions.url);
274        url += "&h=" + encodeURIComponent(myoptions.title);
275
276        root.popup(url);
277      },
278      "evernote": function (el) {
279        var myoptions = getOptions(el);
280        var url = myoptions.protocol + "www.evernote.com/clip.action?";
281        url += "url=" + encodeURIComponent(myoptions.url);
282        url += "&title=" + encodeURIComponent(myoptions.title);
283
284        root.popup(url);
285      },
286      "friendfeed": function (el) {
287        var myoptions = getOptions(el);
288        var url = myoptions.protocol + "www.friendfeed.com/share?";
289        url += "url=" + encodeURIComponent(myoptions.url);
290        url += "&title=" + encodeURIComponent(myoptions.title);
291
292        root.popup(url);
293      },
294      "vkontakte": function (el) {
295        var myoptions = getOptions(el);
296        var url = myoptions.protocol + "vkontakte.ru/share.php?";
297        url += "url=" + encodeURIComponent(myoptions.url);
298        url += "&title=" + encodeURIComponent(myoptions.title);
299        url += "&description=" + encodeURIComponent(myoptions.description);
300        url += "&image=" + encodeURIComponent(myoptions.image);
301        url += "&noparse=true";
302
303        root.popup(url);
304      },
305      "odnoklassniki": function (el) {
306        var myoptions = getOptions(el);
307        var url = myoptions.protocol + "www.odnoklassniki.ru/dk?st.cmd=addShare&st.s=1";
308        url += "&st.comments=" + encodeURIComponent(myoptions.description);
309        url += "&st._surl=" + encodeURIComponent(myoptions.url);
310
311        root.popup(url);
312      },
313      "mailru": function (el) {
314        var myoptions = getOptions(el);
315        var url = myoptions.protocol + "connect.mail.ru/share?";
316        url += "url=" + encodeURIComponent(myoptions.url);
317        url += "&title=" + encodeURIComponent(myoptions.title);
318        url += "&description=" + encodeURIComponent(myoptions.description);
319        url += "&imageurl=" + encodeURIComponent(myoptions.image);
320
321        root.popup(url);
322      }
323
324    };
325
326    // open share link in a popup
327    root.popup = function (url) {
328      // set left and top position
329      var popupWidth = 600,
330        popupHeight = 500,
331        // fix dual screen mode
332        dualScreenLeft = window.screenLeft !== undefined ? window.screenLeft : screen.left,
333        dualScreenTop = window.screenTop !== undefined ? window.screenTop : screen.top,
334        width = window.innerWidth ?
335                window.innerWidth :
336                document.documentElement.clientWidth ?
337                document.documentElement.clientWidth :
338                screen.width,
339        height = window.innerHeight ?
340                 window.innerHeight :
341                 document.documentElement.clientHeight ?
342                 document.documentElement.clientHeight :
343                 screen.height,
344        // calculate top and left position
345        left = ((width / 2) - (popupWidth / 2)) + dualScreenLeft,
346        top = ((height / 2) - (popupHeight / 2)) + dualScreenTop,
347
348        // show popup
349        shareWindow = window.open(url, "targetWindow",
350          "toolbar=no,location=no,status=no,menubar=no,scrollbars=yes,resizable=yes,width=" 
350+ popupWidth +
351          ", height=" + popupHeight + ", top=" + top + ", left=" + left);
352
353      // Puts focus on the newWindow
354      if (window.focus) {
355        shareWindow.focus();
356      }
357    };
358
359    /* Set options
360     ***********************************************/
361
362    // create default options
363    root.options = {
364      iconStyle: "default", // default or box
365      boxForm: "horizontal", // horizontal or vertical
366      position: "bottomCenter", // top / middle / bottom + Left / Center / Right
367      protocol: ["http", "https"].indexOf(window.location.href.split(":")[0]) === -1 ? "https://" : "//",
368      networks: "Weibo,Wechat,Douban,QQZone,Twitter,Pinterest,Facebook,GooglePlus,Reddit,Linkedin,Tumblr,Evernote"
369    };
370
371    // integrate custom options
372    for (var i in options) {
373      if (options.hasOwnProperty(i)) {
374        root.options[i] = options[i];
375      }
376    }
377    // convert networks string into array
378    //root.options.networks = root.options.networks.toLowerCase().split(",");
379    root.options.networks = root.options.networks.split(",");
380
381    function getOptions(el) {
382      // integrate data attribute options
383      var ret = {};
384      for (var i in root.options) {
385        if (root.options.hasOwnProperty(i)) {
386          ret[i] = root.options[i];
387        }
388      }
389
390      // these attrs must get dynamically.
391      ret.url = window.location.href;
392      ret.title = root.getTitle();
393      ret.image = root.getImage();
394      ret.description = root.getDescription();
395
396      for (var option in el.dataset) {
397        // replace only 'share-' prefixed data-attributes
398        if (option.match(/share/)) {
399          var newOption = option.replace(/share/, "");
400          if (!newOption.length) {
401            continue;
402          }
403          newOption = newOption.charAt(0).toLowerCase() + newOption.slice(1);
404          var val = el.dataset[option];
405          if (newOption === "networks") {
406            //val = val.toLowerCase().split(",");
407            val = val.split(",");
408          } else if (newOption === "url" && val && val[0] === "/") {
409            // fix relative url problem.
410            val = location.origin + val;
411          }
412          ret[newOption] = val;
413        }
414      }
415      return ret;
416    }
417
418    function createDropdown(el) {
419      // create dropdown
420      var dropdownEl = document.createElement("span");
421      dropdownEl.className = "need-share-button_dropdown";
422      if (el.querySelector(".need-share-button_dropdown")) {
423        return;
424      }
425      var myoptions = getOptions(el);
426
427      // set dropdown row length
428      if (myoptions.iconStyle == "default" && myoptions.boxForm == "vertical") {
429        dropdownEl.className += " need-share-button_dropdown-box-vertical";
430      } else if (myoptions.iconStyle == "box" && myoptions.boxForm == "horizontal") {
431        dropdownEl.className += " need-share-button_dropdown-box-horizontal";
432      } else if (myoptions.iconStyle == "box" && myoptions.boxForm == "vertical") {
433        dropdownEl.className += " need-share-button_dropdown-box-vertical";
434      }
435
436      // set dropdown position
437      setTimeout(function () {
438        switch (myoptions.position) {
439          case "topLeft":
440            dropdownEl.className += " need-share-button_dropdown-top-left";
441            break;
442          case "topRight":
443            dropdownEl.className += " need-share-button_dropdown-top-right";
444            break;
445          case "topCenter":
446            dropdownEl.className += " need-share-button_dropdown-top-center";
447            dropdownEl.style.marginLeft = -dropdownEl.offsetWidth / 2 + "px";
448            break;
449          case "middleLeft":
450            dropdownEl.className += " need-share-button_dropdown-middle-left";
451            dropdownEl.style.marginTop = -dropdownEl.offsetHeight / 2 + "px";
452            break;
453          case "middleRight":
454            dropdownEl.className += " need-share-button_dropdown-middle-right";
455            dropdownEl.style.marginTop = -dropdownEl.offsetHeight / 2 + "px";
456            break;
457          case "bottomLeft":
458            dropdownEl.className += " need-share-button_dropdown-bottom-left";
459            break;
460          case "bottomRight":
461            dropdownEl.className += " need-share-button_dropdown-bottom-right";
462            break;
463          case "bottomCenter":
464            dropdownEl.className += " need-share-button_dropdown-bottom-center";
465            dropdownEl.style.marginLeft = -dropdownEl.offsetWidth / 2 + "px";
466            break;
467          default:
468            dropdownEl.className += " need-share-button_dropdown-bottom-center";
469            dropdownEl.style.marginLeft = -dropdownEl.offsetWidth / 2 + "px";
470            break;
471        }
472      }, 1);
473
474
475      // fill fropdown with buttons
476      var iconClass = myoptions.iconStyle == "default" ?
477                      "need-share-button_link need-share-button_" :
478                      "need-share-button_link-" + myoptions.iconStyle + " need-share-button_link need-share-button_";
479      for (var network in myoptions.networks) {
480        if (myoptions.networks.hasOwnProperty(network)) {
481          var link = document.createElement("span");
482          network = myoptions.networks[network].trim();
483          var networkLC = network.toLowerCase();
484          link.className = iconClass + networkLC;
485          var fontello = ["weibo", "wechat", "douban", "qqzone", "renren"];
486          if (fontello.indexOf(networkLC) === -1) {
487            link.className += " social-" + networkLC;
488          } else {
489            link.className += " icon-" + networkLC;
490          }
491          link.dataset.network = networkLC;
492          link.title = network;
493          dropdownEl.appendChild(link);
494        }
495      }
496
497      dropdownEl.addEventListener("click", function (event) {
498        if (closest(event.target, ".need-share-button_link")) {
499          event.preventDefault();
500          event.stopPropagation();
501
502          root.share[event.target.dataset.network](el);
503          return false;
504        }
505      });
506
507      el.appendChild(dropdownEl);
508    }
509
510    // close on click outside
511    document.addEventListener("click", function (event) {
512      var openedEl = document.querySelector(".need-share-button-opened");
513      if (!closest(event.target, ".need-share-button-opened")) {
514        if (openedEl) {
515          openedEl.classList.remove("need-share-button-opened");
516
517          // hide wechat code image when close the dropdown.
518          if (openedEl.querySelector(".need-share-wechat-code-image")) {
519            openedEl.querySelector(".need-share-wechat-code-image").remove();
520          }
521        } else {
522          var el = closest(event.target, root.elem);
523          if (el) {
524            if (!el.classList.contains("need-share-button-opened")) {
525              createDropdown(el);
526              setTimeout(function () {
527                el.classList.add("need-share-button-opened");
528              }, 1);
529            }
530          }
531        }
532      } else {
533        setTimeout(function () {
534          openedEl.classList.remove("need-share-button-opened");
535
536          // hide wechat code image when close the dropdown.
537          if (openedEl.querySelector(".need-share-wechat-code-image")) {
538            openedEl.querySelector(".need-share-wechat-code-image").remove();
539          }
540        }, 1);
541      }
542    });
543
544  };
545})();

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.