Go to comments

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":时间戳,为了排序

}



Leave a comment 0 Comments.

Leave a Reply

换一张