Blogger Information
Blog 32
fans 0
comment 0
visits 28200
Popular Tutorials
More>
Latest Downloads
More>
Web Effects
Website Source Code
Website Materials
Front End Template
DOM操作实战,简易在线客服与计算器--2019年5月10日
ChenPJ的博客
Original
1126 people have browsed it


编写一个小型的计算器
本例通过获取用户输入的两个数字进行加减乘除运算,并将结果显示输出。

实例

<!DOCTYPE html>
<html lang="en">
<head>
	<meta charset="UTF-8">
	<title>迷你计算器</title>
	<style type="text/css">
		.box {
			width: 500px;
			height: 200px;
			background-color: #efefef;
			border: 1px solid lightgray;
			text-align: center;
			margin: 20px auto;
			color: #636363;
			border-radius: 15px;
			box-shadow: 2px 2px 2px #999;
		}

		table {
			margin: auto;
			/*参考线*/
			/*border: 1px solid red; */
		}

		td {
			width: 100px;
			height: 30px;
			padding: 5px 10px;
		}

		input, select {
			width: 100%;
			height:100%;
			border:none;
			text-align: left;
			padding-left: 15px;
			/*background-color: cyan;*/
		}

		button {
			width: 100%;
			height: 100%;
			border: none;
			background-color: skyblue;
			color: white;
		}
		button:hover {
			cursor: pointer;
			background-color: coral;
			width: 105%;
			height: 105%;
		}

	</style>
</head>
<body>
	<div class="box">
		<h2>小小计算器</h2>
		<form>
			<table>
				<tr>
					<td><input type="text" name="opt1" placeholder="操作数1" autofocus></td>
					<td>
						<select name="option">
							<option value="null">请选择操作</option>
							<option value="add"> + </option>
							<option value="sub"> - </option>
							<option value="mul"> × </option>
							<option value="div"> ÷ </option>
						</select>
					</td>
					<td><input type="text" name="opt2" placeholder="操作数2"></td>
					<td><button type="button">计算</button></td>
				</tr>
				<tr>
					<td colspan="2" align="right"><h3>结果:</h3></td>
					<td colspan="2" align="left"><h3 id="result"></h3></td>
				</tr>
			</table>
		</form>
	</div>

	<script type="text/javascript">
		//获取操作数,按钮与结果占位符
		var opt1 = document.getElementsByName('opt1')[0];
		var opt2 = document.getElementsByName('opt2')[0];
		var opt  = document.getElementsByName('option')[0];

		var btn = document.getElementsByTagName('button')[0];
		var result = document.getElementById('result');

		
		//给按钮添加事件,执行计算操作
		btn.onclick = function(){
			var data1 = 0;
			var data2 = 0;


			if (opt1.value.length === 0 ) {
				alert('第一个操作数不能为空');
				opt1.focus();
				return false;
			} else if (isNaN(opt1.value)) {
				alert('第一个操作数必须为数字');
				opt1.focus();
				return false;
			} else if (opt2.value.length === 0) {
				alert('第二个操作数不能为空');
				opt2.focus();
				return false;
			} else if (isNaN(opt2.value)) {
				alert('第二个操作数必须为数字')
				opt2.focus();
				return false;
			} else {
				data1 = parseFloat(opt1.value);
				data2 = parseFloat(opt2.value);
			}
			

			var option  = opt.value;
			var temp = 0;
			var flag = '';
			switch (option){
				case 'null':
					alert("请选择操作类型");
					opt.focus();
					return false;
				case 'add':
					flag = '+';
					temp = data1 + data2;
					break;
				case 'sub':
					flag = '-';
					temp = data1 - data2;
					break;
				case 'mul':
					flag = '×';
					temp = data1 * data2;
					break;
				case 'div':
					flag = '÷';
					if (data2 === 0) {
						alert('除数不能为0,请重新输入');
						opt2.focus();
						return false;
					} else {
						temp = data1 / data2;
						//保留小数点2位
						temp = Math.round(temp * 100) / 100;
					}					
					break
			}

			// placeholder.innerHTML = '<span style="color:coral">'+data1+' '+ flag+' '+ data2+' = '+temp +'</span>'

			var str = '<span style="color:coral">';
			str += data1+' '+flag+' '+data2 + ' = ' + temp ;
			str += '</span>';
            result.innerHTML = str;
		}


	</script>
</body>
</html>

运行实例 »

点击 "运行实例" 按钮查看在线实例

批注 2019-05-13 145830.png


本例实现过程:
1. 在页面上设置两个输入框与一个下拉选择框,利用getElementsByName方法获得用户输入。
2. 设置一个计算按钮,并设计好onclick事件,对用户的输入进行加减乘除运算。
  2.1  利用分支流程控制,对用户输入进行判断,避免非法输入导致无法进行运算。
  2.2  将结果显示输出。
 
本例中的流程判断用到了if(){}else if(){}与switch (){case:}进行分支选择,if()else方法略显臃肿,switch方法简洁易读。
在选择分支较多时,选用switch…case结构会提高程序的效率,但switch不足的地方在于只能处理字符或者数字类型的变量,if…else结构更加灵活一些,if…else结构可以用于判断表达式是否成立,比如if(a+b>c),if…else的应用范围更广,switch…case结构在某些情况下可以替代if…else结构。

关于保留小数位数,此处用到Math.round()方法。
Math.round()方法的功能是四舍五入取整,所以本例中用于保留两位小数的方式为,先将除法得数乘以100后取整,然后再除以100得出两位小数。
这里也可以使用Math.floor()进行同样的操作。



