老师,Js的几个功能怎么没实现?

老师,Js的几个功能怎么没实现?

  1. 通过键盘直接输入数字,鼠标失去焦点时,对应商品的总价随之变化 要怎么做呢?

  2. 将每一个的复选框都设置自定义属性‘check’为‘yes’。这一步是为什么呢?

    每一个复选框不是有checked的属性都设置成true了吗?为什么还要再加一个check属性?

<!doctype html>

<html>

<head>

<meta charset="utf-8"/>

<title>cart</title>

<link href="css/style.css" type="text/css" rel="stylesheet"/>

</head>

<body>

<!--header区域-->

<header>

<div class="logo"></div>

<div class="nav">

<a href="#" class="nav-item">课程</a>

<a href="#" class="nav-item nav-item_new">职业路径</a>

<a href="#" class="nav-item">实战</a>

<a href="#" class="nav-item">猿问</a>

<a href="#" class="nav-item">手记</a>

</div>

<div class="profile"> 

<a href="#" class="profile-item cart"></a>

<a href="#" class="profile-item message"></a>

<a href="#" class="profile-item ava"></a>

</div>

<div class="search">

<input type="text">

<a href="#" class="search_submit"></a>

</div>

</header>

<!--banner区域-->

<section class="banner">

<div class="wrap">

<div>我的购物车</div>

</div>

</section>

<!--商品结算区域-->

<section class="cart" id="cart">

<div class="wrap">

<div class="goods">

<table cellpadding="10px" rules="none">

<tr>

<td><input type="checkbox" class="checkboxAll" checked/>&nbsp;&nbsp;全选&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;商品名称</td>

<td>总价</td>

<td>单价</td>

<td>数量</td>

<td>操作</td>

</tr>

<tr>

<td><input type="checkbox" checked class="checkbox"/><img src="img/g1.jpg">&nbsp;&nbsp;<span>前端小白成长记</span></td>

<td>¥<span class="total_price">396</span></td>

<td>¥<span class="price">396</span></td>

<td><input type="button" value="-" class="substract"><input type="text" value="1" class="count"><input type="button" value="+" class="add"></td>

<td><div>删除</div></td>

</tr>

<tr>

<td><input type="checkbox" checked class="checkbox"/><img src="img/g2.jpg">&nbsp;&nbsp;<span>前端小白成长记</span></td>

<td>¥<span class="total_price">396</span></td>

<td>¥<span class="price">396</span></td>

<td><input type="button" value="-" class="substract"><input type="text" value="1" class="count"><input type="button" value="+" class="add"></td>

<td><div>删除</div></td>

</tr>

<tr>

<td><input type="checkbox" checked class="checkbox"/><img src="img/g1.jpg">&nbsp;&nbsp;<span>前端小白成长记</span></td>

<td>¥<span class="total_price">396</span></td>

<td>¥<span class="price">396</span></td>

<td><input type="button" value="-" class="substract"><input type="text" value="1" class="count"><input type="button" value="+" class="add"></td>

<td><div>删除</div></td>

</tr>

<tr>

<td><input type="checkbox" checked class="checkbox"/><img src="img/g1.jpg">&nbsp;&nbsp;<span>前端小白成长记</span></td>

<td>¥<span class="total_price">396</span></td>

<td>¥<span class="price">396</span></td>

<td><input type="button" value="-" class="substract"><input type="text" value="1" class="count"><input type="button" value="+" class="add"></td>

<td><div>删除</div></td>

</tr>

</table>

<div class="account">

<button>去结算</button>

<p>应付金额:<span>¥&nbsp;<span><span class="payable">1584</span></p>

</div>

</div>

</section>

<!--footer区域-->

<footer>

<div class="wrap">

<div class="link">

<a href="#" class="link-item">网站首页</a>

<a href="#" class="link-item">企业合作</a>

<a href="#" class="link-item">人才招聘</a>

