JS完美收官 localstorage中遇到的知识点
1、运算符 && 的优先级比 = 等号高
这是什么错误?
Uncaught SyntaxError: Invalid left-hand side in assignment
<div></div> <script> var last = document.getElementsByTagName('div')[0]; last && last.className = 'active'; // Uncaught SyntaxError: Invalid left-hand side in assignment console.dir(last.className); </script>
这是一个语法的错误
1. last && last.className 运算符 && 的优先级,比=等号要高 = 'active'
2. 所以先这样运算 last && last.className
再赋值运算 = 'active'
3. last && last.className 运算完是空字符串,空字符串再赋值 className 当然会报错
last && ( last.className = 'active' ) 所以要加一个括号。提升优先级
<div></div> <script> var last = document.getElementsByTagName('div')[0]; last && (last.className = 'active'); console.dir(last.className); // active </script>
2、选项卡
逻辑
1. 先让 last.className 设置为空,
所以如果 last 是 true 把 last.className 设置为空,如果 last.className 是 false 还设置为空
2. 再让 last.className 等于active
3. 最后把当前点击的 span 对象赋值给 last,下一次点击的时候是上一个对象
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>选项卡</title> <style> .color{ width:300px;height:26px;color:#333;font-weight:bold; position:absolute;top:50%;left:50%;margin-left:-150px;margin-top:-100px; } .color span{ display:inline-block; width:54px;height:26px;line-height:26px;text-align:center; color:#666;font-size:12px; border:1px solid #ddd;margin-right:10px;cursor:pointer;box-sizing:border-box; } .color span.active{ border:2px solid #b4a078;line-height:24px; } </style> </head> <body> <div class="color"> <span>粉色</span> <span>蓝色</span> <span>黄色</span> <span>绿色</span> </div> <script> var product = document.getElementsByTagName('div')[0]; var spans = product.getElementsByTagName('span'); var last = null; for(var i = 0; i < spans.length; i++){ spans[i].onclick = function(){ last && (last.className = ''); this.className = 'active'; last = this; // 把当前点击的span对象赋值给last,下一次点击的时候是上一个对象 } } </script> </body> </html>
注意一下:
last && ( last.className = '' ); 不加括号点击会会报错
Uncaught TypeError: Cannot set properties of null (setting 'className')
意思是 last 元素是 null 不能设置这个元素,因为上面声明的时候就是 null
点击选中的颜色后,再点击一次取消选中,下面是我自己写的代码
var product = document.getElementsByTagName('div')[0]; var spans = product.getElementsByTagName('span'); var last = null; for(var i = 0; i < spans.length; i++){ spans[i].onclick = function(){ if(this != last){ last && (last.className = ''); this.className = 'active'; last = this; }else{ this.className = ''; last = null; } } }
陈老师讲的简洁高效
var product = document.getElementsByTagName('div')[0]; var spans = product.getElementsByTagName('span'); var last = null; for(var i = 0; i < spans.length; i++){ spans[i].onclick = function(){ last && last!=this && (last.className = ''); // 这句的意思主要是把last.className设置为空,就是取消掉className // 什么时候取消呢? // 1.last 这个不说了 // 2.last!=this 意思是当前的last不等于,当前的点击的this, // 就是说上一个和当前的不一样,我们才会清掉className(ast.className = '') // 判断this.className有值给一个空,否则赋值active,就是第一次点击的时候 this.className = this.className ? '' : 'active'; last = this; } }
3、dataset属性
获取属性
<div id="expense" data-drink="coffee" data-food="sushi" data-meal="lunch" >¥20.12</div> <script> var obox = document.getElementById('expense'); console.log(obox.dataset); // DOMStringMap {drink: 'coffee', food: 'sushi', meal: 'lunch'} console.log(obox.dataset.drink); // coffee console.log(obox.dataset.food); // sushi console.log(obox.dataset.meal); // lunch </script>
添加属性
<div id="expense" data-drink="coffee" data-food="sushi" data-meal="lunch">¥20.12</div> <script> var obox = document.getElementById('expense'); obox.dataset.name = '南极'; console.log( obox.dataset ); // DOMStringMap {drink: 'coffee', food: 'sushi', meal: 'lunch', name: '南极人'} </script>
页面元素也添加了属性 <div id="expense" data-drink="coffee" data-food="sushi" data-meal="lunch" data-name="南极人">¥20.12</div>
项目中的用法
<span data-id="10001">粉色</span> <script> var oSpan = document.getElementsByTagName('span')[0]; console.log(oSpan.dataset.id); // 10001 oSpan.dataset.name = '南极人'; // <span data-id="10001" data-name="南极人">粉色</span> </script>
4、拼接图片名
图片命名 img_01-1.png ,
01 代表第一行的商品,后面的 -1 代表第一行第一张图片,一定要加括号,不加括号变成字符串了
var n = 0, index = 0; console.log('images/img_0' +(n+1)+ '-' +(index+1)+ '.png'); // images/img_01-1.png console.log('images/img_0' + n+1 + '-' + index+1 + '.png'); // images/img_001-01.png
5、反向思维
正向思维
<button style="height:50px;padding:0 20px;background:#cb4a61;color:#fff;cursor:pointer;border:none;outline:none;">加入购物车</button> <script> var btn = document.getElementsByTagName('button')[0]; var colorValue = ''; btn.onclick = function(){ if(colorValue){ // 加入购物车代码... }else{ alert('请选择商品颜色') } } </script>
正向的思维的伪代码
if(有颜色 && 有数量){ // 加入购物车... }else{ alert() }
反向思维的写发
<button style="height:50px;padding:0 20px;background:#cb4a61;color:#fff;cursor:pointer;border:none;outline:none;">加入购物车</button> <script> var btn = document.getElementsByTagName('button')[0]; var colorValue = ''; btn.onclick = function(){ // 反向思维 if(!colorValue){ alert('请选择商品颜色'); return; // 这里必须有 return 不然接着往下执行了 } document.write('执行购物车代码~~~~'); // 这行不会被执行 } </script>
6、selectDate对象赋值后本地存储
<span data-id="10001">粉色</span> 每一个商品的 data-id 就对应一个商品,这个 id 号就像身份证一样是唯一的不会重复
<span data-id="10001">粉色</span> <script> var selectData = {}; var oSpan = document.getElementsByTagName('span')[0], colorId = oSpan.dataset.id; var id = 10001, name = '打不翻的吸盘碗', colorValue = '粉色', price = '21.00', selectNum = '商品选的件数', imgSrc = 'images/img_01-1.png', time = new Date().getTime(); selectData[colorId] = { "id": colorId, "name": name, "color": colorValue, "price": price, "num": selectNum, "img": imgSrc, "time": new Date().getTime() } console.log(JSON.stringify(selectData)); // 储存的selectData对象,要转为字符串格式 localStorage.setItem('shoppingCart', JSON.stringify(selectData)); </script>
把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":时间戳,为了排序
}