基于Jquery与WebMethod投票功能实现代码


Posted in Javascript onJanuary 19, 2011

1:功能描述
1)最好是若干个星星组成,用户投票时候只要鼠标点击星星就可以实现投票,可以自定义星星个数
2)未投票、投票中、完成投票,星星的样式不同
3)每个星星的都可以自定义提示 比如 “差” “一般” “还好” “不错”
4)完成投票后,动画展示投票结果并且不可再投票

2:思路描述
1、3)使用循环,最大值是星星的个数,每次循环添加一条<a></a>的语句,这条超链接通过Class指定星星样式,通过title指定鼠标移到时显示的文字,循环结束后通过Jquery的append函数添加到目标内容区
2)通过Jquery的addClass、removeClass 方法可以动态地调整星星的样式,值得注意的是在打分的时候,鼠标移动到某个位置的星星,之前的星星都要添加上样式,可以使用Jquery的prevAll()获得当前位置之前的星星的引用 然后add($(this))来获得当前位置星星的引用.
打分之前:
基于Jquery与WebMethod投票功能实现代码 
打分之中:
基于Jquery与WebMethod投票功能实现代码
打分之后:
基于Jquery与WebMethod投票功能实现代码
4)根据目标区子节点里面被选择星星的位置+1来产生分数 children().index($(this)) 然后该分数通过ajax与服务器交互,返回评价分,接着清空目标区内容,添加<span></span>背景图片设置成星星图片,在水平位置重复,就可以根据星星的宽度*平均分决定该<span></span>的最终宽度,并使用animate实现动画效果.

3:实现代码
1)javaScript代码
为了方便,我把它做成了半插件形式, AJAX交互还是写了自己的逻辑进去,代码如下

(function ($) { 
$.fn.Rate = function (options) { 
options = options || {}; 
var StarTip = options.StarTip || ['不值一看', '平平无奇', '信息靠谱', '对我很有帮助', '极品信息']; 
var ItemAmount = options.ItemAmount || 5; 
var UnRateClassName = options.UnRateClassName || 'star'; 
var RateClassName = options.RateClassName || 'star_on'; 
var originalStateClassName = options.originalStateClassName || 'OriginalState'; 
var PostURL = options.PostURL || ''; 
var DoAfterPost = options.DoAfterPost || function () { }; 
var userID = options.userID || ''; 
var messageID = options.messageID || ''; 
var content = $(this); 
var starList = ''; 
for (var i = 0; i < ItemAmount; i++) { 
starList += ['<a href="#" class="', UnRateClassName, '" title="', StarTip[i], '"></a>'].join(''); 
} 
content.empty().append(starList).find('a').hover(function () { 
$(this).prevAll().add($(this)).addClass(RateClassName); 
}, function () { 
$(this).prevAll().add($(this)).removeClass(RateClassName); 
}).one('click', function () { 
var score = parseInt(content.children().index($(this))) + 1; 
$.ajax({ 
type: "POST", 
url: PostURL, 
data: "{messageID:" + messageID + ",userID:" + userID + ",Score:" + score + "}", 
contentType: "application/json; charset=utf-8", 
dataType: "json", 
success: function (msg) { 
var result = (jQuery.parseJSON(msg.d)).SuccessFlag; 
DoAfterPost(result); 
content.empty().removeClass(); 
$('<span></span>').addClass(originalStateClassName).prependTo(content).animate({ 'width': 16 * result + 'px', 'opacity': 1 }, 'slow'); 
} 
}); 
}); }; 
})(jQuery);

参数说明:

参数名称 描述 默认值 参数类型
StarTip 鼠标移到星星上的文本提示 ['不值一看', '平平无奇', '信息靠谱', '对我很有帮助', '极品信息'] javascript数组[tip]:数组元素个数必须要和星星个数一致
ItemAmount 星星的个数 5 数字
UnRateClassName 还没投票时星星的样式名称 'star' 字符串
RateClassName 投票中,鼠标移过时星星的样式 'star_on' 字符串
originalStateClassName 投票完成后,结果展示时星星的样式 'OriginalState' 字符串
PostURL ajax交互时,url参数 '' 字符串
DoAfterPost 投票完成后,在投票页面使用自定义方法 '' 字符串
userID ajax交互时用户ID,防止重复投票 '' 数字
messageID ajax交互时文章ID '' 数字
2)前端引用代码
$('#left table tr:eq(1) td:eq(0) #StarRate').Rate({ 
PostURL: 'http://www.cnblogs.com/ServiceProvider/MessageInfoService.asmx/VoteMessage', 
userID: UserID, 
messageID: messageID, 
DoAfterPost: function (data) { 
if (data > 0) { 
$(voteResultContext).html(data); 
} 
else { 
ProcessNoticeShow('您已经投过票了'); 
} 
} 
}); 
}

4)样式表
.star{ height:16px; width:16px;float:left; background:url(../images/star.gif) no-repeat 0 0;} 
.star_on{ background: url(../images/star.gif) no-repeat 0 -32px !important;} 
.OriginalState{ width:0px;background: url(../images/star.gif) repeat-x 0 -16px !important;opacity:0;height:16px; display:block;}