<a href="#" class="link-item">联系我们</a>

<a href="#" class="link-item">讲师招募</a>

<a href="#" class="link-item">常见问题</a>

<a href="#" class="link-item">意见反馈</a>

<a href="#" class="link-item">慕课大学</a>

<a href="#" class="link-item">友情链接</a>

</div>

<div class="copy">

Copyright &copy; 2017 imooc.com All Rights Reserved | 京ICP备 13046642号-2

</div>

<div class="share">

<a href="#" class="share-item share-item_wx">

<div class="code"></div>

</a>

<a href="#" class="share-item share-item_wb"></a>

<a href="#" class="share-item share-item_qq"></a>

</div>

</div>

</footer>


<script src="js/cart.js"></script>

</body>

</html>

*{

margin:0;

padding:0;

}

a{

text-decoration:none;

}


/*header区域*/

header{

width:100%;

background-color:#010101;

height:60px; 

}

header .logo{

width:128px;

height:38px;

background:url(../img/logo.png) no-repeat center;

float:left;

margin:11px 20px;

}

header .nav{

float:left;

height:100%;

}

header .nav .nav-item{

display:block;

float:left;

height:60px;

line-height:60px;

padding:0 25px;

color:white;

font-size:15px;

}

header .nav .nav-item:hover{

background-color:#363c41; 

}

header .nav .nav-item_new{

background:#363c41 url(../img/icon-new.png) no-repeat 84px 10px;

}

header .search{

float:right;

padding-right:25px;

position:relative;

margin:11px 25px;

height:38px;

}

header .search input{

width:242px;

border:none;

height:38px;

line-height:38px;

outline:none;

border-bottom:1px solid #363c41;

background-color:#010101; 

}

header .search:before{

content:'前端入门';

display:block;

width:72px;

height:30px;

line-height:30px;

text-align:center;

background-color:#363c41;

color:#999;

font-size:13px;

position:absolute;

}

header .search .search_submit{

display:block;

position:absolute;

right:50px;

top:4px;

width:22px;

height:22px;

background-position:0 0;

background-image:url(../img/icon-1-sprite_w22.png);

}

header .profile{

float:right;

}

header .profile .profile-item{

display:block;

float:left;

width:60px;

height:60px;

position:relative;

}

header .profile .cart:before,

header .profile .message:before{

content:'';

display:block;

position:absolute;

width:22px;

height:22px;

top:19px;

left:19px;

background-image:url(../img/icon-1-sprite_w22.png);

}

header .profile .cart:before{

background-position:0 -22px;

}

header .profile .message:before{

background-position:0 -44px;

}

header .profile .ava{

width:36px;

height:36px;

margin:12px;

background:url(../img/ava.jpg) no-repeat center;

background-size:cover;

border-radius:50%;

}


/*banner区域*/

section.banner{

height:160px;

width:100%;

background:url(../img/cart-header-bg.jpg);

}

section.banner .wrap{

width:1100px;

margin:0 auto;

position:relative;

}

section.banner .wrap div{

font-size:28px;

position:absolute;

top:40px;

}


/*商品结算区域*/

section.cart{

height:590px;

}

section.cart .wrap{

width:1102px;

margin:0 auto;

}

section.cart .wrap .goods{

width:1100px;

height:532px;

box-shadow:0 0 8px #ccc;

position:relative;

top:-58px;

}

section.cart table{

width:100%;

}

section.cart table tr{

height:118px;


}

section.cart table tr:first-child{

height:58px;

width:100%;

background:#ebebeb;

line-height:58px;

color:#6d6d6d;

}

section.cart table tr td{

border-bottom:1px solid #ccc;

}

section.cart table tr td:first-child{

width:470px;

}

section.cart table tr td:nth-child(2){

width:138px;

}

section.cart table tr td:first-child input{

margin-left:20px;

vertical-align:middle;

}