编写一个在线客服功能

本例通过设计一个按钮点击事件,将用户在文本域中的输入内容显示到上方UL列表中,并模拟在线客服自动回复。

实例

<!DOCTYPE html>
<html lang="en">
<head>
	<meta charset="UTF-8">
	<title>实战: 仿机器人聊天窗口</title>
	<style type="text/css">
		div:nth-child(1) {
			width: 450px;
			height: 650px;
			background-color: lightskyblue;
			margin: 30px auto;
			color: #333;
			box-shadow: 2px 2px 2px #808080
		}
		
		h2 {
			text-align: center;
			margin-bottom: -10px;
		}
		div:nth-child(2) {
			width: 400px;
			height: 500px;
			border: 4px double green;
			background-color: #efefef;
			margin: 20px auto 10px;			
		}
		
		ul {
			list-style: none;
			line-height: 2em;
			/*border: 1px solid red;*/
			overflow: hidden;
			padding: 15px;			
		}

		table {
			width: 90%;
			height:80px;
			margin: auto;
		}

		textarea{
			/*文本域宽高设置,避免兼容性问题*/
			width: 360px;
			height: 60px;
			border: none;
			resize: none;
			background-color: lightyellow;
			
		}
		button {
			width: 60px;
			height: 40px;
			background-color: seagreen;
			color: white;
			border: none;
			/*text-align: left;*/

		}
		button:hover {
			cursor: pointer;
			background-color: orange;
		}
	</style>
</head>
<body>
	<div>
		<h2>在线客服</h2>
		<div contenteditable="true">
			<ul>
				<li></li>
			</ul>
		</div>
		<table>
			<tr>
				<td align="right">
					<textarea  name="text" autofocus></textarea>
				</td>
				<td align="left">
					<button type=button>发送</button>
				</td>
			</tr>
		</table>	
	</div>
	<script type="text/javascript">
		//获取到页面中的按钮,文本域,对话内容区
		var btn = document.getElementsByTagName('button')[0];
		var input_Text = document.getElementsByName('text')[0];
		var comment_List = document.getElementsByTagName('ul')[0];
		var sum = 0;

		//添加按钮点击事件,获取用户数据并推送到对话窗口中
		btn.onclick = function () {			
			//获取用户提交的内容
			if (input_Text.value.length === 0) {
				alert("是不是忘记要问点啥了~~");
				return false;
			}
			//如果回复内容大于10条则清空聊天窗口,重新开始
			if (sum === 10) {
				comment_List.innerHTML = '';  //清空内容
				sum = 0;  // 清空计数器
			}
			
			var userComment = input_Text.value;

			//立即清空用户信息区
			input_Text.value = '';

			//创建一个新节点li
			var new_Li = document.createElement('li');

			
			new_Li.innerHTML = userComment;

			var userPic = '<img src="../0508/images/gyy.jpg" width="30" style="border-radius:50%">';
			new_Li.innerHTML = userPic+userComment;			

			//将新节点插入到对话列表中
			comment_List.appendChild(new_Li);
			sum += 1;
			
			
				setTimeout(function(){
				var info = ['你好烦人呀,本姑娘好累,不知道怜香惜玉吗?','除了退货,退款,维修,什么问题都可以问','啥事呀,我的帅哥哥'];
				var temp = info[Math.floor(Math.random()*3)];  //获取随机的内容
				//取1-5之间的一个整数:Math.floor(Math.random()*6 + 1)
				var auto_Reply = document.createElement('li');  /*创建新元素用来保存回复内容*/
				var kefuPic = '<img src="../0508/images/zly.jpg" width="30" style="border-radius:50%;">';
				
				auto_Reply.innerHTML = kefuPic + '<span style="color:red">'+temp+'</span>';
				// reply.style.float = 'right'

				comment_List.appendChild(auto_Reply);  //将回复内容添加到窗口中
				sum += 1;  // 回复内容计数加1

			},2000);					

		}


	</script>
</body>
</html>

运行实例 »

点击 "运行实例" 按钮查看在线实例

批注 2019-05-13 145753.png

本例的实现过程:
1. 在页面上设置一个对话显示框,一个用户输入框和一个提交按钮
2. 对提交按钮设计一个onclick事件函数
  2.1 通过getEelementsByName获取文本域对象,判断用户是否输入内容
  2.2 每当对话框中的显示超过10行时,清空对话框。本处设置一个sum变量当作计数器,每次提交输入内容时判断。
  2.3 接收到用户提交的输入内容时对文本域进行清空
  2.4 利用createElement创建一个新的节点对象,li标签。
  2.5 将用户的输入内容添加到li标签,并通过appendChild方法将li标签插入到UL中。
  2.6 模拟人工智能的回复,利用Math.random函数产生随机数,将存在数组中的预设回复取出显示。
3. onclick事件结束。

Math.random只产生1以内的随机数,包含0。所以,要取得1以上的整数时,需要将结果乘以取值范围之差,再用Math.floor方法取整。比如,想获得1~10之间这10个随机数具体方法为:

    Math.floor(Math.random()*(10-1)+1)

结尾处必须+1,否则只产生0~9之间的10个随机数。

Correction status:Uncorrected

Teacher's comments:
Statement of this Website
The copyright of this blog article belongs to the blogger. Please specify the address when reprinting! If there is any infringement or violation of the law, please contact admin@php.cn Report processing!
All comments Speak rationally on civilized internet, please comply with News Comment Service Agreement
0 comments