[JavaScript]只需一行代码,轻松搞定快捷留言-V2升级版

简介:

前天熬了大半宿发了一篇[一行代码轻松搞定快捷留言功能],同时发布了V1.0beta版的快捷留言功能和源代码,之所以是beta版,就是当时感觉虽然基本功能有了,但是还不够完善,特性也不一定合理,今天不知不觉又弄到了这个时候,这次对上一版做了很大改进:
首先,原来自动提交留言信息的同时会自动推荐,大量的推荐数,直接影响了博客园的推荐排名机制,所以后来在第一时间修改成了询问是否要推荐的交互模式!
其次,虽然快捷功能有了,并且很好用,但是满屏幕的“好贴!我顶你!”也确实有些审美疲劳了,并且没什么实际意义,留言还是要能产生互动才有价值,所以V2这版重点在交互模式上改进原有的形式,新版快捷留言相当于把博客园原有的留言框和推荐都浮动起来显示在屏幕右侧垂直居中的位置,目的就是让使用者可以非常方便地快捷留言。
最后,新版快捷留言功能对上一版的使用者完全支持透明升级,也就是说原来使用上一版的用户,现在自己的博客里看到的应该已经是最新版本的界面和功能了!这里再重新说一遍jMsg的使用方法,跟以前完全一样:
其实用法真的很简单,只需要在[后台管理]->[设置]->[页首Html代码]的文本框里,填入下面这句话就行了:

1
2
//放在[后台管理]->[设置]->[页首Html代码]的文本框里
<script language= "javascript"  type= "text/javascript"  src= "http://files.cnblogs.com/justinw/jMsg.js" ></script>

具体如下图所示:

新版jMsg具体的功能细节,上图中已经描述很详细了,就不在累述,下面是新版的源代码,同样还有很多功能特性待完善,比如界面效果可以再美化一下,现在只提供了最简约的风格,不论是代码还是功能设计,都欢迎您批评指正。代码的组织形式同上一版比有了很大改动,上一版的源代码在这里可以获得。

新版的源代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
//作者:Justin
//出处:http://justinw.cnblogs.com/
//版权:转载请保留出处即可。
//版本:V2.0
//最后更新:201004020037
//备注:如有问题,可以优先到 http://www.cnblogs.com/justinw/archive/2010/03/30/1700190.html 留言提问。
//更新:
//1.v2在V1beta的基础上做了很大改进,交互模式和功能合理性都有本质提高。
 
//--begin--jMsg---
jMsg = function () {
     var  chkRecomend = false ;
}
 
