首页 > 试题广场 >

购物车

[编程题]购物车
  • 热度指数:11261 时间限制:C/C++ 2秒,其他语言4秒 空间限制:C/C++ 256M,其他语言512M
  • 算法知识视频讲解
HTML模块为一个简化版的购物车,tbody为商品列表,tfoot为统计信息,系统会随机在列表中生成一些初始商品信息
1、请完成add函数,在列表后面显示items商品信息。参数items为{name: String, price: Number}组成的数组
2、请完成bind函数,点击每一行的删除按钮(包括通过add增加的行),从列表中删除对应行
3、请注意同步更新统计信息,价格保留小数点后两位
4、列表和统计信息格式请与HTML示例保持一致
5、不要直接手动修改HTML中的代码
6、不要使用第三方库
function add(items) {
  let frag = document.createDocumentFragment()
  for (let item of items) {
    let tr = document.createElement('tr')
    tr.innerHTML = `
        <td>${item.name}</td>
        <td>${item.price.toFixed(2)}</td>
        <td><a href="javascript:void(0);">删除</a>
        </td>`
    frag.appendChild(tr)
  }
  document.querySelector('tbody').appendChild(frag)
  bind()
}

function bind() {
  let tbody = document.getElementsByTagName('tbody')[0]
  let allTr = [].slice.call(tbody.getElementsByTagName('tr'), 0)
  let totalNode = document.querySelector('tfoot td')
  let total = 0
  for (let trNode of allTr) {
    let price = +trNode.children[1].innerText
    total += price
    if (!trNode.onclick) {
      trNode.onclick = handleDelete
    }
  }
  total = total.toFixed(2)
  totalNode.innerText = `${total}(${allTr.length}件商品)`
}
function handleDelete(e) {
  if (e.target.tagName == 'A') {
    this.remove()
    bind()
  }
}
通过看这位大佬的代码:@响亮的名字sy,我终于过了。原因就是,获取tr的列表时不能用querySelector('tbody tr')。改成用getElementsByTagName就过了
发表于 2021-12-05 22:49:49 回复(0)
就离谱
function add(items) {
    const tbody = document.querySelector('#jsTrolley > tbody')
    items.forEach(item => {
        const { name, price } = item
        const tr = document.createElement('tr')
        tr.innerHTML = `<td>${name}</td><td>${price.toFixed(2)}</td><td><a href="javascript:void(0);">删除</a></td>`
        tbody.append(tr)
    })
    calcTotalPrice()
}
function calcTotalPrice() {
    const tdPriceAll = document.querySelectorAll('#jsTrolley > tbody > tr > td:nth-child(2)')
    let newSumPrice = 0
    tdPriceAll.forEach(item => {
        newSumPrice += +item.innerText
    })
    document.querySelector('#jsTrolley > tfoot > tr > td').innerText = `${newSumPrice.toFixed(2)}(${tdPriceAll.length}件商品)`
}
function bind() {
    const tbody = document.querySelector('#jsTrolley > tbody')
    tbody.onclick = (e) => {
        if (e.target.tagName === 'A' && e.target.innerText === '删除') {
            e.target.parentElement.parentElement.remove()
            calcTotalPrice()
        }
    }
}

发表于 2021-11-29 14:32:40 回复(0)
function add(items) {
    //创建空白的文档片段
  let frag = document.createDocumentFragment();
  for (let item of items) {
    //创建一个新的tr
    let tr = document.createElement('tr');
    //填充tr元素内容
    tr.innerHTML = `
        <td>${item.name}</td>
        <td>${item.price.toFixed(2)}</td>
        <td><a href="javascript:void(0);">删除</a>
        </td>`;
        //tr填充到文档片段里
    frag.appendChild(tr);
  }
  //文档片段添加到DOM树中
  document.querySelector('tbody').appendChild(frag);
  bind();
}
 
function bind() {
    //获取tbody
  let tbody = document.getElementsByTagName('tbody')[0];
  //获取tbody里面的tr元素数组
//   let trs =tbody.getElementsByTagName('tr');这个返回值是一个伪数组,会报错
  let trs=[].slice.call(tbody.getElementsByTagName('tr'),0)
  //变为数组
    //结尾节点
  let FootNode = document.querySelector('tfoot td');
  //总价
  let total = 0
  //遍历tr元素
  for (let tr of trs) {
    let price = +tr.children[1].innerText
    total += price
    if (!tr.onclick) {
      tr.onclick = function(e){
            if (e.target.tagName == 'A') {
            this.remove()
            bind()
        }
}
    }
  }
  total = total.toFixed(2)
  FootNode.innerText = `${total}(${trs.length}件商品)`
}

