JS完美收官 localstorage 中遇到的知识点
1、运算符 && 的优先级比 = 等号高
这是什么错误?
Uncaught SyntaxError: Invalid left-hand side in assignment
05 | var last = document.getElementsByTagName( 'div' )[0]; |
07 | last && last.className = 'active' ; |
09 | console.dir(last.className); |
这是一个语法的错误
1. last && last.className 运算符 && 的优先级,比 = 等号要高 = 'active'
2. 所以先这样运算 last && last.className
再赋值运算 = 'active'
3. last && last.className 运算完是空字符串,空字符串再赋值 className 当然会报错
last && ( last.className = 'active' ) 所以要加一个括号,提升优先级
05 | var last = document.getElementsByTagName( 'div' )[0]; |
07 | last && (last.className = 'active' ); |
09 | console.dir(last.className); |
2、选项卡
逻辑
1. 先让 last.className 设置为空,
所以如果 last 是 true 把 last.className 设置为空,如果 last.className 是 false 还设置为空
2. 再让 last.className 等于active
3. 最后把当前点击的 span 对象赋值给 last,下一次点击的时候是上一个对象
08 | width:300px;height:26px;color: #333;font-weight:bold; |
09 | position:absolute;top:50%;left:50%;margin-left:-150px;margin-top:-100px; |
13 | width:54px;height:26px;line-height:26px;text-align:center; |
14 | color: #666;font-size:12px; |
15 | border:1px solid #ddd;margin-right:10px;cursor:pointer;box-sizing:border-box; |
18 | border:2px solid #b4a078;line-height:24px; |
33 | var product = document.getElementsByTagName( 'div' )[0]; |
34 | var spans = product.getElementsByTagName( 'span' ); |
38 | for ( var i = 0; i < spans.length; i++){ |
39 | spans[i].onclick = function (){ |
40 | last && (last.className = '' ); |
41 | this .className = 'active' ; |
注意一下:
last && ( last.className = '' ) 不加括号点击会会报错
Uncaught TypeError: Cannot set properties of null (setting 'className')
意思是 last 元素是 null 不能设置这个元素,因为上面声明的时候就是 null
点击选中的颜色后,再点击一次取消选中,下面是我自己写的代码
01 | var product = document.getElementsByTagName( 'div' )[0]; |
02 | var spans = product.getElementsByTagName( 'span' ); |
06 | for ( var i = 0; i < spans.length; i++){ |
07 | spans[i].onclick = function (){ |
09 | last && (last.className = '' ); |
10 | this .className = 'active' ; |
陈老师讲的简洁高效
01 | var product = document.getElementsByTagName( 'div' )[0]; |
02 | var spans = product.getElementsByTagName( 'span' ); |
06 | for ( var i = 0; i < spans.length; i++){ |
08 | spans[i].onclick = function (){ |
10 | last && last!= this && (last.className = '' ); |
18 | this .className = this .className ? '' : 'active' ; |
3、dataset 属性
获取属性
10 | var obox = document.getElementById( 'expense' ); |
12 | console.log(obox.dataset); |
13 | console.log(obox.dataset.drink); |
14 | console.log(obox.dataset.food); |
15 | console.log(obox.dataset.meal); |
添加属性
01 | <div id= "expense" data-drink= "coffee" data-food= "sushi" data-meal= "lunch" >¥20.12</div> |
05 | var obox = document.getElementById( 'expense' ); |
07 | obox.dataset.name = '南极' ; |
09 | console.log( obox.dataset ); |
页面元素也添加了属性 <div id="expense" data-drink="coffee" data-food="sushi" data-meal="lunch" data-name="南极人">¥20.12</div>
项目中的用法
01 | <span data-id= "10001" >粉色</span> |
05 | var oSpan = document.getElementsByTagName( 'span' )[0]; |
07 | console.log(oSpan.dataset.id); |
09 | oSpan.dataset.name = '南极人' ; |
4、拼接图片名
图片命名 img_01-1.png ,
01 代表第一行的商品,后面的 -1 代表第一行第一张图片,一定要加括号,不加括号变成字符串了
4 | console.log( 'images/img_0' +(n+1)+ '-' +(index+1)+ '.png' ); |
6 | console.log( 'images/img_0' + n+1 + '-' + index+1 + '.png' ); |
5、反向思维
正向思维
01 | <button style= "height:50px;padding:0 20px;background:#cb4a61;color:#fff;cursor:pointer;border:none;outline:none;" >加入购物车</button> |
05 | var btn = document.getElementsByTagName( 'button' )[0]; |
09 | btn.onclick = function (){ |
正向的思维的伪代码
反向思维的写发
01 | <button style= "height:50px;padding:0 20px;background:#cb4a61;color:#fff;cursor:pointer;border:none;outline:none;" >加入购物车</button> |
05 | var btn = document.getElementsByTagName( 'button' )[0]; |
09 | btn.onclick = function (){ |
15 | document.write( '执行购物车代码~~~~' ); |
6、selectDate 对象赋值后本地存储
<span data-id="10001">粉色</span> 每一个商品的 data-id 就对应一个商品,这个 id 号就像身份证一样是唯一的不会重复
01 | <span data-id= "10001" >粉色</span> |
07 | var oSpan = document.getElementsByTagName( 'span' )[0], |
08 | colorId = oSpan.dataset.id; |
15 | imgSrc = 'images/img_01-1.png' , |
16 | time = new Date().getTime(); |
18 | selectData[colorId] = { |
25 | "time" : new Date().getTime() |
28 | console.log(JSON.stringify(selectData)); |
30 | localStorage.setItem( 'shoppingCart' , JSON.stringify(selectData)); |
把id 10001当做key,这就是一条数据,
"10001":{
"id":"10001",
"name","打不翻的吸盘碗",
...
},
"10002":{
"id":"10002",
"name","打不翻的吸盘碗",
...
}
selectData[colorId] = {
"id":"10001",
"name":"打不翻的吸盘碗",
"color":"粉色",
"price":"21.00",
"num":6 商品选的件数,
"img":"images/img_01-1.png",
"time":时间戳,为了排序
}