前几天由于工作需要制作一个分享按钮,考虑到后续其他项目可能也会用到,于是就打算写成插件化,正好也给我自己的插件jquery.hooray增加一个新的功能,为了不浪费大家时间,我先把demo放出来,如果觉得能用到,或者想学是怎么制作的,那就继续往下看。(demo演示)

既然要做成插件,那可制定性肯定要强,不能定死,比如不能把显示个数定死,不能把分享按钮排序定死等等(不过有些东西还是要定死的,太灵活了也就成不了插件了)。这里我的操作办法是……先看代码吧

我把所有按钮都用A标记来制作,然后用一个div容器把它们都包在里面,只要在这个容器里,用的是A标记,并且class的名称是按我的规定来命名的就一切OK,至于显示数量,排列顺序什么的,随意。

HTML制定好规范后,就可以开始写css样式了,需要注意的是,为了减少http的请求,按钮的图片我是用css sprites拼接在一起了,如

同时我也制作了32*32的大图标版本,当然你也可以制作其他尺寸的,按个人需求来就行。下面是css代码,没有太多好介绍的,看下就行。

.hr-share-16 a{display:block;width:18px;height:16px;background:url(HRico_16x16.png) no-repeat;float:left;cursor:pointer}

.hr-share-16 a:hover{opacity:0.8}

.hr-share-16 a.hr-share-more{background-position:0 0}

.hr-share-16 a.hr-share-tsina{background-position:0 -16px}

.hr-share-16 a.hr-share-tqq{background-position:0 -32px}

.hr-share-16 a.hr-share-qzone{background-position:0 -48px}

.hr-share-16 a.hr-share-renren{background-position:0 -64px}

.hr-share-16 a.hr-share-baidu{background-position:0 -80px}

.hr-share-16 a.hr-share-115{background-position:0 -96px}

.hr-share-16 a.hr-share-tsohu{background-position:0 -112px}

.hr-share-16 a.hr-share-taobao{background-position:0 -128px}

.hr-share-16 a.hr-share-xiaoyou{background-position:0 -144px}

.hr-share-16 a.hr-share-hi{background-position:0 -160px}

.hr-share-16 a.hr-share-fanfou{background-position:0 -176px}

.hr-share-16 a.hr-share-sohubai{background-position:0 -192px}

.hr-share-16 a.hr-share-feixin{background-position:0 -208px}

.hr-share-16 a.hr-share-youshi{background-position:0 -224px}

.hr-share-16 a.hr-share-tianya{background-position:0 -240px}

.hr-share-16 a.hr-share-msn{background-position:0 -256px}

.hr-share-16 a.hr-share-douban{background-position:0 -272px}

.hr-share-16 a.hr-share-twangyi{background-position:0 -288px}

.hr-share-16 a.hr-share-mop{background-position:0 -304px}

这里我特地为每个按钮的样式加了个.hr-share-16这个前缀,目的一是为了区分出16*16和32*32的图标样式,二是为了之后js代码部分的操作,后面我会讲到。

做完了上面这两步,接下来重点就来了,就是JS的编写,在此之前,我们先把思路理一下,防止在编写完JS后发现有更好的方法,导致重新编写。

首先,每个网站都有自己特定分享链接的代码,我们随机拿2个过来参考下,比如最近很火的腾讯微博和新浪微博。

view sourceprint?http://v.t.qq.com/share/share.php?title=分享插件 - jquery.HooRay - jQuery插件 - 制作:胡尐睿丶&url=http://saw.caifutang.com/jquery.hooray/HRshare.html&appkey=118cd1d635c44eab9a4840b2fbf8b0fb

view sourceprint?http://service.weibo.com/share/share.php?title=分享插件 - jquery.HooRay - jQuery插件 - 制作:胡尐睿丶&url=http://saw.caifutang.com/jquery.hooray/HRshare.html&source=bookmark&appkey=2992571369

发现没有?对,就是一般的分享链接只需要两个参数就行,一是页面的标题,另一个就是页面的链接,至于腾讯微博和新浪微博都需要一个appkey,这个另外再说,如果没有,直接用我提供的这个就行,因为appkey需要去申请,过程略微有点麻烦。

接下来,如果掌握了这个,操作起来就简单了,我们只需要对每个按钮绑定一个点击事件,然后调转到制定的链接,就一切OK了。但是如果手动一个个去绑定,那感觉就很麻烦了,而且如果增加一个新的分享,改动的代码量似乎也有点大,而且代码行数也多。所以,绑定按钮事件我是通过循环绑定的。下面就来看下部分代码片段吧。

首先我定义了这么两个数组(tab键的缩进在这里不起作用了,大家凑合着看吧):

