自己封装的一个JS分享组件

Posted 卷柏的花期

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了自己封装的一个JS分享组件相关的知识,希望对你有一定的参考价值。

  因为工作的需求之前也封装过一个JS分享插件,集成了我们公司常用的几个分享平台。

  但是总感觉之前的结构上很不理想,样式,行为揉成一起,心里想的做的完美,实际上总是很多的偏差,所以这次我对其进行了改版。

  这次的核心就是:JS只负责事件+结构,也就是把功能实现出来,具体的外观样式,则使用者自己进行定义。

  以下是新版分享插件的代码:

  

  1 (function(root){
  2     ‘use strict‘;
  3     function share(params){
  4 
  5         this.params = params;
  6         this.dom = params.dom;
  7         this.type = params.type || [];
  8         (this.dom && this.type && this.type.length)?this.custom() : this.defa();
  9 
 10         
 11     }
 12 
 13     share.prototype.custom=function(){ //生成自定义的DOM结构
 14         var str = ‘‘;
 15         for(var i=0,l=this.type.length;i<l;i++){
 16             str+=‘<a href="javascript:;" shareType="‘+ this.type[i] +‘"></a>‘;
 17         }
 18         this.dom.innerhtml = str;
 19         this.bind();
 20     };
 21 
 22     share.prototype.defa=function(){ //生成默认的DOM结构
 23         var str = ‘‘;
 24         this.type = [‘weibo‘,‘qqweibo‘,‘qq‘,‘qqzone‘,‘wx‘,‘rr‘,‘bdtb‘,‘db‘];
 25         for(var i=0,l=this.type.length;i<l;i++){
 26             str+=‘<a href="javascript:;" shareType="‘+ this.type[i] +‘">‘+this.type[i]+‘</a>‘;
 27         }
 28         this.dom.innerHTML = str;
 29         this.bind();
 30     };
 31 
 32     share.prototype.bind=function(){    //给接口绑定事件
 33         var _this = this;
 34         this.dom.onclick=function(ev){
 35             var e = ev || window.event,
 36                 oTarget = e.target || e.srcElement;
 37             (oTarget.nodeName === ‘A‘ && _this.core(oTarget));
 38         }
 39         this.dom = null;
 40     }
 41 
 42     share.prototype.core=function(o){
 43 
 44         var _this = this,
 45             result = ‘‘,
 46             urls = ‘‘,
 47             title = ‘‘,
 48             desc = ‘‘,
 49             images = ‘‘,
 50             ercode = ‘‘;
 51 
 52         function weibo(){
 53             result = ‘http://service.weibo.com/share/share.php?‘;
 54             urls = (_this.params.weibo && _this.params.weibo.url) ? _this.params.weibo.url : _this.params.url; 
 55             title = (_this.params.weibo && _this.params.weibo.title) ? _this.params.weibo.title : _this.params.title; 
 56             images = (_this.params.weibo && _this.params.weibo.images) ? _this.params.weibo.images : _this.params.images; 
 57             result+= ‘title=‘ + encodeURIComponent(title)+‘&url=‘ + encodeURIComponent(urls) + ‘&pic=‘+ encodeURIComponent(images);
 58             window.open(result);
 59         }
 60         function qqweibo(){
 61             result = ‘http://share.v.t.qq.com/index.php?c=share&a=index‘;
 62             urls = (_this.params.qqweibo && _this.params.qqweibo.url) ? _this.params.qqweibo.url : _this.params.url; 
 63             title = (_this.params.qqweibo && _this.params.qqweibo.title) ? _this.params.qqweibo.title : _this.params.title; 
 64             images = (_this.params.qqweibo && _this.params.qqweibo.images) ? _this.params.qqweibo.images : _this.params.images; 
 65             result+= ‘&title=‘ + encodeURIComponent(title)+‘&url=‘ + encodeURIComponent(urls) + ‘&pic=‘+ encodeURIComponent(images);
 66             window.open(result);
 67         }
 68         function qq(){
 69             var site = ‘‘,
 70                 summary = ‘‘;
 71             result = ‘http://connect.qq.com/widget/shareqq/index.html?‘;
 72             urls = (_this.params.qq && _this.params.qq.url) ? _this.params.qq.url : _this.params.url; 
 73             site = (_this.params.qq && _this.params.qq.site) ? _this.params.qq.site : ‘‘; 
 74             title = (_this.params.qq && _this.params.qq.title) ? _this.params.qq.title : _this.params.title; 
 75             desc = (_this.params.qq && _this.params.qq.desc) ? _this.params.qq.desc : _this.params.desc; 
 76             summary = (_this.params.qq && _this.params.qq.summary) ? _this.params.qq.summary : ‘‘; 
 77             images = (_this.params.qq && _this.params.qq.images) ? _this.params.qq.images : _this.params.images; 
 78             result+= ‘url=‘ + encodeURIComponent(urls)+‘&title=‘ + encodeURIComponent(title) +‘&desc=‘+ encodeURIComponent(desc) + ‘&summary=‘+encodeURIComponent(summary)+‘&pics=‘+ encodeURIComponent(images) +‘&site=‘+ encodeURIComponent(site);
 79             window.open(result);
 80         }
 81 
 82         function qqzone(){
 83             var site = ‘‘,
 84                 summary = ‘‘;
 85             result = ‘http://sns.qzone.qq.com/cgi-bin/qzshare/cgi_qzshare_onekey?‘;
 86             urls = (_this.params.qqzone && _this.params.qqzone.url) ? _this.params.qqzone.url : _this.params.url; 
 87             site = (_this.params.qqzone && _this.params.qqzone.site) ? _this.params.qqzone.site : ‘‘; 
 88             title = (_this.params.qqzone && _this.params.qqzone.title) ? _this.params.qqzone.title : _this.params.title; 
 89             desc = (_this.params.qqzone && _this.params.qqzone.desc) ? _this.params.qqzone.desc : _this.params.desc;
 90             summary = (_this.params.qqzone && _this.params.qqzone.summary) ? _this.params.qqzone.summary : ‘‘; 
 91             images = (_this.params.qqzone && _this.params.qqzone.images) ? _this.params.qqzone.images : _this.params.images; 
 92             result+= ‘url=‘ + encodeURIComponent(urls)+‘&title=‘ + encodeURIComponent(title) + ‘&desc=‘+ encodeURIComponent(desc) +‘&summary=‘+encodeURIComponent(summary) +‘&pic=‘+ encodeURIComponent(images) + ‘&site=‘+ encodeURIComponent(site);
 93             window.open(result);
 94         }
 95         
 96         function rr(){
 97             result = ‘http://widget.renren.com/dialog/share?‘;
 98             urls = (_this.params.rr && _this.params.rr.url) ? _this.params.rr.url : _this.params.url; 
 99             title = (_this.params.rr && _this.params.rr.title) ? _this.params.rr.title : _this.params.title; 
100             images = (_this.params.rr && _this.params.rr.images) ? _this.params.rr.images : _this.params.images; 
101             desc = (_this.params.rr && _this.params.rr.desc) ? _this.params.rr.desc : _this.params.desc;
102             result+= ‘resourceUrl=‘ +encodeURIComponent(urls)+‘&title=‘ + encodeURIComponent(title) + ‘&description=‘+ encodeURIComponent(desc) +‘&pic=‘+ encodeURIComponent(images);
103             window.open(result);
104         }
105         function bdtb(){
106             result = ‘http://tieba.baidu.com/f/commit/share/openShareApi?‘;
107             urls = (_this.params.bdtb && _this.params.bdtb.url) ? _this.params.bdtb.url : _this.params.url; 
108             title = (_this.params.bdtb && _this.params.bdtb.title) ? _this.params.bdtb.title : _this.params.title; 
109             desc = (_this.params.bdtb && _this.params.bdtb.desc) ? _this.params.bdtb.desc : _this.params.desc;
110             images = (_this.params.bdtb && _this.params.bdtb.images) ? _this.params.bdtb.images : _this.params.images; 
111             result+= ‘title=‘ + encodeURIComponent(title)+‘&url=‘ + encodeURIComponent(urls) +‘&pic=‘+ encodeURIComponent(images)+‘&desc=‘+ encodeURIComponent(desc) ;
112             window.open(result);
113         }        
114 
115         function db(){
116             result = ‘http://shuo.douban.com/!service/share?‘;
117             urls = (_this.params.db && _this.params.db.url) ? _this.params.db.url : _this.params.url; 
118             title = (_this.params.db && _this.params.db.title) ? _this.params.db.title : _this.params.title; 
119             desc = (_this.params.db && _this.params.db.desc) ? _this.params.db.desc : _this.params.desc;
120             images = (_this.params.db && _this.params.db.images) ? _this.params.db.images : _this.params.images; 
121             result+= ‘image=‘ + encodeURIComponent(images)+‘&href=‘ + encodeURIComponent(urls) +‘&name=‘+ encodeURIComponent(title)+‘&text=‘+ encodeURIComponent(desc) ;
122             window.open(result);
123         }
124 
125         function wx(){
126             var e = document.getElementById(‘share_qrcode_box‘) || false,
127                 img = new Image(),
128                 _w = 0,
129                 _h = 0,
130                 oDiv = null;
131 
132             img.onload=function(){
133                 _w = this.width;
134                 _h = this.height;
135                 
136                 oDiv = document.createElement(‘div‘);
137                 oDiv.className = ‘share_qrcode‘;
138                 oDiv.id = ‘share_qrcode_box‘;
139                 oDiv.innerHTML = ‘<img src="‘+ _this.params.qrcode +‘" /><span href="javascript:;" class="share_close">&#10005;</span>‘;
140                 
141                 if(_this.params.target == ‘blank‘ && !e){
142                     oDiv.style.cssText = ‘position:fixed;_position:absolute;left:50%;top:50%;margin-left:‘+-(_w+20)/2+‘px;margin-top:‘+-(_h+20)/2+‘px;‘;
143                     document.body.appendChild(oDiv);
144                 }
145 
146                 if(_this.params.target == ‘self‘ && !e){
147                     oDiv.style.cssText = ‘position:absolute;‘;
148                     _this.params.dom.cssText = ‘position:relative‘;
149                     _this.params.dom.appendChild(oDiv);
150                 }
151                 
152                 oDiv.children[1].style.cssText = "position:absolute;cursor:pointer;";
153                 oDiv.children[1].onclick=function(){
154                     var e = document.getElementById(‘share_qrcode_box‘);
155                     e && e.parentNode.removeChild(e);
156                 }
157                 oDiv.children[1] = null;
158 
159             }
160 
161             img.src=_this.params.qrcode;
162         }
163         
164         switch(o.getAttribute(‘sharetype‘)){
165             case ‘weibo‘:weibo();break;
166             case ‘qqweibo‘:qqweibo();break;
167             case ‘qq‘:qq();break;
168             case ‘qqzone‘:qqzone();break;
169             case ‘rr‘:rr();break;
170             case ‘bdtb‘:bdtb();break;
171             case ‘db‘:db();break;
172             case ‘wx‘:wx();break;
173         }
174 
175     }
176     root.share = function(params){
177         new share(params);
178     };
179 })(window);

 

