JavaScript 一行代码,轻松搞定浮动快捷留言-V2升级版


Posted in Javascript onApril 02, 2010

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

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

具体如下图所示:
JavaScript 一行代码,轻松搞定浮动快捷留言-V2升级版
新版jMsg具体的功能细节,上图中已经描述很详细了,就不在累述,下面是新版的源代码,同样还有很多功能特性待完善,比如界面效果可以再美化一下,现在只提供了最简约的风格,不论是代码还是功能设计,都欢迎您批评指正。代码的组织形式同上一版比有了很大改动,上一版的源代码在这里可以获得。
新版的源代码如下:
//作者: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://justinw.cnblogs.com/
Javascript 相关文章推荐
使用Jquery搭建最佳用户体验的登录页面之记住密码自动登录功能(含后台代码)
Jul 10 Javascript
javascript动态加载实现方法一
Aug 22 Javascript
解决IE6的PNG透明JS插件使用介绍
Apr 17 Javascript
JavaScript实现动态添加,删除行的方法实例详解
Jul 02 Javascript
jQuery仅用3行代码实现的显示与隐藏功能完整实例
Oct 08 Javascript
js实现轮播图的两种方式(构造函数、面向对象)
Sep 30 Javascript
AngularJS中table表格基本操作示例
Oct 10 Javascript
基于dataset的使用和图片延时加载的实现方法
Dec 11 Javascript
JS获取url参数,JS发送json格式的POST请求方法
Mar 29 Javascript
react router4+redux实现路由权限控制的方法
May 03 Javascript
使用ThinkJs搭建微信中控服务的实现方法
Aug 08 Javascript
layui table数据修改的回显方法
Sep 04 Javascript
js 刷新页面的代码小结 推荐
Apr 02 #Javascript
JQuery 插件制作实践 xMarquee插件V1.0
Apr 02 #Javascript
Jquery 插件学习实例1 插件制作说明与tableUI优化
Apr 02 #Javascript
jquery ui 1.7 ui.tabs 动态添加与关闭(按钮关闭+双击关闭)
Apr 01 #Javascript
初试jQuery EasyUI 使用介绍
Apr 01 #Javascript
跟我一起学写jQuery插件开发方法(附完整实例及下载)
Apr 01 #Javascript
基于jquery的获取mouse坐标插件的实现代码
Apr 01 #Javascript
You might like
PHP实现的功能是显示8条基色色带
2006/10/09 PHP
PHP调用MySQL的存储过程的实现代码
2008/08/12 PHP
程序员编程十条戒律
2009/07/09 PHP
在yii中新增一个用户验证的方法详解
2013/06/20 PHP
php根据某字段对多维数组进行排序的方法
2015/03/07 PHP
Add Formatted Text to a Word Document
2007/06/15 Javascript
Ext 今日学习总结
2010/09/19 Javascript
JavaScript中valueOf函数与toString方法深入理解
2012/12/02 Javascript
js给dropdownlist添加选项的小例子
2013/03/04 Javascript
Javascript字符串拼接小技巧(推荐)
2016/06/02 Javascript
vue绑定事件后获取绑定事件中的this方法
2018/09/15 Javascript
详解Vue项目在其他电脑npm run dev运行报错的解决方法
2018/10/29 Javascript
详解微信小程序中组件通讯
2018/10/30 Javascript
layui: layer.open加载窗体时出现遮罩层的解决方法
2019/09/26 Javascript
Javascript组合继承方法代码实例解析
2020/04/02 Javascript
javascript设计模式 ? 抽象工厂模式原理与应用实例分析
2020/04/09 Javascript
VUE中setTimeout和setInterval自动销毁案例
2020/09/07 Javascript
vue-openlayers实现地图坐标弹框效果
2020/09/24 Javascript
react+antd 递归实现树状目录操作
2020/11/02 Javascript
[02:37]2015国际邀请赛选手档案—LGD.Xiao8
2015/07/28 DOTA
[58:18]2018DOTA2亚洲邀请赛3月29日 小组赛B组 iG VS Mineski
2018/03/30 DOTA
python在不同层级目录import模块的方法
2016/01/31 Python
Python实现线性判别分析(LDA)的MATLAB方式
2019/12/09 Python
python调用c++返回带成员指针的类指针实例
2019/12/12 Python
Python selenium抓取虎牙短视频代码实例
2020/03/02 Python
通过实例解析Python return运行原理
2020/03/04 Python
python实现凯撒密码、凯撒加解密算法
2020/06/11 Python
python json.dumps() json.dump()的区别详解
2020/07/14 Python
Pycharm创建文件时自动生成文件头注释(自定义设置作者日期)
2020/11/24 Python
Nike德国官网:Nike.com (DE)
2018/11/13 全球购物
PHP高级工程师面试问题推荐
2013/01/18 面试题
优秀毕业生推荐信范文
2014/03/07 职场文书
2014年幼儿园小班工作总结
2014/12/04 职场文书
自荐信格式模板
2015/03/27 职场文书
幼儿园六一儿童节开幕词
2016/03/04 职场文书
2007年老电脑安装win11会怎么样? 网友实测win11在老电脑运行良好
2021/11/21 数码科技