var shareico = {

"tqq" :"http://v.t.qq.com/share/share.php?title={title}&url={url}&appkey=118cd1d635c44eab9a4840b2fbf8b0fb",

"tsina" :"http://service.weibo.com/share/share.php?title={title}&url={url}&source=bookmark&appkey=2992571369",

"qzone" :"http://sns.qzone.qq.com/cgi-bin/qzshare/cgi_qzshare_onekey?url={url}&title={title}",

"renren" :"http://share.renren.com/share/buttonshare.do?link={url}&title={title}",

"baidu" :"http://cang.baidu.com/do/add?it={title}&iu={url}&fr=ien#nw=1",

"115" :"http://sc.115.com/add?url={url}&title={title}",

"tsohu" :"http://t.sohu.com/third/post.jsp?url={url}&title={title}&content=utf-8",

"taobao" :"http://share.jianghu.taobao.com/share/addShare.htm?url={url}",

"xiaoyou" :"http://sns.qzone.qq.com/cgi-bin/qzshare/cgi_qzshare_onekey?to=pengyou&url={url}",

"hi" :"http://apps.hi.baidu.com/share/?url={url}&title={title}",

"fanfou" :"http://fanfou.com/sharer?u={url}&t={title}",

"sohubai" :"http://bai.sohu.com/share/blank/add.do?link={url}",

"feixin" :"http://space3.feixin.10086.cn/api/share?title={title}&url={url}",

"youshi" :"http://www.ushi.cn/feedShare/feedShare!sharetomicroblog.jhtml?type=button&loginflag=share&title={title}&url={url}",

"tianya" :"http://share.tianya.cn/openapp/restpage/activity/appendDiv.jsp?app_id=jiathis&ccTitle={title}&ccUrl={url}&jtss=tianya&ccBody=",

"msn" :"http://profile.live.com/P.mvc#!/badge?url={url}&screenshot=",

"douban" :"http://shuo.douban.com/!service/share?image=&href={url}&name={title}",

"twangyi" :"http://t.163.com/article/user/checkLogin.do?source={title}&info={title}+{url}&images=",

"mop" :"http://tk.mop.com/api/post.htm?url={url}&title={title}"

};

var shareiconame = {

"tqq" :"腾讯微博",

"tsina" :"新浪微博",

"qzone" :"QQ空间",

"renren" :"人人网",

"baidu" :"百度收藏",

"115" :"115",

"tsohu" :"搜狐微博",

"taobao" :"淘江湖",

"xiaoyou" :"腾讯朋友",

"hi" :"百度空间",

"fanfou" :"饭否",

"sohubai" :"搜狐白社会",

"feixin" :"飞信",

"tianya" :"天涯社区",

"youshi" :"优士网",

"msn" :"MSN",

"douban" :"豆瓣",

"twangyi" :"网易微博",

"mop" :"猫扑推客"

};

第一个数组很明了,就是每个分享按钮对应的链接地址,我把其中title和url都替换成了{title}和{url},之后在循环绑定的时候,通过正则去替换掉。第二个数组就是对应各自的中文名称,用于显示前台每个按钮的title,如:分享到腾讯微博、分享到新浪微博等。

因为js没有多维数组的概念,所以我就定义了2数组。接下来就是js代码实现部分了(为了当作教程,我把一些参数直接写死了,便于大家理解)。

$("div").addClass("hr-share-16");

var title = document.title;

var url = window.location.href;

function eFunction(str){

return function(){

window.open(formatmodel(shareico[str],{title:title, url:url}));

}

}

for(si in shareico){

$(".hr-share-"+si).die('click').live('click',eFunction(si)).attr("title","分享到"+shareiconame[si]);

}

这里,我首先给最外面那个div容器添加了一个class样式,就是我上面说到的那个,执行到这句代码后,你会发现页面上按钮的样式都出来了。

接着,我分别通过document.title和window.location.href获取到了当前页面的标题和链接。然后是一个叫eFunction的方法,这个跳过下,等会说。

下面是一个for循环,这里就是实现了循环绑定点击事件的效果。这里需要注意两点:一,因为我是写成插件,所以页面上可能不止一处用到分享按钮,为了防止重复事件绑定,所以我在绑定每个事件前都用die去解除绑定;二,我用的是live,而不是bind,因为我担心可能有的项目里的分享插件是通过ajax在页面载入完毕之后再载入进来的,所以我绑定就直接用live绑定了。

再说下那个eFunction的问题,肯定有人会问为什么不把eFunction里的内容直接写在live的click事件里。其实我最开始也是这么做的,但不这么做的原因很简单,我无法把自定义的参数传进去。至于为什么,我问了下一些JS高人,是个闭包的问题,这个东西我不是很清楚,总之就是找了这么一个办法来解决了。如果有人能给我具体讲解下闭包的问题,我非常感谢。

在绑定事件里还有一个formatmodel方法,这个是替换用的,也就是我上面说的,用正则去替换掉{title}和{url},这个function大家可以参考学习下,能用在很多地方:

function formatmodel(str,model){

for(var k in model){

var re = new RegExp("{"+k+"}","g");

str = str.replace(re,model[k]);

}

return str;

}

做到这一步,就已经全部OK了。有人会问那个“更多”按钮的怎么没说,其实那个和js没有太大联系了,只是html+css的展示效果而已,事件绑定还是上面那段核心代码,如果有兴趣,可以下载我整个插件源码进行查看,插件免费开源使用,可以随意修改,但请保留作者和联系方式。