section.cart table tr td:first-child .checkbox{

position:relative;

top:-40px;

}

section.cart table tr td:first-child span{

position:relative;

top:-60px;

font-size:19px;

color:#999;

}

section.cart table tr:not(:first-child) td:nth-child(2),

section.cart table tr:not(:first-child) td:nth-child(3){

color:#999;

font-size:18px;

}

section.cart table tr td:nth-child(4) input:nth-child(2){

display:inline-block;

width:60px;

height:22px;

border-radius:0;

margin:0 6px;

text-indent:6px;

}

section.cart table tr td:nth-child(4) input:nth-child(1),

section.cart table tr td:nth-child(4) input:nth-child(3):hover{

cursor:pointer;

}

section.cart table tr td:nth-child(5){

width:104px;

}

section.cart table tr td img{

width:160px;

height:90px;

margin-left:30px;

position:relative;

top:4px;

}

section.cart .wrap .account{

width:1100px;

height:50px;

border:1px solid #ddd;

margin-top:24px;

}

section.cart .wrap .account p{

float:right;

line-height:50px;

color:#999;

font-size:14px;

}

section.cart .wrap .account p span{

font-size:22px;

color:red;

}

section.cart .wrap .account button{

float:right;

border-radius:0;

height:50px;

width:120px;

background:red;

border:none;

color:#fff;

text-align:center;

font-size:18px;

margin-left:20px;

}

section.cart .wrap .account button:hover{

cursor:pointer;

}


/*footer区域*/

footer{

background-color:#010101;

height:90px;

width:100%;

}

footer .wrap{

width:1100px;

margin:0 auto;

position:relative;

}

footer .link{

width:800px;

line-height:12px;

height:12px;

padding:30px 0 16px 0;

}

footer .link .link-item{

display:inline-block;

margin-right:30px;

float:left;

color:#959aa0;

font-size:14px;

}

footer .link .link-item:hover{

color:#fff;

}

footer .copy{

width:800px;

height:12px;

line-height:12px;

color:#666;

font-size:12px;

}

footer .share{

position:absolute;

width:150px;

height:34px;

right:0;

top:28px;

}

footer .share .share-item{

float:left;

display:inline-block;

margin-left:13px;

width:34px;

height:34px;

background:url(../img/footer-sprite.png);

}

footer .share .share-item:hover{

background:

}

footer .share .share-item_wx{

background-position:0 -279px;

position:relative;

}

footer .share .share-item_wx .code{

height:220px;

width:200px;

background:url(../img/footer-sprite.png) no-repeat 0 0;

position:absolute;

top:-220px;

left:-70px;

display:none;

}

footer .share .share-item_wx:hover .code{

display:block;

}

footer .share .share-item_wb{

background-position:0 -320px;

}

footer .share .share-item_qq{

background-position:0 -363px;

}

var cart=document.querySelector('#cart');

var cartElem={

checkboxAll:cart.querySelector('.checkboxAll'), //全选框

checkboxes:cart.querySelectorAll('.checkbox'), //复选框 们

totalPrices:cart.querySelectorAll('.total_price'), //总价 们

prices:cart.querySelectorAll('.price'), //单价 们

substract:cart.querySelectorAll('.substract'), //减 们

add:cart.querySelectorAll('.add'), //加 们

counts:cart.querySelectorAll('.count'), //数量 们

payable:cart.querySelector('.payable') //结算价格

}

console.log(cartElem);


//点击加、减改变数量

//定义遍历函数

function each(array,fn){

for(var i=0;i<array.length;i++){

fn(i,array[i]);

}

}

//加

each(cartElem.add,function(index,elem){

elem.onclick=function(){

cartElem.counts[index].value=operation.add(cartElem.counts[index].value);

totalPrice(index);

}

})

//减 值为1时不再减

