【前端 HTML+CSS+JavaScript(JS)】DOM练习-购物车的实现 ~ElementSibling parentElement children 事件的绑定与带注释/总结

效果:

在这里插入图片描述

总结:

1、event.targetthis似乎一致,自行查阅。
2、绑定事件方法:在带有括号(需要传参)时,一定要在外面带上引号,因为不加引号的话意为直接调用函数。

<input type="button" value="-" onclick="sub(event)" class="subBtns">

3、css中的类属性为class,在js中设置dom元素的class要使用className,其他的例如border-color要改为驼峰规则borderColor
4、事件的绑定与解绑方法:

subBtnsDoms[i].onclick = null;	//解绑
				//这没办法传this
				// subBtnsDoms[i].onclick = sub;	//绑定

plusBtnsDoms[i].onclick = function(event){	//第一种绑定的法一
					var num = event.target.previousElementSibling;
						++num.value;
					num.parentElement.nextElementSibling.innerText =parseFloat(num.parentElement.nextElementSibling.innerText) + parseFloat(num.parentElement.previousElementSibling.innerText);
				}

5、.previousElementSibling .nextElementSibling .parentElement
Node.childNodes
Element.children
在这里插入图片描述
在这里插入图片描述

代码:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <style>
		/* *{
			border: 1px solid #000;
		} */
        #b-box{
            text-align: center;
            border: 1px solid #000;
        }
        #tb0 tr td{
            text-align: center;
            border: 1px solid #000;
        }
		#tb0{
			margin: 0px auto;
		}
		#quantity{
			width: 20px;
		}
		.d1{
			margin-top: 20px;
		}
		.d1 input[type='button']{
			margin-left: 280px;
		}
		
    </style>