发表于 2022-07-15 11:16:21 回复(0)

function add(items) {
    // items {name , price }
    var parent = document.getElementsByTagName('tbody')[0]
    var tfoot = document.getElementsByTagName('tfoot')[0]
    var len = parent.children.length
    var total = tfoot.innerText.match(/^.*\t(\d*\.?\d*)\(.*\)$/)[1]
    var price = parseFloat(total)
    var tr = ""
    for (let i in items){
            price = parseFloat((price+items[i].price).toFixed(2))
            tr += `<tr>
                    <td>${items[i].name}</td>
                    <td>${items[i].price.toFixed(2)}</td>
                    <td><a href="javascript:void(0);">删除</a></td>
                    </tr>`
            len++
    }
    
    var tf = `
             <tr><th>总计</th><td colspan="2">${price.toFixed(2)}(${len}件商品)</td></tr>
             `
    tfoot.innerHTML = tf
    parent.innerHTML = parent.innerHTML+tr
    
 }


function bind() {
    var parent = document.getElementsByTagName('tbody')[0]
    var tfoot = document.getElementsByTagName('tfoot')[0]
    parent.addEventListener('click',(event)=>{
      var len = parent.children.length
      if(event.target.tagName == 'A'){
        var price = event.target.parentElement.parentElement.innerText.match(/^.*\t(\d*\.?\d*)\t.*$/)[1]
        var total = tfoot.innerText.match(/^.*\t(\d*\.?\d*)\(.*\)$/)[1]
        price = parseFloat((parseFloat(total)-price).toFixed(2))
        var tf = `
             <tr><th>总计</th><td colspan="2">${price.toFixed(2)}(${len-1}件商品)</td></tr>
             `
        tfoot.innerHTML = tf
        event.target.parentElement.parentElement.remove()
      }
    })
}
bind()


发表于 2021-06-03 17:33:02 回复(0)
这不通过,有什么大病?
    var tbody = document.querySelector('tbody');
    var del = document.querySelectorAll('a');
    var colspan = document.querySelector('tfoot').querySelector('td');

    function add(items) {
        let str = `<td>${items.name}</td><td>${items.price.toFixed(2)}</td><td><a href="javascript:void(0);">删除</a></td>`;
        let tr = document.createElement('tr');
        tr.innerHTML = str;
        tbody.appendChild(tr);
        total();
    }

    function bind() {
        for (let i = 0; i < del.length; i++) {
            tbody.onclick = function (e) {
                if (e.target.tagName === 'A') {
                    tbody.removeChild(e.target.parentElement.parentElement);
                    total();
                }
            }
        }
    }
    bind();

    function total() {
        let trs = document.querySelectorAll('tbody tr');
        let prices = [];
        for (const tr of trs) {
            let td = tr.children[1];
            let price = parseFloat(td.innerText);
            prices.push(price);
        }
        let total = prices.reduce((a, b) => a + b, 0);
        colspan.innerHTML = `${total.toFixed(2)}(${prices.length}件商品)`
    }


发表于 2022-10-14 16:28:14 回复(0)
function add(items) {
    let tbody = document.querySelector('tbody')
    items.forEach(el => {
        tbody.innerHTML += `<tr>
                                <td>${el.name}</td>
                                <td>${el.price.toFixed(2)}</td>
                                <td><a href="javascript:void(0);">删除</a></td>
                            </tr>`
    })
    bind()
    show()
}

function bind() {
    let as = document.querySelectorAll('a')
    as.forEach(el => {
        el.onclick = function() {
            el.parentElement.parentElement.remove()
            show()
        }
    })
}
 function show () {
     let tbody = document.querySelector('tbody')
     let tfoot = document.querySelector('tfoot')
     let trs = tbody.querySelectorAll('tr')
     let total = 0
     trs.forEach(tr => {
         total += parseFloat(tr.children[1].innerHTML)
     })
     tfoot.querySelector('td').innerHTML = `${total.toFixed(2)}(${trs.length}件商品)`
 }