each(cartElem.substract,function(index,elem){

elem.onclick=function(){

if(cartElem.counts[index].value<=1){ 

return;

}else{

cartElem.counts[index].value=operation.substract(cartElem.counts[index].value);

totalPrice(index);

}

}

})

//通过键盘直接输入数字,鼠标失去焦点时,对应商品的总价随之变化

each(cartElem.totalPrices,function(index,elem){

elem.onblur=function(){

cartElem.counts[index].value=onkeypress()

totalPrice(index);

}

})


//更新总价

function totalPrice(index){

cartElem.totalPrices[index].innerHTML=cartElem.prices[index].innerHTML*cartElem.counts[index].value;

}


//更新结算价格

function payPrice(){

var pay=0;

for(var i=0;i<cartElem.totalPrices.length;i++){

pay+= +cartElem.totalPrices[i].innerHTML;

}

cartElem.payable.innerHTML=pay;

}


//加、减运算

var operation={

add:function(num){

return +num+1;

},

substract:function(num){

return num-1;

}

}

//点击键盘输入数量

document.onkeypress=function(event){

return event.keyCode;

}


/*全选框复选框需求:

页面刚加载进来时,为全选状态,单击全选按钮,切换全选/全不选状态

在所有的商品中,有一条商品处于未选中状态,全选按钮就处于未选中状态;

当所有的商品都为选中状态时,全选按钮要为选中状态

只有当该条商品为选中状态时,数量和选中状态的变化会时刻影响结算栏中的应付金额


做法:

 1.下面4个复选框按钮的逻辑:

(1)定义一个方法,如checkbox()。在方法中添加以下内容:

 获取下面商品区复选框的集合checks(也就是下面四个),

 对集合进行for循环遍历,把每一个复选框的checked的属性都设置成true,

 将每一个的复选框都设置自定义属性‘check’为‘yes’。

 给全选按钮设置all属性为yes。

(2)对商品区的每一个复选框做点击事件,

 判断条件,如果当前复选框的‘check属性值为‘yes’,就把属性值变为‘no’,否则属性值就是‘yes’。

(3)定义一个arr数组,对商品区的复选框进行for循环,

 将每一个获取了‘check’属性的复选框推入arr数组中。

(4)进行if判断,检测arr数组里面是否有‘no’值,

 如果有,就把全选的按钮的checked设置false,如果没有‘no’值,就把全选按钮的checked属性设置为true。

(5)最后调用总价的方法,重新计算总价。

 2.全选按钮的逻辑:

 对全选按钮做点击事件,

 获取在之前设置check方法中给全选按钮设置的all属性(开始yes,是都勾选状态)。

 如果为no,就调用checkbox方法,将所有的都勾选上。

 如果为yes,就循环遍历所有按钮,将checked属性设置为false,将设置的check属性设置为no,将全选按钮的all属性设置为no。*/


//复选框及其与全选按钮的交互

function checkbox(){

for(var i=0;i<cartElem.checkboxes.length;i++){

cartElem.checkboxes[i].checked='true';

cartElem.checkboxes[i].setAttribute('check','yes');

cartElem.checkboxAll.checked='true';

cartElem.checkboxAll.setAttribute('all','yes');

cartElem.checkboxes[i].onclick=function(){ 

if(this.getAttribute('check')=='yes'){ //单击复选框按钮切换选中/不选状态

this.setAttribute('check','no');

}else{

this.setAttribute('check','yes');

}

//根据复选框状态设置全选按钮状态

var arr=[];

for(var i=0;i<cartElem.checkboxes.length;i++){

arr.push(cartElem.checkboxes[i].getAttribute('check'));

}

console.log(arr);

if(arr.indexOf('no')==-1){

cartElem.checkboxAll.checked='true';

cartElem.checkboxAll.setAttribute('all','yes');

}else{

cartElem.checkboxAll.checked='false';

cartElem.checkboxAll.setAttribute('all','no');

}

}

}

}

checkbox();

payPrice();

//全选按钮点击事件