jMsg.prototype = {
     //初始化动作
     initialize: function () {
         jMsg.loadEvent( this .combat);
         this .msgDIV();
     },
     dispose: function () {
         //todoSomething...
     },
     //提交留言信息
     post: function (msg) {
         //这里通过判断HaveUp标志位,来防止反复提交相同留言。
         if  (window.top.HaveUp) {
             alert( '您已经顶过了!谢谢朋友 :)' );
             return  false ;
         }
         if  (msg.trim().length == 0) {
             alert( '怎么也得留一个字吧!' );
             return  false ;
         }
         else  if  (msg.trim().length > 1000) {
             alert( '这枚同学,快捷留言最多支持1000个字符!' );
             return  false ;
         }
 
         var  txt = document.getElementById( 'tbCommentBody' );
         if  (txt != null ) {
             txt.style.backgroundColor = "#E4F5FF" ;
             var  date = new  Date();
             txt.value = msg;
             txt.focus();
             //如果提交过一次快捷留言,HaveUp就设置为true
             //每次重新进入页面,HaveUp就会被初始化。
             window.top.HaveUp = true ;
             //这是博客园提交留言用的方法,通过这里正是提交留言。
             //如果没有登录就直接在客户端调用这个方法,内部会抛个错。(博客园代码问题,没有判空)
             var  rlt = PostComment();
             this .setMsgText( "" );
             return  true ;
         }
         else  {
             //目前博客园功能上约束只有登录后才能提交留言。
             //如果找不到tbCommentBody元素,可以认为当前用户没有登录。
             alert( "使用博客园留言功能需要先登录哦!" );
             return  false ;
         }
     },
     //推荐
     recommend: function () {
         var  diggit = jMsg.getElementsByClassName( 'diggit' );
         if  ((diggit) && (diggit[0])) {
             diggit[0].onclick();
         }
         else  {
             alert( "Debug:推荐按钮的ClassName改名了!" );
         }
     },
     //反对
     combat: function () {
         var  buryitMsg = function () {
             //目前博客园推荐和反对都是不记名的,被反对了当然希望知道原因啦。
             //这个功能只能做到防君子不防小人,仅仅是给了个提示而已。       
             var  txt = document.getElementById( 'tbCommentBody' );
             if  (txt != null ) {
                 alert( '这枚同学,非常希望能听到您的宝贵意见,请赐教...' );
                 txt.style.backgroundColor = "#fe9ab3" ;
                 txt.focus();
             }
         }
         var  buryit = jMsg.getElementsByClassName( 'buryit' );
         if  ((buryit) && (buryit[0])) {
             jMsg.addEvent(buryit[0], "click" , buryitMsg);
         }
     },
     //提交留言的同时推荐
     superPost: function (msg) {
         if  ( this .post(msg)) {
             //这里增加询问功能,不支持自动直接推荐
             if  ( this .chkRecomend) {
                 this .recommend();
             }
             else  {
                 if  (confirm( "您是否要同时推荐该篇文章呢?" )) {
                     this .recommend();
                 }
             }
         }
     },
     //快捷留言的浮动导航条
     msgDIV: function () {
         //是否出现浮动条。
         if  (!(window.location.href.indexOf( ".html" ) > -1)) return ;
 
         //动态计算浮动滚动条的位置
         lastScrollY = 0;
         var  beat = function () {
             var  diffY;
             if  (document.documentElement && document.documentElement.scrollTop)
                 diffY = document.documentElement.scrollTop;
             else  if  (document.body)
                 diffY = document.body.scrollTop
             else
             { /*Netscape stuff*/  }
 
             percent = .1 * (diffY - lastScrollY);
             if  (percent > 0) percent = Math.ceil(percent);
             else  percent = Math.floor(percent);
             document.getElementById( "msgDiv" ).style.top = parseInt(document.getElementById( "msgDiv" ).style.top) + percent + "px" ;
 
             lastScrollY = lastScrollY + percent;
         }
         
         document.write( this .getMsgBoxHTML());
 
         window.setInterval(beat, 120);
     },
     getMsgBoxHTML: function () {
         var  _HTML = "" ;
         _HTML += "<div id=\"msgDiv\" style=\"width:265px;z-index:2010; right:15px; top:400px; position:absolute;\">" ;
         _HTML += "<table border=\"0\" cellspacing=\"0\" cellpadding=\"0\">" ;
         _HTML += "<tbody>" ;
         _HTML += "<tr><td colspan=\"2\"><textarea id=\"jmsg\" title=\"使用快捷留言,想说就说!\" style=\"border-color:navy;background-color:transparent;width:265px;height:100px\">文章不错,支持!</textarea></td></tr>" ;
         _HTML += "<tr><td style=\"width:200px\"><input title=\"Alt+Enter\" name=\"postjMsg\" type=\"submit\"onclick=\"$jMsg.superPost($jMsg.getMsgText());return false;\" value=\"提交\" style=\"width:80px\"/>" ;
         _HTML += " <a id =\"passBy\" onclick=\"$jMsg.setMsgText('路过...');return false;\" href=\"###\">路过</a> " ;
         _HTML += "<input name=\"chkjMsg\" type=\"checkbox\" onclick=\"$jMsg.setChkRecomend(this.checked);\"/>推荐</td><td style=\"font-size:small;text-align:right;vertical-align:top\">2010©<a href=\"http://justinw.cnblogs.com\" target=\"_blank\">Justin</a></td></tr>" ;
         _HTML += "</tbody></table>" ;
         _HTML += "</div>" ;
         return  _HTML;
     },
     setMsgText: function (txt) {
         var  area = document.getElementById( "jmsg" );
         area.value = txt;
     },
     getMsgText: function () {
         var  area = document.getElementById( "jmsg" );
         return  area.value;
     },
     setChkRecomend: function (val) {
         this .chkRecomend = val;
     }
}
 
//附加onload事件
jMsg.loadEvent = function (fn) {
     var  oldonload = window.onload;
     if  ( typeof  window.onload != 'function' ) {
         window.onload = fn;
     } else  {
         window.onload = function () {
             oldonload();
             fn();
         }
     }
}
 
//附加事件
jMsg.addEvent = function (obj, type, fn) {
     if  (obj.addEventListener)
         obj.addEventListener(type, fn, true );
     else  if  (obj.attachEvent) {
         obj.attachEvent( "on"  + type, function () {
             fn();
         });
     }
}
 
//通过ClassName找到DOM元素
jMsg.getElementsByClassName = function (n) {
     var  el = [],
         _el = document.getElementsByTagName( '*' );
     for  ( var  i = 0; i < _el.length; i++) {
         if  (_el[i].className == n) {
             el[el.length] = _el[i];
         }
     }
     return  el;
}
 
String.prototype.trim = function () {
     return  this .replace(/(^\s*)|(\s*$)/g, "" );
}
 