bind()
本地可以过,这里过不了
发表于 2022-05-13 17:04:08 回复(0)
本地可以这里不行?
function add(items) {
    var tbody = document.querySelector('tbody');
    var tfoot = document.querySelector('tfoot');
    var total = parseFloat(tfoot.querySelector('td').innerHTML.split('(')[0]);
    items.forEach(el=>{
        console.log(total);
        total += parseFloat(el.price.toFixed(2));
        tbody.innerHTML +='<tr><td>'+el.name+'</td><td>'+el.price.toFixed(2)+'</td><td><a href="javascript:void(0);">删除</a></td></tr>';
    })
    tfoot.querySelector('td').innerHTML = total.toFixed(2) + '('+tbody.querySelectorAll('tr').length+'件商品)'
    bind();
}

function bind() {
    var tbody = document.querySelector('tbody');
    var tfoot = document.querySelector('tfoot');
    var total = parseFloat(tfoot.querySelector('td').innerHTML.split('(')[0]);
    var a = document.querySelectorAll('a');
    a.forEach(el=>{
        el.onclick=function(){
            total -= parseFloat(el.parentElement.parentElement.children[1].innerHTML);
            tfoot.querySelector('td').innerHTML = total.toFixed(2) + '('+(tbody.querySelectorAll('tr').length-1)+'件商品)';
            tbody.removeChild(el.parentElement.parentElement);
        }
    })
}
bind();


发表于 2022-02-16 15:11:48 回复(0)
就是过不了
function update() {
    let table = document.getElementById('jsTrolley')
    let tbody = table.getElementsByTagName('tbody')[0]
    let tfoot = table.getElementsByTagName('tfoot')[0]
    let sum = 0
    let count = 0
    let elements = tbody.getElementsByTagName("tr")
    for (const node of elements) {
        sum += parseFloat(node.children[1].innerText)
        count++
    }
    tfoot.getElementsByTagName('td')[0].innerHTML = `${(sum / count).toFixed(2)}(${count}件商品)`
}
function add(items) {
    let table = document.getElementById('jsTrolley')
    let tbody = table.getElementsByTagName('tbody')[0]
    let tfoot = table.getElementsByTagName('tfoot')[0]
    for (const item of items) {
        tbody.innerHTML += `<tr><td>${item.name}</td><td>${item.price.toFixed(2)}</td><td><a href="javascript:void(0);">删除</a></td></tr>`
    }
    update()
}

function bind() {
    let table = document.getElementById('jsTrolley')
    let tbody = table.getElementsByTagName('tbody')[0]
    let tfoot = table.getElementsByTagName('tfoot')[0]
    tbody.onclick = (evt) => {
        if (evt.target.nodeName != 'A') {
            return
        }
        evt.target.parentElement.parentElement.remove()
        update()
    }
}
bind()



发表于 2022-01-18 17:09:42 回复(0)
本地没问题,完全能实现,但是在这儿就不行了,就很奇怪~
function add(items) {
      let trs = jsTrolley.children[1]
      items.forEach(item => {
        let tr = document.createElement('tr')
        let td1 = document.createElement('td')
        td1.innerHTML = item.name
        let td2 = document.createElement('td')
        td2.innerHTML = item.price
        let td3 = document.createElement('td')
        let a = document.createElement('a')
        a.setAttribute('href''javascript:void(0)')
        a.innerHTML = '删除'
        td3.appendChild(a)
        tr.appendChild(td1)
        tr.appendChild(td2)
        tr.appendChild(td3)
        trs.appendChild(tr)
    })
      let trss = jsTrolley.children[1].children
      let total = jsTrolley.children[2].children[0].children[1]
      let totalPrice = 0
      for (let item of trss) {
        let td = item.children[1].innerHTML
        totalPrice += Number(td)
      }
      total.innerHTML = `${totalPrice.toFixed(2)}(${trss.length}件商品)`
    }
    function bind() {
      let trss = jsTrolley.children[1]
      let tagA = document.querySelectorAll('A')
      tagA.forEach(item => {
        item.onclick = function () {
          let tr = item.parentNode.parentNode
          trs.removeChild(tr)
          let trs = jsTrolley.children[1].children
          let total = jsTrolley.children[2].children[0].children[1]
          let totalPrice = 0
          for (let item of trs) {
            let td = item.children[1].innerHTML
            totalPrice += Number(td)
          }
          total.innerHTML = `${totalPrice.toFixed(2)}(${trs.length}件商品)`
        }
      })
    }