使用方式如下:

 1 share({
 2         dom:document.getElementById(‘box‘), //指定结构生成的盒子。
 3         url:‘分享的url‘,
 4         title:‘分享的标题‘,
 5         desc:‘分享的描述‘,
 6         images:‘分享的图片url‘,
 7         qrcode:‘微信分享的二维码‘,
 8         target:‘blank‘,    //设置二维码的显示方式,blank窗口居中显示,selef,当前位置显示。
 9         qqzone:{ //单独配置qq空间的分享参数。
10             summary:‘这是一个摘要‘, 
11             site:‘http://www.xxx.com‘
12         }
13     });
14 /* ============
15 
16 参数是一个对象,具体的参数如下:
17 
18     |-- dom [object]        :指定生成分享组件的dom对象。
19     |-- type [array]            :指定分享的类型。默认值为空数组,表示生成全部的分享类型。
20         |- weibo [string]      :分享到新浪微博。
21         |- qqweibo [string]    :分享到QQ微博。
22         |- qq [string]         :分享到QQ好友。
23         |- qqzone [string]     :分享到QQ空间。
24         |- wx [string]         :分享到微信中去。
25         |- rr [string]        :分享到人人网。
26         |- bdtb [string]    :分享到百度贴吧。
27         |- db [string]        :分享到豆瓣。
28     |-- url [string]             :通用的分享链接。
29     |-- title [string]        :通用的分享标题。
30     |-- desc [string]        :通用的分享描述。
31     |-- image [string]         :通用的分享图片。
32     |-- qrcode [string]         :设置微信的二维码。
33     |-- target [string]         :设置微信二维码的打开方式。
34         |- self            :当前位置显示。
35         |- blank            :弹出层打开。
36     |-- weibo [object]        :单独设置新浪微博分享的参数。
37         |- url             :单独设置新浪微博分享的url。
38         |- title            :单独设置新浪微博分享的标题。    
39         |- images            :单独设置新浪微博分享的图片。
40      |-- qqweibo [object]    :单独设置QQ微博分享的参数。
41         |- url             :单独设置QQ微博分享的url。
42         |- title            :单独设置QQ微博分享的标题。    
43         |- images            :单独设置QQ微博分享的图片。
44     |-- qq [object]            :单独设置QQ分享的参数。
45         |- url             :单独设置QQ分享的url。
46         |- title            :单独设置QQ分享的标题。    
47         |- desc            :单独设置QQ分享的描述。
48         |- summary        :单独设置QQ分享的摘要。
49         |- site            :单独设置QQ分享的来源。
50         |- images            :单独设置QQ分享的图片。
51     |-- qqzone [object]        :单独设置QQ空间分享的参数。
52         |- url             :单独设置QQ空间分享的url。
53         |- title            :单独设置QQ空间分享的标题。    
54         |- desc            :单独设置QQ空间分享的描述。
55         |- summary        :单独设置QQ空间分享的摘要。
56         |- site            :单独设置QQ空间分享的来源。
57         |- images            :单独设置QQ空间分享的图片。
58     |-- rr [object]            :单独设置人人分享的参数。
59         |- url             :单独设置人人分享的url。
60         |- title            :单独设置人人分享的标题。    
61         |- desc            :单独设置人人分享的描述。
62         |- images            :单独设置人人分享的图片。
63     |--bdtb [object]        :单独设置百度贴吧分享的参数。
64         |- url             :单独设置百度贴吧分享的url。
65         |- title            :单独设置百度贴吧分享的标题。    
66         |- desc            :单独设置百度贴吧分享的描述。
67         |- images            :单独设置百度贴吧分享的图片。
68     |--db [object]            :单独设置豆瓣分享的参数。
69         |- url             :单独设置豆瓣分享的url。
70         |- title            :单独设置豆瓣分享的标题。    
71         |- desc            :单独设置豆瓣分享的描述。
72         |- images            :单独设置豆瓣分享的图片。
73 
74 ==============*/

 

以上是关于自己封装的一个JS分享组件的主要内容,如果未能解决你的问题,请参考以下文章

回归 | js实用代码片段的封装与总结(持续更新中...)

VsCode 代码片段-提升研发效率

vue全局封装微信公众号分享模块

自己封装js组件 - 初级

JS组件系列——封装自己的JS组件

从零开始教你封装自己的vue组件