cartElem.checkboxAll.onclick=function(){

if(this.getAttribute('all')=='no'){

checkbox();

}else{

for(var i=0;i<cartElem.checkboxes.length;i++){

cartElem.checkboxes[i].checked='false';

cartElem.checkboxes[i].setAttribute('check','no');

this.setAttribute('all','no');

}

}

}


正在回答

登陆购买课程后可参与讨论,去登陆

2回答

用可以用复选框自带的checked属性判断全选按钮状态的,在这只是做一个标记而已。如下修改:

http://img1.sycdn.imooc.com//climg/5c3404910001642b08710330.jpg

自己测试下。

  • 小章鱼丸 提问者 #1
    好的,老师。还想问下这里function checkbox(){ for(var i=0;i<cartElem.checkboxes.length;i++){ cartElem.checkboxes[i].checked='true'; cartElem.checkboxes[i].setAttribute('check','yes'); cartElem.checkboxAll.checked='true';遍历的时候这个设置属性为true也是不要加引号吗?一般什么情况加引号什么情况不加引号?
    2019-01-08 10:20:16
  • 好帮手慕星星 回复 提问者 小章鱼丸 #2
    checked属性值是布尔值,如果加引号就变成了字符串,从而不起作用。所以设置值的时候要看这个属性的值是什么类型的,再进行设置就会避免问题。
    2019-01-08 10:39:24
好帮手慕星星 2019-01-07 17:02:28

你好,

1、给商品中每个复选框添加check属性是为了判断全选按钮的状态的,将商品中复选框check属性放进一个数组中,如果这个数组中没有no的时候,说明复选框是全部选中的状态,那么就需要设置全选框选中,否则相反。并且代码中设置true和false的时候有问题,这两个值是不需要添加引号的:

http://img1.sycdn.imooc.com//climg/5c330dbd0001eddb08800283.jpg

http://img1.sycdn.imooc.com//climg/5c330dd00001a5c810540364.jpg

2、需要在各个事件中调用总价的计算,才能更改应付金额:

http://img1.sycdn.imooc.com//climg/5c330f0b0001a4f612610315.jpg

http://img1.sycdn.imooc.com//climg/5c330f230001c2de13340413.jpg

http://img1.sycdn.imooc.com//climg/5c330f5e0001d25712190903.jpg

http://img1.sycdn.imooc.com//climg/5c330f690001888e09970477.jpg

总价计算中需要修改,只有前面复选框选中的时候,才会计算应付金额,所以需要添加判断:

http://img1.sycdn.imooc.com//climg/5c330fae000167d109560362.jpg

3、在输入框中输入,需要循环counts,如下:

http://img1.sycdn.imooc.com//climg/5c33150b0001bf6010270248.jpg

自己如果实现不了,可以先输出试一试,根据结果再进行调试。要学会自己调试程序代码,简单的错误问题尽量避免,这样才能提升自己的能力。

自己修改测试下,祝学习愉快!

  • 提问者 小章鱼丸 #1
    谢谢老师。第一个问题还是没太明白,那意思是用复选框自带的checked属性就没办法判断全选按钮的状态了吗?用复选框自带的checked属性为什么没法判断全选按钮的状态?
    2019-01-07 21:49:32
问题已解决,确定采纳
还有疑问,暂不采纳

恭喜解决一个难题,获得1积分~

来为老师/同学的回答评分吧

0 星
组件化思想开发电商网页 18版
  • 参与学习           人
  • 提交作业       467    份
  • 解答问题       4826    个

本路径带你通过系统学习HTML5、JavaScript、jQuery的进阶知识,不仅如此,还会学习如何利用组件化的思想来开发网页,知识点+案例,使得所学可以更好的得到实践。

了解课程
请稍等 ...
意见反馈 帮助中心 APP下载
官方微信

在线咨询

领取优惠

免费试听

领取大纲

扫描二维码,添加
你的专属老师