发表于 2021-07-13 17:00:10 回复(0)
// 自己在vscode上能输出true通过,怎么这里就过不了,离谱
function add(items) {
  let tbody = document.querySelector('tbody');
  items.forEach(item => {
    let tr = document.createElement('tr');
    let td1 = document.createElement('td');
    let td2 = document.createElement('td');
    let td3 = document.createElement('td')
    let a = document.createElement('a');
    a.href = 'javascript:void(0);';
    a.textContent = '删除';
    td3.append(a);
    
    td1.textContent = item.name;
    td2.textContent = item.price.toFixed(2);
    tr.appendChild(td1);
    tr.appendChild(td2);
    tr.appendChild(td3);

    tbody.appendChild(tr);
  })
  let tfootTd = document.querySelector('tfoot>tr>td');
  let tbodyTr = document.querySelectorAll('tbody>tr');
  let sumNum = tbodyTr.length;
  let tbodyPriceTd = document.querySelectorAll('tbody>tr>td');
  let sumPrice = 0;
  for (let i = 0; i < tbodyPriceTd.length; i++) {
    const td = tbodyPriceTd[i];
    let price = Number(td.textContent);
    sumPrice += price;
  }
  tfootTd.textContent = `${sumPrice}(${sumNum}件商品)`;
}

function bind() {
  let a = document.querySelectorAll('a');
  a.forEach(ele => {
    ele.addEventListener('click', (e) => {
      let tr = e.target.parentNode.parentNode;
      //console.log('e :>> ', e.target.parentNode.parentNode);
      tbody.removeChild(tr);
    })
  })
}

发表于 2021-06-22 09:41:32 回复(1)

var oJsTrolley = document.querySelector('#jsTrolley tbody')
function add(items) {
    var str = oJsTrolley.innerHTML
    items.forEach(item => {
        str += `<tr>
        <td>${item.name}</td>
    <td>${item.price.toFixed(2)}</td>
    <td><a href="javascript:void(0);">删除</a></td>
        </tr>`
    })
    oJsTrolley.innerHTML = str
    changeAllPrice() 
}

oJsTrolley.onclick = function(e){
    var e = e
    if(e.target.tagName === 'A'){
        bind(e)
    }
}

function changeAllPrice(){
    var oTr = oJsTrolley.getElementsByTagName('tr')
    var priceAll = 0
    for(var i = 0;i<oTr.length;i++){
        var price = oTr[i].getElementsByTagName('td')[1].innerHTML
        priceAll += Number(price)
    }
    priceAll = priceAll.toFixed(2)
    priceAll += '('+ oTr.length +'件商品)'
    
    var oFooter = document.querySelector('#jsTrolley tfoot td')
    oFooter.innerHTML = priceAll
}

function bind(e) {
    var e = e
    var target = e.target.parentNode.parentNode
    oJsTrolley.removeChild(target)
    changeAllPrice()
}

没明白错哪 自己测试可行
发表于 2021-06-07 10:15:17 回复(0)
本地能跑
       // 填写JavaScript
          const tbody = document.querySelector('#jsTrolley tbody');
  
  function add(items) {
     tbody.innerHTML += `<tr><td>${items.name}</td><td>${items.price}</td><td><a href="javascript:void(0);">删除</a></td></tr>`;
    bind()
  }

  function bind() {
    const del = document.querySelectorAll('#jsTrolley tbody tr td a');
    del.forEach(item => {
      item.onclick = function () {
        const tr = item.parentNode.parentNode;
        tr.parentNode.removeChild(tr);
      }
    })
  }


发表于 2023-12-22 21:02:18 回复(0)