//--end--jMsg---
//todo:提供设置是否显示浮动条的接口
//todo:提供完全自定义浮动条内容的接口
//todo:提供浮动以外的交互模式接口
var  $jMsg = new  jMsg();
$jMsg.initialize(); 本文转自Justin博客园博客,原文链接:http://www.cnblogs.com/justinw/archive/2010/04/02/1702763.html,如需转载请自行联系原作者
相关文章
|
3月前
|
JavaScript
短小精悍的js代码
【10月更文挑战第17天】
145 58
|
4天前
|
人工智能 程序员 UED
【01】完成新年倒计时页面-蛇年新年快乐倒计时领取礼物放烟花html代码优雅草科技央千澈写采用html5+div+CSS+JavaScript-优雅草卓伊凡-做一条关于新年的代码分享给你们-为了C站的分拼一下子
【01】完成新年倒计时页面-蛇年新年快乐倒计时领取礼物放烟花html代码优雅草科技央千澈写采用html5+div+CSS+JavaScript-优雅草卓伊凡-做一条关于新年的代码分享给你们-为了C站的分拼一下子
【01】完成新年倒计时页面-蛇年新年快乐倒计时领取礼物放烟花html代码优雅草科技央千澈写采用html5+div+CSS+JavaScript-优雅草卓伊凡-做一条关于新年的代码分享给你们-为了C站的分拼一下子
|
2天前
|
前端开发 JavaScript
【02】v1.0.1更新增加倒计时完成后的放烟花页面-优化播放器-优化结构目录-蛇年新年快乐倒计时领取礼物放烟花html代码优雅草科技央千澈写采用html5+div+CSS+JavaScript-优雅草卓伊凡-做一条关于新年的代码分享给你们-为了C站的分拼一下子
【02】v1.0.1更新增加倒计时完成后的放烟花页面-优化播放器-优化结构目录-蛇年新年快乐倒计时领取礼物放烟花html代码优雅草科技央千澈写采用html5+div+CSS+JavaScript-优雅草卓伊凡-做一条关于新年的代码分享给你们-为了C站的分拼一下子
【02】v1.0.1更新增加倒计时完成后的放烟花页面-优化播放器-优化结构目录-蛇年新年快乐倒计时领取礼物放烟花html代码优雅草科技央千澈写采用html5+div+CSS+JavaScript-优雅草卓伊凡-做一条关于新年的代码分享给你们-为了C站的分拼一下子
|
3月前
|
JavaScript 前端开发 开发者
如何在 Visual Studio Code (VSCode) 中使用 ESLint 和 Prettier 来检查代码规范并自动格式化 Vue.js 代码。
【10月更文挑战第7天】随着前端开发技术的快速发展,代码规范和格式化工具变得尤为重要。本文介绍了如何在 Visual Studio Code (VSCode) 中使用 ESLint 和 Prettier 来检查代码规范并自动格式化 Vue.js 代码。通过安装和配置这两个工具,可以确保代码风格一致,提升团队协作效率和代码质量。
306 2
|
3月前
|
JavaScript 前端开发 内存技术
js文件的入口代码及需要入口代码的原因
js文件的入口代码及需要入口代码的原因
56 0
|
5天前
|
人工智能 JavaScript 前端开发
一段 JavaScript 代码,集成网站AI语音助手
根据本教程,只需通过白屏化的界面操作,即可快速构建一个专属的AI智能体。
|
1月前
|
JavaScript 前端开发 测试技术
在 golang 中执行 javascript 代码的方案详解
本文介绍了在 Golang 中执行 JavaScript 代码的四种方法:使用 `otto` 和 `goja` 嵌入式 JavaScript 引擎、通过 `os/exec` 调用 Node.js 外部进程以及使用 WebView 嵌入浏览器。每种方法都有其适用场景,如嵌入简单脚本、运行复杂 Node.js 脚本或在桌面应用中显示 Web 内容。
107 15
在 golang 中执行 javascript 代码的方案详解
|
2月前
|
JavaScript
原生js炫酷随机抽奖中奖效果代码
原生js随机抽奖是一个炫酷的根据数据随机抽奖的代码,该网页可进行随机抽取一个数据,页面动画高科技、炫酷感觉的随机抽奖效果,简单好用,欢迎下载!
70 3
|
2月前
|
JavaScript 前端开发 开发者
如何在 Visual Studio Code (VSCode) 中使用 ESLint 和 Prettier 检查代码规范并自动格式化 Vue.js 代码,包括安装插件、配置 ESLint 和 Prettier 以及 VSCode 设置的具体步骤
随着前端开发技术的快速发展,代码规范和格式化工具变得尤为重要。本文介绍了如何在 Visual Studio Code (VSCode) 中使用 ESLint 和 Prettier 检查代码规范并自动格式化 Vue.js 代码,包括安装插件、配置 ESLint 和 Prettier 以及 VSCode 设置的具体步骤。通过这些工具,可以显著提升编码效率和代码质量。
668 4

热门文章

最新文章