购物车实现增删 商品数的底层逻辑js 无委托

11 篇文章 0 订阅

运行展示页面

 先布置html布局

 <div id="formDiv">
        <h4>添加商品</h4>
        <table>
            <tr>
                <td class="word">商品名称:</td>
                <td class="inp">
                    <input type="text" name="empName" id="empName">
                </td>
            </tr>
            
           
            <tr>
                <td colspan="2" align="center">
                    <button id="addEmpButton" value="abc">
                        添加
                    </button>
                </td>
               
            </tr>
        </table>
    </div>
  <div id="result">
    <!-- <button>添加商品</button> -->
    <table id = "employeeTable">
        <tr>
            <th>Number</th>
            <th>商品名称</th>
            <th>数量</th>
			<th>价格</th>
            <th>&nbsp;</th>
        </tr>
        <tr>
            <td>1</td>
			<td>加多宝</td>
			<td>
				<button class= "reduce">-</button><input type="text" value="0" style="width: 25px;height: 20px;text-align: center;"><button class = "plus">+</button>
			</td>
			<td>5.5</td>
            <td><a href="#">删除</a></td>
        </tr>
        <tr>
			<td>2</td>
			<td>卫龙辣条</td>
			<td>
				<button class = "reduce">-</button ><input type="text" value="0" style="width: 25px;height: 20px;text-align: center;"><button class = "plus">+</button>
				</td>
			<td>0.5</td>
            <td><a href="#">删除</a></td>
        </tr>
        <tr>
			<td>3</td>
			<td>螺蛳粉</td>
			<td>
				<button class= "reduce">-</button><input type="text" value="0" style="width: 25px;height: 20px;text-align: center;"><button class = "plus">+</button>
			</td>
			<td>9.5</td>
            <td><a href="#">删除</a></td>
        </tr>
		<tfoot>
			<td colspan="5" id = "total">总计:</td>
		</tfoot>
    </table>
  </div>

再设置好css

    <style>
        		*{
			margin: 0;
			padding: 0;
		}
		#result,#formDiv{
			width: 500px;
			background-color:orange;
			margin-left: 200px;
			margin-top: 50px;
		}
		table{
			margin: 50px auto;
		}
		tr{
			width: 255px;
			min-height: 23px;
		}
		tr:nth-of-type(even){
			background-color: pink;
		}
		tr:nth-of-type(odd){
			background-color:deepskyblue;
		}
		input{
			outline: none;
		}
		#employeeTable{
			text-align: center;
		}
		#addEmpButton,#gen{
			width: 100px;
		}
		button{
			width: 25px;
			height: 25px;
			font-size: 12px;
		}
    </style>

js部分 :

1.添加商品

需求:输入商品名称时,当点击添加按钮,会在商品区表格渲染出来 价格随机

想法:先拿到输入框的值判断是否为空,不为空给添加按钮设置点击事件,当点击时 动态创建tr

      /*
      增加商品 想法 拿到添加按钮 设置商品初始值i 判断内容不能为空 每当点击添加一次 初始值加以 
                    并拼接字符串tr
      
      */
     //拿到添加按钮
     let add = document.getElementById('addEmpButton')
     console.log(add)
     let shopnum = 3
     //给添加按钮绑定事件
    add.onclick = function(){
       //每点击一次 就自动加1
        shopnum += 1
        //获取框里的值
        let input = document.getElementById('empName').value;
        //判断商品不能为空
        if(!input){
            confirm('添加商品不能为空')
            return
        }
        var price = Math.floor(Math.random()*20)
        console.log(price)
       //不用拼接 创建tr 给tr里面赋值innerHTML
       var tr = document.createElement('tr')
       tr.innerHTML = `   <tr>
			<td>${shopnum}</td>
			<td>${input}</td>
			<td>
				<button class = "reduce">-</button ><input type="text" value="0" style="width: 25px;height: 20px;text-align: center;"><button class = "plus">+</button>
				</td>
			<td>${price}</td>
            <td><a href="#">删除</a></td>
        </tr>`
          //将tr追加到tbody里
     document.getElementsByTagName('tbody')[1].appendChild(tr)
    }
  

2.删除商品

需求:当点击删除键时 会弹出提示,确定则删除它