完整插件查看地址:点击进入

html按钮分享功能实现,一个分享按钮的插件使用介绍(可扩展,内附开发制作流程)...相关推荐

  1. 【安卓开发】调用系统原生的文件分享功能将文件分享给QQ或微信好友

    调用系统原生的文件分享功能将文件分享给QQ或微信好友 核心代码: //传入的fileName是文件名的全路径@SuppressLint("QueryPermissionsNeeded&quo ...

  2. php实现新浪微博分享功能,自定义新浪微博分享按钮样式

    新浪开放平台虽然有分享按钮的组件(http://open.weibo.com/sharebutton)并且提供了两种格式的应用方法:WBML和JS,但还是无法据自己的需求做到自定义样式. 为了解决该问 ...

  3. Android链接分享功能,公开链接分享功能

    如何使用公开链接分享功能? Windows客户端 打开笔记窗口,点击工具栏右上角分享按钮 ,然后点击「复制链接」按钮. Mac客户端: 打开笔记窗口,点击工具栏右上角分享按钮,然后点击「复制链接」按钮 ...

  4. 【uniapp】uniapp小程序分享功能(App分享)

    文章目录 小程序分享 分享页面(part1) 分享触发 分享跳转页面 分享到朋友圈 开关 触发 uniApp分享 分享页面 分享到朋友圈 小程序分享 分享页面(part1) 分享触发 在分享触发的地方 ...

  5. vue 如何调用微信分享_Vue开发 添加微信分享功能(全局分享)

    在Vue4.0开发微信公众号的时候,需要做微信分享功能.这个功能其实还算简单,具体的思路如下: 1.安装微信JSSDK和Axios(axios是http请求插件) 2.向后台请求微信配置参数 3.初始 ...

  6. 快速开发分享功能,一键分享到微博、微信等平台。

    友推SDK是一款是面向移动应用的SDK组件,提供给开发者集成使用. 通过友推,开发者几行代码就可以为应用添加分享送积分功能,并提供详尽的统计报表,除了本身具备的分享功能 外,开发者也可将积分功能单独集 ...

  7. 微信分享功能,手机分享图片不显示

    问题原因猜想: a.图片大小和尺寸太大出不来:图片是150X150 的,近40K,后来给制作重新做图,30X30的10k不到,分享图片大小最好不要超过32k ,尺寸100x100以上就行,别太大了,太 ...

  8. java版微信分享功能(支持分享给好友/分享到朋友圈)

    点击上方[全栈开发者社区]→右上角[...]→[设为星标⭐] 先上官方文档:http://mp.weixin.qq.com/wiki/home/index.html 做之前建议先过遍文档,文档都说的清 ...

  9. vue项目全局配置微信分享_Vue开发 添加微信分享功能(全局分享)

    在Vue4.0开发微信公众号的时候,需要做微信分享功能.这个功能其实还算简单,具体的思路如下: 1.安装微信JSSDK和Axios(axios是http请求插件) 2.向后台请求微信配置参数 3.初始 ...

最新文章

  1. android.xml设置全屏,Android全屏设置的方法总结
  2. 理论计算机初步:概率算法和近似算法
  3. 面向对象(二)——三大特性(封装、继承、多态)
  4. r包调用legend函数_R语言实现基于朴素贝叶斯构造分类模型数据可视化
  5. solidity合约详解
  6. mysql添加一个字段(
  7. 深度学习:神经风格转移
  8. 2021-07-12淘宝首页首次尝试
  9. 计算机ROM指什么意思,ROM是什么 刷ROM是什么意思
  10. srand( 在php,PHP srand( )用法及代码示例
  11. PAT乙级——1034(模拟四则运算)
  12. 零界之痕30号服务器维护,零界之痕12月9日更新了什么 12月9日更新维护公告介绍...
  13. template <typename T>用法
  14. 维度建模和范式建模对比
  15. docker端口映射或启动容器时报错Error response from daemon: Container is not running
  16. 2-1输入两个整数num1和num2,计算并输出他们的和、差、积、商与余数
  17. 验证arbiter的思考
  18. Anaconda + tensorflow + win10 安装
  19. 沈阳城市学院计算机,沈阳城市学院通识教育学院在计算机设计大赛中获奖
  20. C#上位机与PLC通讯源码 C#与三菱PLC串口通讯MC协议FX3U及FX系列

热门文章

  1. 【C++入门】简单的日期类操作
  2. jsonp的简单学习
  3. PHP拦截器的使用(转)
  4. 创建oracle 数据库表空间,角色,用户的sql语句
  5. FreeBSD学习笔记15-FreeBSD下安装Apache
  6. 织梦缩略图自动补齐绝对路径_织梦生成文章内容缩略图时自动加上域名绝对路径...
  7. python pychart三维_详解python模块pychartdir安装及导入问题
  8. python setup.py install 出错_python setup.py install 失败
  9. 一个请求多个响应_一个TCP连接到底可以发多少个HTTP请求?
  10. Scala-Actor并行wordcount