显示和隐藏一个div的问题

显示和隐藏一个div的问题

//代码1
<!DOCTYPE html>
<html>
<head>
	<meta charset="utf-8">
	<title></title>
	<style type="text/css">
	        #myDiv {
			 100px;
			height: 100px;
			background: red;
			display: none;
		}
	</style>
</head>

<body>
	<input type="button" value="出现">
	<div id="myDiv"></div>
	<script type="text/javascript">
		var oBtn = document.getElementsByTagName('input')[0];
		var oDiv = document.getElementById('myDiv');
		oBtn.onclick = function() {
			oDiv.style.display = (oDiv.style.display === "none") ? "block" : "none";
		}
	</script>
</body>
</html>

bug:上面代码,首次显示div,必须单击两次按钮,后面再显示隐藏就只需单击一次就可以了

方案:

1、如果将三元操作符的判断条件换成反面就可以了

//代码2
oDiv.style.display = (oDiv.style.display === "block") ? "none" : "block";

2、如果将display:none放在行内样式,也是可以的(为了结构样式分离,不推荐)

这是为什么呢:

因为style只能读取行内样式的属性值,所以放在行内样式里面,就是正常的执行

而放在css里,style是读取不到css里的属性值,所以代码1下:

  • 第一次单击时,display不为"none",而是什么都没有,空字符串,结果就是false,false的话就赋值none。所以还是隐藏
  • 第二次单击时,因为第一次单击js给display赋值none了,所以这次正常执行,赋值为block

再看代码2:

  • 第一次单击时,display也是空字符串,结果是false,false的话就赋值block。所以一步到位了

总结:开始的判断条件应该写成当前状态的反面

原文地址:https://www.cnblogs.com/u14e/p/5238950.html