想法:拿到删除按钮 给其绑上点击事件 再找到点击时对应的行 拿到行中第一个td即name 设置flag 点击弹出提示 确定 则移除当行

  //拿到删除按钮
      let del = document.getElementsByTagName('a')
      console.log(del)
      //遍历它 
      for(let i = 0;i<del.length;i++){
          //给每个删除按钮绑定事件
          del[i].onclick = function(){
              //找到它的行
              let tr = this.parentNode.parentNode     
              //拿到行中第一个td即name 通过获取标签名拿 因为是td所以用innerHTML       
              let name = tr.getElementsByTagName('td')[1].innerHTML
              console.log(name)
              //当点击当前删除时 弹出消息
             let flag = confirm(`确定删除${name}吗?`)
             if(flag){
                  //删除自己
                tr.remove(tr)
             }
          }
      }

运行发现问题:

问题:新增加的商品 当点击删除按钮时没有反应

解决:要在添加商品时 在其后面再给新增的tr设置删除功能

         //将tr追加到tbody里
     document.getElementsByTagName('tbody')[1].appendChild(tr)
     //再将添加的商品 设置删除 在tr后拿
     let a = tr.getElementsByTagName('a')[0]
     console.log(a)
     //a为当前的啊
     a.onclick = function (){
         let tr = this.parentNode.parentNode
         let name= document.getElementById('empName').value;
         console.log(name)
         let flag = confirm(`确定要删除${name}吗?`)
         if(flag){
             tr.remove(tr)
         }
     }
     document.getElementById('empName').value = ''
    }  

加减按钮

拿到 加减两侧按钮 再拿到里面的value值 转为数字型 自增自减即可 

问题: --this.nextElementSibling.value 不能用变量存储 判断时也不能 

         因为改变的是值 不是地址 所以要直接引用

        //加减两侧按钮
   //拿到加 减
   var table = document.getElementById('employeeTable')
   var addb = table.getElementsByClassName('plus')
   var redb = table.getElementsByClassName('reduce')
   console.log(addb,redb)
//    var num =1;
   //用onclick 绑定点前点击
    for(let i = 0; i<redb.length;i++){
        redb[i].onclick = function(){
            //拿到当前点击加里面框里的值
            var num = --this.nextElementSibling.value
            if(this.nextElementSibling.value<0){
                this.nextElementSibling.value = 0;
            }
            // var num = ++input
          
   }
    }
    for(let j = 0;j<addb.length;j++){
        addb[j].onclick = function(){
            var num = ++this.previousSibling.value
            console.log(num)
        }

    }

整体代码

html

<body>
    <div id="formDiv">
        <h4>添加商品</h4>
        <table>
            <tr>
                <td class="word">商品名称:</td>
                <td class="inp">
                    <input type="text" name="empName" id="empName">
                </td>
            </tr>
            
           
            <tr>
                <td colspan="2" align="center">
                    <button id="addEmpButton" value="abc">
                        添加
                    </button>
                </td>
               
            </tr>
        </table>
    </div>
  <div id="result">
    <!-- <button>添加商品</button> -->
    <table id = "employeeTable">
       <thead>
        <tr>
            <th>Number</th>
            <th>商品名称</th>
            <th>数量</th>
			<th>价格</th>
            <th>&nbsp;</th>
        </tr>
       </thead>
        <tbody>
            <tr>
                <td>1</td>
                <td>加多宝</td>
                <td>
                    <button class= "reduce">-</button><input type="text" value="0" style="width: 25px;height: 20px;text-align: center;"><button class = "plus">+</button>
                </td>
                <td>5.5</td>
                <td><a href="#">删除</a></td>
            </tr>
            <tr>
                <td>2</td>
                <td>卫龙辣条</td>
                <td>
                    <button class = "reduce">-</button ><input type="text" value="0" style="width: 25px;height: 20px;text-align: center;"><button class = "plus">+</button>
                    </td>
                <td>0.5</td>
                <td><a href="#">删除</a></td>
            </tr>
            <tr>
                <td>3</td>
                <td>螺蛳粉</td>
                <td>
                    <button class= "reduce">-</button><input type="text" value="0" style="width: 25px;height: 20px;text-align: center;"><button class = "plus">+</button>
                </td>
                <td>9.5</td>
                <td><a href="#">删除</a></td>
            </tr>
        </tbody>
		<tfoot>
			<td colspan="5" id = "total">总计:</td>
		</tfoot>
    </table>
  </div>