</head>
<body>
    <div id="b-box">
        <div class="d1">
            商品名称:
            <input type="text" />
        </div class="d1">

        <div class="d1">
            商品价格:
            <input type="text" />
        </div>

        <div class="d1">
            购买数量:
            <input type="text" />
        </div>

        <div class="d1">
            <input type="button" value="添加" onclick="addGood()"/>
        </div>

		<hr /> 

        <div>
            <h2>购物车</h2>
        </div>

        <div>
            <table id="tb0">
                <tr id="tr0">
                    <td><input type="checkbox" name="" id=""></td>
                    <td><h3>名称</h3></td>
                    <td><h3>价格</h3></td>
                    <td><h3>数量</h3></td>
                    <td><h3>小计</h3></td>
                    <td><h3>操作</h3></td>
                </tr>

                <tr>
                    <td><input type="checkbox" name="" id="" class="ckBoxes"></td>
                    <td>《如何征服英俊少男》</td>
                    <td>888.0</td>
                    <td>
						<!-- ★★★这个this务必带上★★★ -->
                        <input type="button" value="-" onclick="sub(event)" class="subBtns">
                        <input type="text" name="" id="quantity" value="10">
                        <input type="button" value="+" onclick="plus(event)" class="plusBtns">
                    </td>
                    <td>8880.0</td>
                    <td><input type="button" value="删除" onclick="del(event)" class="delBtns"></td>
                </tr>
            </table>
            <div>
                <hr />
                <br />
                总价:<label id="totalPrice">8880.0</label>
                <input type="button" value="提交订单" onclick="sbmt(event)"/>
            </div>
        </div>
    </div>
	
	<script type="text/javascript">
		function addGood(){
			var calDom = document.getElementById("totalPrice");
			
			var ifmtsDom = document.querySelectorAll(".d1 input[type='text']");
			var newTrDom = document.createElement("tr");	//tr
			var newTdDom = document.createElement("td");	//td
			var newTdDom1 = document.createElement("td");
			var newTdDom2 = document.createElement("td");
			var newTdDom3 = document.createElement("td");
			
			var newCkDom = document.createElement("input");
			var newSubDom = document.createElement("input");
			var newPlusDom = document.createElement("input");
			var newQuaDom = document.createElement("input");
			var newSbttDom = document.createElement("td");
			
			var newDelBtnDom = document.createElement("input");	//删除
			var newDelTdDom = document.createElement("td");
			
			newCkDom.className = "ckBoxes";//checkbox类名设置
			
			newSubDom.type = "button";
			newSubDom.value = "-";
			//设置name试试看
			
			newSubDom.className = "subBtns";
			
			newPlusDom.type = "button";
			newPlusDom.value = "+";
			//★★★class和className一定要注意★★★
			newPlusDom.className = "plusBtns";
			
			newQuaDom.type = "text";
			newQuaDom.style.width = "20px";
			
			newDelBtnDom.type = "button";
			newDelBtnDom.value = "删除";
			newDelBtnDom.className = "delBtns";
			newDelTdDom.appendChild(newDelBtnDom);
			
			var targetTbDom = document.getElementById("tb0");
			newCkDom.type = "checkbox";
			newTdDom.appendChild(newCkDom);
			newTrDom.appendChild(newTdDom);
			
			//如何优化?数组? 循环?晚点看
			newTdDom1.innerText = ifmtsDom[0].value;
			newTdDom2.innerText = ifmtsDom[1].value;
			newTdDom3.appendChild(newSubDom);
			newQuaDom.value = ifmtsDom[2].value;
			newTdDom3.appendChild(newQuaDom);
			newTdDom3.appendChild(newPlusDom);
			
			newTrDom.appendChild(newTdDom1);
			newTrDom.appendChild(newTdDom2);
			newTrDom.appendChild(newTdDom3);
			//小计功能也可以绑定两个函数
			newSbttDom.innerText = parseFloat(ifmtsDom[1].value) * parseFloat(ifmtsDom[2].value);
			newTrDom.appendChild(newSbttDom);	//小计
			
			newTrDom.appendChild(newDelTdDom);
			
			targetTbDom.appendChild(newTrDom);
			
			calDom.innerText = parseFloat(calDom.innerText) + parseFloat(newSbttDom.innerText);
			
			//下面开始配置 数量加减 按钮功能
			var subBtnsDoms = document.querySelectorAll(".subBtns");
			var plusBtnsDoms = document.querySelectorAll(".plusBtns");
			//别忘记点!! .......
			var delBtnsDoms = document.querySelectorAll(".delBtns");
			
			// console.log(delBtnsDoms);//调试问题代码
			
			for(var i = 0; i < subBtnsDoms.length; i++){
				// console.log(subBtnsDoms);
				subBtnsDoms[i].onclick = null;	//解绑
				//这没办法传this
				// subBtnsDoms[i].onclick = sub;	//绑定
				//注意时click!!!!!!
				
				//如何解决addEventListener动态绑定时无法传参的问题??优化??
				subBtnsDoms[i].onclick = function(event){	//第一种绑定的法一
					var num = event.target.nextElementSibling;
					if(num.value > 1){
						--num.value;
						num.parentElement.nextElementSibling.innerText =parseFloat(num.parentElement.nextElementSibling.innerText) - parseFloat(num.parentElement.previousElementSibling.innerText);
					}
						
				}
			}
			
			for(var i = 0; i < plusBtnsDoms.length; i++){
				plusBtnsDoms[i].onclick = null;
				plusBtnsDoms[i].onclick = function(event){	//第一种绑定的法一
					var num = event.target.previousElementSibling;
						++num.value;
					num.parentElement.nextElementSibling.innerText =parseFloat(num.parentElement.nextElementSibling.innerText) + parseFloat(num.parentElement.previousElementSibling.innerText);
				}
			}
			
			for(var i = 0; i < delBtnsDoms.length; i++){	//删除按钮绑定事件
				delBtnsDoms[i].onclick = null;
				delBtnsDoms[i].onclick = function(event){	//第一种绑定的法一
					event.target.parentElement.parentElement.remove();
				}
			}
		}
		function sub(event){	//减按钮 事件
			//注意用法!!!
			var num = event.target.nextElementSibling;
			if(num.value > 1){
				--num.value;
				num.parentElement.nextElementSibling.innerText =parseFloat(num.parentElement.nextElementSibling.innerText) - parseFloat(num.parentElement.previousElementSibling.innerText);
			}
		}
		
		function plus(event){	//加按钮 事件
			//注意用法!!!
			var num = event.target.previousElementSibling;
			++num.value;
			num.parentElement.nextElementSibling.innerText =parseFloat(num.parentElement.nextElementSibling.innerText) + parseFloat(num.parentElement.previousElementSibling.innerText);
		}
		
		function del(event){	//删除按钮 事件
			event.target.parentElement.parentElement.remove();
		}
		
		function sbmt(event){	//提交按钮 事件
			var ckedDoms = document.querySelectorAll(".ckBoxes");
			
			// console.log(ckedDoms);
			
			event.target.previousElementSibling.innerText = parseFloat(0);
			for(var i = 0; i < ckedDoms.length; i++){
				if(ckedDoms[i].checked == true){
					var subTt = parseFloat(ckedDoms[i].parentElement.nextElementSibling.nextElementSibling.nextElementSibling.nextElementSibling.innerText);
					event.target.previousElementSibling.innerText = parseFloat(event.target.previousElementSibling.innerText) + parseFloat(subTt);
				}
			}
			alert("提交成功!总价格为" + event.target.previousElementSibling.innerText + "元。");
		}
	</script>