3)服务器端代码
/// <summary> 
/// 对信息进行投票,返回值大于0代表成功 
/// </summary> 
/// <param name="messageID">信息ID</param> 
/// <param name="userID">用户ID</param> 
/// <param name="Score">得分</param> 
/// <returns></returns> 
[WebMethod] 
public string VoteMessage(int messageID, int userID ,int Score) 
{ 
SQLCMD = new SqlCommand("MessageInfo_Add_VoteUsefull_MessageIDUserID", SQLConnect); 
SQLCMD.CommandType = CommandType.StoredProcedure; 
SQLCMD.Parameters.Add(new SqlParameter("@messageID",SqlDbType.Int)); 
SQLCMD.Parameters["@messageID"].Value = messageID; 
SQLCMD.Parameters.Add(new SqlParameter("@userID",SqlDbType.Int)); 
SQLCMD.Parameters["@userID"].Value = userID; 
SQLCMD.Parameters.Add(new SqlParameter("@Score", SqlDbType.Int)); 
SQLCMD.Parameters["@Score"].Value = Score; 
float SuccessFlag = basicSQLAccess.ExeScalarReturnValueFloat(SQLCMD); 
Hashtable HTFlag = new Hashtable(); 
HTFlag.Add("SuccessFlag", SuccessFlag); 
return JsonConvert.SerializeObject(HTFlag); 
}

有关JsonConvert.SerializeObject的内容介绍以及与前端Jquery交互 请看我之前的文章 <通过Jquery遍历Json的两种数据结构>
4:下载
压缩包包括 css、JS、还有星星图片
猛击我下载
Javascript 相关文章推荐
jquery滚动条插件jScrollPane的使用介绍
Nov 08 Javascript
jQuery对下拉框,单选框,多选框的操作
Feb 21 Javascript
JavaScript实现数字数组按照倒序排列的方法
Apr 06 Javascript
JavaScript获取浏览器信息的方法
Nov 20 Javascript
AngularJS控制器controller正确的通信的方法
Jan 25 Javascript
JavaScript暂停和继续定时器的实现方法
Jul 18 Javascript
Angular2 (RC5) 路由与导航详解
Sep 21 Javascript
JavaScript使用正则表达式获取全部分组内容的方法示例
Jan 17 Javascript
vue 过滤器filter实例详解
Mar 14 Javascript
Vue实现导出excel表格功能
Mar 30 Javascript
小程序云开发之用户注册登录
May 18 Javascript
Vue 微信端扫描二维码苹果端却只能保存图片问题(解决方法)
Jan 19 Javascript
jQuery '行 4954 错误: 不支持该属性或方法' 的问题解决方法
Jan 19 #Javascript
Jquery插件 easyUI属性汇总
Jan 19 #Javascript
jquery 圆形旋转图片滚动切换效果
Jan 19 #Javascript
Javascript调用C#代码
Jan 17 #Javascript
js的写法基础分析
Jan 17 #Javascript
js 动态文字滚动的例子
Jan 17 #Javascript
JavaScript中的Array对象使用说明
Jan 17 #Javascript
You might like
使PHP自定义函数返回多个值
2006/11/26 PHP
PHP 代码规范小结
2012/03/08 PHP
MyEclipse常用配置图文教程
2014/09/11 PHP
PHP实现图片自动清理的方法
2015/07/08 PHP
ThinkPHP3.2框架使用addAll()批量插入数据的方法
2017/03/16 PHP
js每次Title显示不同的名言
2008/09/25 Javascript
ExtJs扩展之GroupPropertyGrid代码
2010/03/05 Javascript
查询json的数据结构的8种方式简介
2014/03/10 Javascript
jQuery UI插件自定义confirm确认框的方法
2015/03/20 Javascript
学习JavaScript编程语言的8张思维导图分享
2015/03/27 Javascript
javascript数据结构与算法之检索算法
2015/04/04 Javascript
JavaScript中数组继承的简单示例
2015/07/29 Javascript
JavaScript必知必会(十) call apply bind的用法说明
2016/06/08 Javascript
ionic App问题总结系列之ionic点击系统返回键退出App
2017/08/19 Javascript
JS中数据结构之栈
2019/01/01 Javascript
react项目如何使用iconfont的方法步骤
2019/03/13 Javascript
移动端自适应flexible.js的使用方法(不用三大框架,仅写一个单html页面使用)推荐
2019/04/02 Javascript
浅谈Vue.set实际上是什么
2019/10/17 Javascript
ant-design-vue 快速避坑指南(推荐)
2020/01/21 Javascript
python django使用haystack:全文检索的框架(实例讲解)
2017/09/27 Python
简单了解python的一些位运算技巧
2019/07/13 Python
PyTorch的Optimizer训练工具的实现
2019/08/18 Python
Python操作列表常用方法实例小结【创建、遍历、统计、切片等】
2019/10/25 Python
Python三元运算与lambda表达式实例解析
2019/11/30 Python
如何用OpenCV -python3实现视频物体追踪
2019/12/04 Python
简单了解Java Netty Reactor三种线程模型
2020/04/26 Python
python如何运行js语句
2020/09/09 Python
纯CSS3实现Material Design效果
2017/03/09 HTML / CSS
Europcar葡萄牙:葡萄牙汽车和货车租赁
2017/10/13 全球购物
教师个人鉴定材料
2014/02/08 职场文书
寒假家长评语大全
2014/04/16 职场文书
结婚仪式主持词
2015/06/29 职场文书
优秀团员主要事迹材料
2015/11/05 职场文书
七年级作文之关于奶奶
2019/10/29 职场文书
JS不要再到处使用绝对等于运算符了
2021/04/30 Javascript
解决pytorch 损失函数中输入输出不匹配的问题
2021/06/05 Python