星级评价

本文介绍了一种处理鼠标移入和移出事件冲突的方法,通过记录点击索引并在鼠标移出时重新设置选中状态,解决了事件冲突问题。同时,针对循环处理带来的新问题,加入了条件判断优化。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

说一下大体思路:

第一步布局

然后找到需要操作的元素,循环拿到所有的 li ,给每个 li 绑定一个index,然后处理鼠标移入事件,

当鼠标移入的时候,循环 <li> 的index的值,因为这个值正好可以用在 aLi[this.index] 上

开始的时候感觉点击事件和鼠标移入事件冲突,后来发现不是,是鼠标移出的时候把src又全部还原了。

然后我又新定义了一个变量,记录点击的索引,然后在鼠标移出事件的时候,根据记录下来的这个点击事件的索引,重新给把小星星的src改成了选中的,这样冲突就消失了。

然后我又碰到一个新的问题

就是移出鼠标会先把移入时选中的星星去除,然后再把点击选中的星星选上。

但是循环的话 for(var i=0;i<=dian;i++) dian如果=0,循环也会进去坐一圈,然后把索引为0的小星星选中,所以就造成了,每次移入,再移出,小星星的第一个会选中,我就给里面加了一个判断,当dian=0的时候,不作处理。

但是吧。。。。这样又造成了一个新的问题,就是,点击选中第一个小星星的话会选不中,,,,,

这就很无奈了

而且如果再反悔想重新选择的话还是有点问题。。。。

我暂时没啥优化的思路了。。。。

先这样,我贴一下代码:

<!DOCTYPE html>
<html>
	<head>
		<meta charset="UTF-8">
		<title>评分</title>
	</head>
	<style type="text/css">
		*{
			margin: 0;
			padding: 0;
		}
		#max{
			width: 600px;
			height: 100px;
			border: 30px solid #F1F1F1;
			border-radius: 10px;
			margin: 200px auto;
			position: relative;
			padding: 0 0 0 10px;
		}
		span{
			height: 100px;
			line-height: 100px;
		}
		div#content{
			width: 500px;
			height: 100px;
			position: absolute;
			top: 30px;
			left: 110px;
		}
		ul li{
			list-style: none;
			float: left;
			height: 40px;
			padding: 5px 5px 0 5px ;
		}
		ul li img{
			width: 30px;
		}
		img.img{
			margin: 0 0 0 20px;
		}
	</style>
	<script type="text/javascript">
		window.onload = function(){
			var arrSrc = ['img/a.png','img/b.png','img/c.png'];
			var oDiv = document.getElementById('content');
			var aLi = oDiv.getElementsByTagName('li');
			var oPing = document.getElementById('ping');
			var dang = null;
			var dian = 0;
			
			for(var i=0;i<aLi.length;i++){
				aLi[i].index = i;
				
				aLi[i].onmouseover = function(){
					dang = this.index;
										
					for(var i=0;i<=dang;i++){
						if(dang<2){
							aLi[i].getElementsByTagName('img')[0].src = arrSrc[2];
						}else{
							aLi[i].getElementsByTagName('img')[0].src = arrSrc[1];
						}
						switch(dang){
							case 0:
								oPing.innerHTML = "很差";
							break;
							case 1:
								oPing.innerHTML = "一般";
							break;
							case 2:
								oPing.innerHTML = "可以";
							break;
							case 3:
								oPing.innerHTML = "很棒";
							break;
							case 4:
								oPing.innerHTML = "极好";
							break;
						}
					}
				}
				aLi[i].onmouseout = function(){
					for(var i=0;i<=dang;i++){
						aLi[i].getElementsByTagName('img')[0].src = arrSrc[0];
					}
					for(var i=0;i<=dian;i++){	
						if(dian ==0){
							//没有操作
						}else{
							aLi[i].getElementsByTagName('img')[0].src = arrSrc[1];
						}
					}
				}
				aLi[i].onclick = function(){
					dian = dang;	
					for(var i=0;i<=dian;i++){
						aLi[i].getElementsByTagName('img')[0].src = arrSrc[1];
					}
					dang = dian;
				}
			}
			
			
			
		}
	</script>
	<body>
		<div id="max">
			<span class="">
				*
			</span>
			<span>
				评价:
			</span>
			<span id="ping">
				评价	
			</span>
			<div id="content">
				<ul>
					<li><img src="img/a.png"/></li>
					<li><img src="img/a.png"/></li>
					<li><img src="img/a.png"/></li>
					<li><img src="img/a.png"/></li>
					<li><img src="img/a.png"/></li>
				</ul>
				
				<img class="img" src="img/img.png"/>
			</div>
		</div>
	</body>
</html>

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值