CSS

 <style>
        		*{
			margin: 0;
			padding: 0;
		}
		#result,#formDiv{
			width: 500px;
			background-color:orange;
			margin-left: 200px;
			margin-top: 50px;
		}
		table{
			margin: 50px auto;
		}
		tr{
			width: 255px;
			min-height: 23px;
		}
		tr:nth-of-type(even){
			background-color: pink;
		}
		tr:nth-of-type(odd){
			background-color:deepskyblue;
		}
		input{
			outline: none;
		}
		#employeeTable{
			text-align: center;
		}
		#addEmpButton,#gen{
			width: 100px;
		}
		button{
			width: 25px;
			height: 25px;
			font-size: 12px;
		}
    </style>

js

     window.onload = function(){
          /*
          删除事件 想法:拿到删除按钮 给其绑上点击事件 再找到点击时对应的行 拿到行中第一个td即name 
                        设置flag 点击弹出提示 确定 则移除当行
          */
      //拿到删除按钮
      let del = document.getElementsByTagName('a')
      //遍历它 
      for(let i = 0;i<del.length;i++){
          //给每个删除按钮绑定事件
          del[i].onclick = function(){
              //找到它的行
              var tr = this.parentNode.parentNode     
              //拿到行中第一个td即name 通过获取标签名拿 因为是td所以用innerHTML       
              var name = tr.getElementsByTagName('td')[1].innerHTML
              console.log(name)
              //当点击当前删除时 弹出消息
             let flag = confirm(`确定删除${name}吗?`)
             if(flag){
                  //删除自己
                tr.remove(tr)
             }
          }
      }
      /*
      增加商品 想法 拿到添加按钮 设置商品初始值i 判断内容不能为空 每当点击添加一次 初始值加以 
                    并拼接字符串tr
      
      */
     //拿到添加按钮
     let add = document.getElementById('addEmpButton')
     let shopnum = 3
     //给添加按钮绑定事件
    add.onclick = function(){
       //每点击一次 就自动加1
        shopnum += 1
        //获取框里的值
        let input = document.getElementById('empName').value;
        //判断商品不能为空
        if(!input){
            confirm('添加商品不能为空')
            return
        }
        var price = Math.floor(Math.random()*20)
       //不用拼接 创建tr 给tr里面赋值innerHTML
       var tr = document.createElement('tr')
       tr.innerHTML = `   <tr>
			<td>${shopnum}</td>
			<td>${input}</td>
			<td>
				<button class = "reduce">-</button ><input type="text" value="0" style="width: 25px;height: 20px;text-align: center;"><button class = "plus">+</button>
				</td>
			<td>${price}</td>
            <td><a href="#">删除</a></td>
        </tr>`
          //将tr追加到tbody里
     document.getElementsByTagName('tbody')[1].appendChild(tr)
     //再将添加的商品 设置删除 在tr后拿
     let a = tr.getElementsByTagName('a')[0]
     console.log(a)
     //a为当前的啊
     a.onclick = function (){
         let tr = this.parentNode.parentNode
         let name= document.getElementById('empName').value;
         console.log(name)
         let flag = confirm(`确定要删除${name}吗?`)
         if(flag){
             tr.remove(tr)
         }
     }
     document.getElementById('empName').value = ''
        //加减两侧按钮
   //拿到加 减
   var table = document.getElementById('employeeTable')
   var addb = table.getElementsByClassName('plus')
   var redb = table.getElementsByClassName('reduce')
   console.log(addb,redb)
//    var num =1;
   //用onclick 绑定点前点击
    for(let i = 0; i<redb.length;i++){
        redb[i].onclick = function(){
            //拿到当前点击加里面框里的值
            var num = --this.nextElementSibling.value
            if(this.nextElementSibling.value<0){
                this.nextElementSibling.value = 0;
            }
            // var num = ++input
          
   }
    }
    for(let j = 0;j<addb.length;j++){
        addb[j].onclick = function(){
            var num = ++this.previousSibling.value
            console.log(num)
        }

    }
    }  

}  

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值