</body>
</html>
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
好的,以下是一个简单的注册页面示例,包含基本的 HTML, CSSJavaScript 代码,用于输入验证: HTML代码: ```html <!DOCTYPE html> <html> <head> <title>注册页面</title> <link rel="stylesheet" href="style.css"> </head> <body> <div class="container"> <h1>注册页面</h1> <form id="registration-form" action="" method="POST"> <div class="form-control"> <label for="username">用户名:</label> <input type="text" id="username" name="username" placeholder="请输入用户名" required> </div> <div class="form-control"> <label for="email">电子邮件:</label> <input type="email" id="email" name="email" placeholder="请输入电子邮件" required> </div> <div class="form-control"> <label for="password">密码:</label> <input type="password" id="password" name="password" placeholder="请输入密码" required> </div> <div class="form-control"> <label for="confirm-password">确认密码:</label> <input type="password" id="confirm-password" name="confirm-password" placeholder="请再次输入密码" required> </div> <button type="submit" class="btn">注册</button> </form> </div> <script src="script.js"></script> </body> </html> ``` CSS代码: ```css * { margin: 0; padding: 0; box-sizing: border-box; } body { font-family: Arial, sans-serif; background-color: #f4f4f4; } .container { max-width: 500px; margin: 50px auto; padding: 30px; background-color: #fff; box-shadow: 0 0 10px rgba(0, 0, 0, 0.1); } h1 { text-align: center; margin-bottom: 30px; } .form-control { margin-bottom: 20px; } label { display: block; margin-bottom: 5px; font-size: 16px; font-weight: bold; } input[type="text"], input[type="email"], input[type="password"] { width: 100%; padding: 10px; border: 1px solid #ccc; border-radius: 5px; font-size: 16px; } .btn { display: block; width: 100%; padding: 10px; background-color: #4CAF50; color: #fff; border: none; border-radius: 5px; cursor: pointer; font-size: 16px; } .btn:hover { background-color: #3e8e41; } ``` JavaScript代码: ```javascript const form = document.getElementById('registration-form'); const username = document.getElementById('username'); const email = document.getElementById('email'); const password = document.getElementById('password'); const confirmPassword = document.getElementById('confirm-password'); form.addEventListener('submit', function(event) { event.preventDefault(); checkInputs(); }); function checkInputs() { // 获取输入值并去除空格 const usernameValue = username.value.trim(); const emailValue = email.value.trim(); const passwordValue = password.value.trim(); const confirmPasswordValue = confirmPassword.value.trim(); if (usernameValue === '') { setErrorFor(username, '用户名不能为空'); } else { setSuccessFor(username); } if (emailValue === '') { setErrorFor(email, '电子邮件不能为空'); } else if (!isEmail(emailValue)) { setErrorFor(email, '请输入有效的电子邮件地址'); } else { setSuccessFor(email); } if (passwordValue === '') { setErrorFor(password, '密码不能为空'); } else { setSuccessFor(password); } if (confirmPasswordValue === '') { setErrorFor(confirmPassword, '请再次输入密码'); } else if (passwordValue !== confirmPasswordValue) { setErrorFor(confirmPassword, '两次输入的密码不一致'); } else { setSuccessFor(confirmPassword); } } function setErrorFor(input, message) { const formControl = input.parentElement; const errorMessage = formControl.querySelector('.error-message'); input.classList.add('error'); errorMessage.innerText = message; formControl.classList.add('error'); } function setSuccessFor(input) { const formControl = input.parentElement; input.classList.remove('error'); formControl.classList.remove('error'); } function isEmail(email) { // 正则表达式验证电子邮件格式 const re = /^(([^<>()[\]\\.,;:\s@\"]+(\.[^<>()[\]\\.,;:\s@\"]+)*)|(\".+\"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$/; return re.test(email); } ``` 在这个示例,我们使用了一些基本的 HTML 元素,如表单、输入框和按钮,并使用 CSS 对它们进行样式化。我们还使用了一些 JavaScript,用于对用户输入进行验证,并在必要时显示错误消息。 在 JavaScript ,我们定义了一个 `checkInputs()` 函数,该函数将获取用户输入的值,并使用 `setErrorFor()` 和 `setSuccessFor()` 函数进行输入验证。`setErrorFor()` 函数将在输入无效时显示错误消息,而 `setSuccessFor()` 函数将在输入有效时清除错误消息。 最后,我们使用了 `addEventListener()` 方法来监听表单提交事件,并使用 `preventDefault()` 方法防止表单默认提交行为。如果输入验证通过,则表单将提交,否则将显示错误消息。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

_小鹰

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值