🐤

    function add(items) {
        let table = document.getElementById('jsTrolley')
        let body = table.getElementsByTagName('tbody')
        items.forEach(item => {
            let tr = document.createElement('tr')
            tr.innerHTML = `<td>${item.name}</td><td>${item.price.toFixed(2)}</td><td><a href="javascript:void(0);">删除</a></td>`
            body.item(0).appendChild(tr)
        })
        bind()
        refreshTotal()
    }

    function bind() {
        let table = document.getElementById('jsTrolley')
        let body = table.getElementsByTagName('tbody')
        let trs = body.item(0).getElementsByTagName('tr')
        for (let i = 0; i < trs.length; i++)
            trs.item(i).getElementsByTagName('td').item(2).getElementsByTagName('a').item(0).onclick = function (e) {
                e.target.parentElement.parentElement.remove()
                refreshTotal()
            }

    }

    function refreshTotal(){
        let table = document.getElementById('jsTrolley')
        let body = table.getElementsByTagName('tbody')
        let bodyList = body.item(0).getElementsByTagName('tr')

        let foot = table.getElementsByTagName('tfoot')
        let td = foot.item(0).getElementsByTagName('tr').item(0).getElementsByTagName('td')

        let sum = 0
        for (let i = 0; i < bodyList.length; i++)
            sum += +bodyList.item(i).getElementsByTagName('td').item(1).innerText

        td.item(0).innerText = `${sum.toFixed(2)}(${bodyList.length}件商品)`
    }
发表于 2023-09-17 16:00:49 回复(0)
<!-- HTML模块为一个简化版的购物车,tbody为商品列表,tfoot为统计信息,系统会随机在列表中生成一些初始商品信息
1、请完成add函数,在列表后面显示items商品信息。参数items为{name: String, price: Number}组成的数组
2、请完成bind函数,点击每一行的删除按钮(包括通过add增加的行),从列表中删除对应行
3、请注意同步更新统计信息,价格保留小数点后两位
4、列表和统计信息格式请与HTML示例保持一致
5、不要直接手动修改HTML中的代码
6、不要使用第三方库 -->
<!DOCTYPE html>
<html>

<head>
    <meta charset="UTF-8">
    <style>
        /* 填写样式 */
        body,
        html {
            padding: 0;
            margin: 0;
            font-size: 14px;
            color: #000000;
        }

        table {
            border-collapse: collapse;
            width: 100%;
            table-layout: fixed;
        }

        thead {
            background: #3d444c;
            color: #ffffff;
        }

        td,
        th {
            border: 1px solid #e1e1e1;
            padding: 0;
            height: 30px;
            line-height: 30px;
            text-align: center;
        }
    </style>
</head>

<body>
    <!-- 填写标签 -->
    <table id="jsTrolley">
        <thead>
            <tr>
                <th>名称</th>
                <th>价格</th>
                <th>操作</th>
            </tr>
        </thead>
        <tbody>
            <tr>
                <td>产品1</td>
                <td>10.00</td>
                <td><a href="javascript:void(0);">删除</a></td>
            </tr>
            <tr>
                <td>产品2</td>
                <td>30.20</td>
                <td><a href="javascript:void(0);">删除</a></td>
            </tr>
            <tr>
                <td>产品3</td>
                <td>20.50</td>
                <td><a href="javascript:void(0);">删除</a></td>
            </tr>
        </tbody>
        <tfoot>
            <tr>
                <th>总计</th>
                <td colspan="2">60.70(3件商品)</td>
            </tr>
        </tfoot>
    </table>
    <script type="text/javascript">
        // 填写JavaScript
        let tableArr = []
        function add(items) {
            // console.log(document.querySelectorAll('tbody tr'));
            // 添加节点
            if (items) {
                for (let i = 0; i < items.length; i++) {
                    const tr = document.createElement('tr')
                    tr.innerHTML = `<td>${items[i].name}</td>
                    <td>${items[i].price.toFixed(2)}</td>
                    <td "><a href="javascript:void(0);">删除</a></td>`
                    document.querySelector('tbody').appendChild(tr)
                }
            }
            // 给新元素也添加还是删除功能
            Array.from((document.querySelectorAll('tbody a'))).forEach(item => {
                item.onclick = bind()
            });
            sum()
        }

        function bind() {
            return function (e) {
                // const deleteArr = Array.from(document.querySelectorAll('tbody tr td:nth-child(3) a'))
                console.log(e.target);
                e.target.parentNode.parentNode.parentNode.removeChild(e.target.parentNode.parentNode)
                sum()
            }
        }

        function sum() {
            // 重渲染总计
            let priceArr = Array.from(document.querySelectorAll('tbody tr td:nth-child(2)'))
            let sum = 0
            let num = 0
            priceArr.forEach(item => {
                sum += (+item.innerHTML)
            })
            num = priceArr.length
            document.querySelector('tfoot td').innerHTML = `${sum.toFixed(2)}(${num}件商品)`
        }

        Array.from((document.querySelectorAll('tbody a'))).forEach(item => {
            item.addEventListener('click', bind)
        });

    </script>
