ajax+jquery.cookie实现点赞和取消类型功能

1.前端代码

 for(var i=1;i<json.length;i++){
    		 
    		 picpath1=json[i].picpath1;
    		 picpath2=json[i].picpath2;
    		  alert(picpath2.length);
    	if(picpath1.length!=0&&picpath2.length!=0){
    		$("#shareText").append("<div id=textID"+i+"><input type=hidden value="+json[i].userID+" />"+"<input type=hidden value="+json[i].textID+" />"+"<div class=thumbnail><img src=./images/"+json[i].username+"/"+picpath1+"	/><img src=./images/"+json[i].username+"/"+picpath2+" />"+"<div class=caption><h4>"+json[i].title+"</h4><h4>"+json[i].username+"</h4><p>"+json[i].text+"</p><p>"+"<input id=unionID"+i+" type=hidden value="+json[i].userID+json[i].textID+" />"+"<a role=button onclick=isLike("+i+") id=blike"+i+">点赞</a><a role=button onclick=addToMine("+i+") id=btome"+i+">收藏</a><a role=button onclick=sendMessage("+i+")>留言</a></p></div></div></div>" );
    		$("#shareText img").css({"width":"48%","float":"left","margin-left":"1%","margin-bottom":"5%"});
    		
    		//children("p.1").css({"color":"red","border":"2px solid red"});
    	}else if(picpath2.length==0){
    		alert(json[i].textID);
    		$("#shareText").append("<div id=textID"+i+"><input type=hidden value="+json[i].userID+" />"+"<input type=hidden value="+json[i].textID+" / >"+"<div class=thumbnail><img src=./images/"+json[i].username+"/"+picpath1+"	/>"+"<div class=caption><h4>"+json[i].title+"</h4><h4>"+json[i].username+"</h4><p>"+json[i].text+"</p><p>"+"<input id=unionID"+i+" type=hidden value="+json[i].userID+json[i].textID+" />"+"<a role=button onclick=isLike("+i+") id=blike"+i+">点赞</a><a role=button onclick=addToMine("+i+") id=btome"+i+">收藏</a><a role=button onclick=sendMessage("+i+")>留言</a></p></div></div></div>" );
    		$("#shareText img").css("margin-bottom","5%");

    	}else{
    		
    		alert("第一种图片为空");
    		$("#shareText").append("<div id=textID"+i+"><input type=hidden value="+json[i].userID+" />"+"<input type=hidden value="+json[i].textID+" />"+"<div class=thumbnail><img src=./images/"+json[i].username+"/"+picpath2+"	/>"+"<div class=caption><h4>"+json[i].title+"</h4><h4>"+json[i].username+"</h4><p>"+json[i].text+"</p><p>"+"<input id=unionID"+i+" type=hidden value="+json[i].userID+json[i].textID+" />"+"<a role=button onclick=isLike("+i+") id=blike"+i+">点赞</a><a role=button onclick=addToMine("+i+") id=btome"+i+">收藏</a><a role=button onclick=sendMessage("+i+")>留言</a></p></div></div></div>" );
    		$("#shareText img").css("margin-bottom","5%");
    		
    	}
    		  
		$("#shareText>div").addClass("col-sm-12 col-md-6 clo-lg-6");
		$("#shareText a").addClass("btn btn-default");
		//是按钮有浮动,消除高度塌陷
		$("#shareText a").css("float","right");
		$(".caption").css("overflow","hidden");
		//消除浮动代码,虽然代码少,可能会出现一些情况是会无法消除浮动的,我们可以使用下面的代码来解决
		


//拯救高度坍塌--文章文本*/
	.caption:after{
	display:block;
	visibility:hidden;
	clear:both;
	height:0;
	content:'.'
	}
	
	.caption{
	zoom:1;
	}
	/*拯救高度坍塌--图片*/
.box:after{
	display:block;
	visibility:hidden;
	clear:both;
	height:0;
	content:'.'
	
	
	}
.box{
	zoom:1;
	}


效果图
在这里插入图片描述
点赞实现的难点总结:
(1).多篇文章,需要每一个点赞按钮在点击的时候传入一个参数来标志该文章。在这里我把后台传过来的json的序列值作为标识。

<input id=unionID"+i+" type=hidden value="+json[i].userID+json[i].textID+" />"+"<a role=button onclick=isLike("+i+") id=blike"+i+">点赞</a>

从这段代码中可以看出,我还设置一个唯一辨识的unionID用于cookie的遍历。标识的方法有很多,在这里就不展开了,但我曾经试过直接把常过来的userID和textID相互拼接起来,作为文章的唯一标识。但是,在ajax一步请求的时候,发生一些错误。比如textID=userID+textID2;本来在数据库存取的时候没有任何问题,得到值是预期的值,但是在利用ajax一步请求向数据库提取数据,然后把值赋给textID的时候,这个时候,问题就来了,textID并不是useriD和textID拼接起来的字符串,我后来想明白了,原来ajax在传输参数的时候,会对参数进行一些参数的转码,数据库可以正常存取,可能是因为编码和ajax的转码不一样。这样子的话,参数会带有一些特殊的字符,字符串拼接的话,和这些特殊的字符有结合的话,会对值产生影响。往往会出现前端的值比数据库的值大一。所以,我没有利用此方法作为文章ID。而是直接在前端把值接收过来后,再拼接,就不会出现在解析过程出现错误。

后台代码

点赞代码

SqlSession session=null;
		int userID=Integer.parseInt(request.getParameter("userID"));
		BigInteger textID=new BigInteger(request.getParameter("textID"));
		try {
			DataConnection connection=new DataConnection();
			session=connection.getSession();
			StudentMapper mapper=connection.getStudentMapper(session);
			Integer count=mapper.isLike(userID,textID);
			session.commit();
			if(count!=0) {
				Map<String, String> a=new HashMap<String, String>();
				a.put("ok", "ok");
			
				String jsonString = JSON.toJSONString(a);  
				response.setCharacterEncoding("UTF-8");  
				response.setContentType("application/json; charset=utf-8");  
				PrintWriter writer = response.getWriter();
				System.out.println(jsonString);
				writer.append(jsonString);
				writer.close();
			}
		}catch (Exception e) {
			// TODO: handle exception
			System.out.println("isLike has error"+e.getMessage());
		}
		finally {
			if(session!=null) {
				session.close();
			}
		}

取消点赞代码

int userID=Integer.parseInt(request.getParameter("userID"));
		BigInteger textID=new BigInteger(request.getParameter("textID"));
		try {
			DataConnection connection=new DataConnection();
			session=connection.getSession();
			TextMapper mapper=connection.getMapper(session);
			Integer count=mapper.notLike(userID,textID);
			session.commit();
			if(count!=0) {
				Map<String, String> a=new HashMap<String, String>();
				a.put("ok", "ok");
			
				String jsonString = JSON.toJSONString(a);  
				response.setCharacterEncoding("UTF-8");  
				response.setContentType("application/json; charset=utf-8");  
				PrintWriter writer = response.getWriter();
				System.out.println(jsonString);
				writer.append(jsonString);
				writer.close();
			}
		}catch (Exception e) {
			// TODO: handle exception
			System.out.println("isLike has error"+e.getMessage());
		}
		finally {
			if(session!=null) {
				session.close();
			}
		}

两者代码相似

mybatis代码


	public int isLike(@Param("userID") int userID,@Param("textID") BigInteger textID);
sql语句
<update id="isLike">
	 UPDATE text set num_like =(num_like+1) where userID=#{userID} AND textID=#{textID}
	</update>

ajax代码



注意一点就是,当用户第一次使用这个网站的时候,没有cookie,这个时候需要判断是否cookie否则会报错

if(typeof $.cookie('user') == "undefined")//判断是否为一次登录,或者cookie消除之后,需要重新写cookie,然后才执行有cookie的情况

function isLike(textID){
	//实现不用用户点赞,因为同一个浏览器只会有一份cookie,如果不同的用户使用一个浏览器,则需要判断不同的用户,所以,需要在cookie增加用户名来辨别
	
	if($("#myID").val().length!=0){
	var user=JSON.parse($.cookie('user')).user;
		
		
	var userID=$("#textID"+textID).children().eq(0).val();
	var textID2=$("#textID"+textID).children().eq(1).val();
	var color=$("#unionID"+textID).next().css("background-color");
	console.log(color);
	
	var unionID=$("#unionID"+textID).val();
	var likejson="";
	if(typeof $.cookie("likejson") !== "undefined"){
		likejson=JSON.parse($.cookie("likejson"));
	}else{
		likejson=[];
	}
	
	
	//根据按键的颜色看判断是否已经点赞
	if(color=="rgb(135, 206, 235)"){
		$.ajax({
			url:"/mybatis_first_demo2/notLikeServlet",
			type:"POST",
			data:"userID="+userID+"&textID="+textID2,
			dataType:'json',
			success:function(json){
				for(var i=0;i<likejson.length;i++){
					console.log(likejson[i].unionID);
					if(likejson[i].unionID==unionID&&likejson[i].username==user.username){
						likejson.splice(i,1);
					}
					
				}
				$("#unionID"+textID).next().css("background-color","white");
				alert("取消成功");
				var a=JSON.stringify(likejson);
				$.cookie("likejson",a,{expires:365,path: '/'});
				console.log(a);	

	
			},
			error:function(){
				alert("取消失败");
			}
			})
		
		
	}else{
		
	$.ajax({
		url:"/mybatis_first_demo2/isLikeServlet",
		type:"POST",
		data:"userID="+userID+"&textID="+textID2,
		dataType:'json',
		success:function(json){	
                var like= {};
                like.unionID =unionID;
                like.username=user.username;
                likejson.push(like);
                //将对象保存在数组里
			//	$.cookie('user',user, {expires: 7, path: '/' });
				
				
				$("#blike"+textID).css("background-color","skyblue");	
			
			
	//		$("#blike"+textID).attr("disabled",true);
			
			
			alert("点赞成功");
			将数组化为字符串,进行保存,因为cookie只能保存字符串
			var a=JSON.stringify(likejson);
			$.cookie("likejson",a,{expires:365,path: '/'});
			console.log(a);	
			
			
		},
		error:function(){
			alert("点赞失败");
		}
		
	})
	}
	}else{
		alert("请登录账号");
		$("#check").show();
		
	}
	
};
			

使用该网站文件加载完成代码。

//使用这段代码的时候,需要注意一点
根据cookie来判断对按键的颜色进行渲染,前提是需要渲染的Dom结构已经被加载完成,而且dom的值也被js写进去,否则 	$("input[value="+unionID+"]").next().css("background-color","skyblue");中的获取特定值得input的时候,会报错,即undefined,就是没有加载完成或者,value值,没有被写进去,造成没有找到符合条件的节点,所以会报错。总之,这段代码需要在value值填写之后才执行。
根据JavaScript加载顺序来看,先进行预处理,即处理变量的声明,再处理相应的代码,所以在声明变量的时候,没有找到这个节点,所以会报错。我是把这段代码。加到,js向数据库异步请求得到数据,并进行渲染的时候,才执行,保证代码正确执行

if(typeof $.cookie('likejson') == "undefined"){
				alert("json清除");
	
				
				}else{	
				//根据用户名和文章id辨识不同用户的不同点赞
					var likejson=$.cookie('likejson');
					likejson=JSON.parse(likejson);
					alert(likejson);
					for(var i=0;i<likejson.length;i++){
						console.log(likejson);
						var unionID=likejson[i].unionID;
						if(user.user.username==likejson[i].username){
							$("input[value="+unionID+"]").next().css("background-color","skyblue");

						}
						
		
		
				}
			}
			

创建对象,like,想对象添加uinonid属性,push把对象添加到json块中

//将cookie进行解析
var likejson=JSON.parse($.cookie("likejson"));//这种情况下是已经存在cookie
var like= {};
                like.unionID =unionID;
                likejson.push(like);
没有cookie的时候,需要把likejon化为数组,即likejson=[]
var a=JSON.stringify(likejson);
			$.cookie("likejson",a,{expires:365,path: '/'});
			console.log(a);	

使用cookie的时候,需要将json进行解析,代码如下,否则无法正常读取数据
解析代码如下

var likejson=JSON.parse($.cookie("likejson"));

删除cookie

 	//	$.removeCookie('user',{ path: '/'}); 存取的时候带路径,删除的时候也需要带路径,否则无法删除
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值