</body>

</html>
测试通过了

发表于 2023-08-16 10:13:32 回复(0)
本地是能跑的
function add(items) {
    let tbody = document.querySelector("tbody");
    let lis = [];
    let sum = 0;
    let existingTrs = [];
    tbody.querySelectorAll("tr").forEach(item => {
        existingTrs.push(`<tr>${item.innerHTML}</tr>`)
    })

    items.forEach(item => {
        sum = (sum*1000+item.price*1000)/1000;
        let li = `<tr><td>${item.name}</td><td>${item.price.toFixed(2)}</td><td><a href="javascript:void(0);">删除</a></td></tr>`
        lis.push(li);
    })
    let totalEle = document.querySelector("tfoot>tr>td");
    let total = (((totalEle.innerText.split("(")[0])*1000)+sum*1000)/1000;
    totalEle.innerText=total.toFixed(2) + "(" + (existingTrs.length + items.length) + "件商品)";
    tbody.innerHTML = existingTrs.concat(lis).join("");
    bind();
}

function bind() {
    let tbody = document.querySelector("tbody");
    let as = document.querySelectorAll("a")
    as.forEach(item => {
        item.onclick=function(e){
            if(e.target.innerText === "删除"){
                let tr = e.target.parentElement.parentElement;
                let tds = tr.children;
                let price = tds[1].innerText;
                let alltrs = tbody.children;
                let totalEle = document.querySelector("tfoot>tr>td");
                let total = ((((totalEle.innerText.split("(")[0]))*1000)-price*1000)/1000;
                tbody.removeChild(tr);
                totalEle.innerText = total.toFixed(2) + "(" + alltrs.length + "件商品)";
            }
        }
    })
}
发表于 2023-06-12 18:01:06 回复(0)
最后一道难题,且做且珍惜
function add(items) {
    let tbody = document.querySelector('tbody');
    for (let i = 0; i < items.length; i++) {
        let tr = document.createElement('tr');
        let td = document.createElement('td');
        td.innerHTML = items[i].name;
        tr.appendChild(td);
        td = document.createElement('td');
        td.innerHTML = items[i].price.toFixed(2);
        tr.appendChild(td);
        td = document.createElement('td');
        td.innerHTML = '<a href="javascript:void(0);">删除</a>'
        tr.appendChild(td);
        tbody.appendChild(tr);
    }


    let total = 0;
    let count = 0;
    Array.from(tbody.children).forEach((child) => {
        total += (child.children[1].innerText - 0);
        count++;
    })
    //更新总计价格和数量
    let tfoot = document.querySelector('tfoot');
    tfoot.children[0].children[1].innerHTML = `${total.toFixed(2)}(${count}件商品)`;
}
function bind() {
    //事件绑定在其父亲上,最后会通过冒泡触发
    let tbody = document.querySelector('tbody');
    tbody.onclick = function (e) {
        if (e.target.nodeName === 'A') {
            e.target.parentNode.parentNode.remove();
        }
        //进行视图更新
        let total = 0;
        let count = 0;
        Array.from(tbody.children).forEach((child) => {
            total += (child.children[1].innerText - 0);
            count++;
        })
        //更新总计价格和数量
        let tfoot = document.querySelector('tfoot');
        tfoot.children[0].children[1].innerHTML = `${total.toFixed(2)}(${count}件商品)`;
    }
}


发表于 2023-05-20 16:28:21 回复(0)
function add(items) {
  const { name, price } = items
  const tr = document.createElement('tr')
  tr.innerHTML = `<td>${name}</td>\n<td>${price}</td>\n<td><a href="javascript:void(0);">删除</a></td>`
  const tbody = document.querySelector('tbody')
  // 添加产品
  tbody.appendChild(tr)

  function getCount(){
    // 获取产品列表
    const itemsNum = Array.from(tbody.querySelectorAll('tr'))
    // 获取金额总数
    const priceSum = itemsNum.reduce((pre, current)=>{
      const price = Number(current.children[1].innerText)
      return pre += price
    }, 0)
    // 新增产品后修改总计信息
    const sumCell = document.querySelector('tfoot').querySelectorAll('td')
    sumCell[0].innerText = `${priceSum}(${itemsNum.length}件商品)`
  }
  Array.from(tbody.children).forEach(item=>{
    item.onclick = function (e) {
      bind(e, getCount)
    }
  })
  getCount()
}

function bind(e, fn) {
  const tbody = document.querySelector('tbody')
  tbody.removeChild(e.target.parentNode.parentNode)
  fn()
}
发表于 2023-05-12 17:03:45 回复(0)
function add(items) {
  const tBody = document.getElementByTagName('tbody')[0];
  const sumTd = document.querySelector('tfoot td');
    let fragment = document.createDocumentFragment();
    let totalPrice = parseFloat(sumTd.innerHTML); 
    items.forEach(curr => {
      let price = Number(Number(curr?.price).toFixed(2));
      totalPrice += price; 
      let vDom = document.createElement('tr');
      vDom.innerHTML = `<td>${curr?.name}</td><td>${price}</td><td><a href="javascript:void(0);">删除</a></td>`
      fragment.append(vDom);
    }) 
    tBody.append(fragment);
    console.log(typeof totalPrice)
    sumTd.innerHTML = `${totalPrice.toFixed(2)}(${tBody.children.length}件商品)`; 
}
function bind() {
    const tBody = document.querySelector('tbody');
     tBody.addEventListener('click', function(e){
    if(e.target.tagName.toLowerCase() === 'a') {
    let tarTr = e.target.parentNode.parentNode;
    let price = tarTr.querySelector(':nth-of-type(2)').innerText; 
    tarTr.remove();  // 删除了dom, 已经获取不到了
    let sumNum = this.children.length;   
    let totalprice = (parseFloat(sumTd.innerHTML) - price).toFixed(2);  
    sumTd.innerText = `${totalprice}(${sumNum}件商品)`; 
    }
 }, false);
}

本地是可以运行的,预计问题是查询dom用了querySelector , 题目中想让使用dom.getElementByTagName 获得类数组。
考察: 
1. 保留两位小数: num.toFixed(2); 返回两位小数的字符串
2. 创建节点: document.createElement(tagName); 
3. 删除节点:dom.removeChild(childNode); dom.remove(); 
***委派:通过e.target确定目标对象

发表于 2022-09-24 21:52:16 回复(0)
 <script>
    const tbody = document.querySelector('tbody')
    const tfoot = document.querySelector('tfoot')
    var items = [{ name: '1', price: 1.11 }, { name: '1', price: 1.11 }, { name: '1', price: 1.11 }, { name: '1', price: 1.11 },]
    function add() {
      tbody.innerHTML = ''
      tbody.innerHTML = items.map((item, index) => {
        return `
        <tr>
        <td>${item.name}</td>
        <td>${item.price.toFixed(2)}</td>
        <td><a href='javascript:void(0);'  data=id=${index}>删除</a></td>
        </tr>
        `
      }).join('')
      const total = items.reduce((prev, item) => prev + item.price, 0).toFixed(2)
      tfoot.innerHTML = `<tr>
        <th>总计</th>
        <td colspan="2">${total}(${tbody.children.length}件商品)</td>
      </tr>`

    }
    add(items)

    function bind() {
      tbody.addEventListener('click', e => {
        if (e.target.tagName === 'A') {
          items.splice(e.target.dataset.id, 1)
          add(items)
        }
      })
    }
    bind(items)

  </script>
发表于 2022-09-23 21:32:11 回复(0)
function add(items) {
    var tbody = document.querySelector("tbody");
    var str = "";
    items.forEach((item) => {
        str += `<tr>
            <td>${item.name}</td>
            <td>${item.price}</td>
            <td><a href="javascript:void(0);">删除</a></td>
        </tr>`;
    });
    tbody.innerHTML += str;
    count();
}

function bind() {
    var tbody = document.querySelector("tbody");
    var trs = Array.from(document.querySelectorAll("tbody tr"));
    trs.forEach((item) => {
        item.onclick = function (e) {
            if (e.target.innerHTML == "删除") {
                item.remove();
                count();
            }
        };
    });
}
function count() {
    var tfoot_td = document.querySelector("tfoot td");
    var sum = 0,
        num = 0;
    var tds = Array.from(
        document.querySelectorAll("tbody tr td:nth-child(2)")
    );
    tds.forEach((item) => {
        sum += item.innerHTML * 1;
    });
    sum = sum.toFixed(2);
    num = tds.length;
    tfoot_td.innerHTML = `${sum}(${num}件商品)`;
}
发表于 2022-08-19 16:20:25 回复(0)