循环结构和this和自定义属性

1 break与continue

  • continue 结束本次循环

  • break 结束整个循环

2. 双重for循环

如果循环体又是一个循环 只有把内侧循环走完,才会继续执行外侧循环
  • 二维数组

  • 双重for循环生成标签

3 JSON数据/object数据类型

  • object数据类型就是JSON数据,也叫对象

  • 对象/object/JSON数据:一组无序的 没有长度的数据 也是可以存储多个 可以存储任意数据类型

{
  属性名/key/键:属性值/value/值
}
注意:属性名 可加可不加引号
注意:数据和数据之间用逗号隔开

3. for-in

<script>
        // for-in  遍历对象
        var obj = {
            "name": "小候老师",
            age: 20,
            "sex": "男",
            isOn: true,
            a: null,
            b: undefined,
            c: [1, 2, 3, 4],
            d: {
                "skill": "第一阶段"
            },
            f: function () { } //函数  函数在对象里面  我们一般叫方法
        }
​
        // for(var 变量名 in 对象){ 循环体}
        // 注意  对象有几个数据就遍历几次  遍历完自动结束循环
        for (var i in obj) { // i 里面存储的是属性名 i = "name" i="age"  i="sex"
            // 如果属性名是一个变量  obj[变量名]
            console.log(obj[i])
        }
    </script>

4. this

4.1 为什么用this

<body>
   <div>盒子1</div>
   <div>盒子2</div>
   <div>盒子3</div>
   <div>盒子4</div>
   <div>盒子5</div>
   <script>
        var oDiv = document.getElementsByTagName("div");
        oDiv[0].onclick = function(){
            console.log(oDiv[0].innerHTML)
        }
        oDiv[1].onclick = function(){
            console.log(oDiv[1].innerHTML)
        }
​
        console.log(oDiv.length);//5
        // 通过for循环添加点击事件
        for(var i = 0;i<oDiv.length;i++){
            // 循环添加事件 事件不会立马执行 但是for循环执行完毕 
            // 点击盒子的时候  才会执行事件里面的代码  此时i的值是5
            oDiv[i].onclick = function(){
                console.log(i);//5
                console.log(oDiv[i]);//undefined  
            }
        }
        // i = 5
   </script>
</body>

3.2 this指向

  • this 这个的意思

    • 在不同的地方 this指向的内容不同 取决于当前函数被调用时所处的环境

    • 事件处理函数 : 标签.事件类型 = function() { 要做的事}

    • ==在事件处理函数中 ------ this指向触发事件的对象----点谁指向谁==

  • 基础使用

<button>按钮1</button> 
<script>
        var btn = document.getElementsByTagName("button")[0];
        // 事件处理函数this的指向----指当前触发事件的对象----点谁指向谁
        btn.onclick = function(){
            console.log(this)//指向button标签
        }=--=
    </script>
  • this的指向---练习

<body>
   <div>盒子1</div>
   <div>盒子2</div>
   <div>盒子3</div>
   <div>盒子4</div>
   <div>盒子5</div>
   <script>
        var oDiv = document.getElementsByTagName("div");
        oDiv[0].onclick = function(){
            console.log(oDiv[0].innerHTML)
        }
        oDiv[1].onclick = function(){
            console.log(oDiv[1].innerHTML)
        }
​
        console.log(oDiv.length);//5
        // 通过for循环添加点击事件
        for(var i = 0;i<oDiv.length;i++){
            // 循环添加事件 事件不会立马执行 但是for循环执行完毕 
            // 点击盒子的时候  才会执行事件里面的代码  此时i的值是5
            oDiv[i].onclick = function(){
                // console.log(i);//5
                // console.log(oDiv[i]);//undefined  
​
                // 利用this解决这个问题
                // 标签.innerHTML
                // this---当前触发事件的对象
                console.log(this)
                console.log(this.innerHTML)
            }
        }
        // i = 5
   </script>

4.3 开关效果

3.1.1 单组开发效果

  • 现象:一个事件里面有两种状态

  • 解决

    • 定义一个变量 用于标识当前的状态

    • 通过判断不同变量的状态 选择执行不同的逻辑

    • 当状态发生改变的时候 变量的值需要做改变

  <div></div>
    <script>
        var oDiv = document.getElementsByTagName("div")[0];
 
        var tag  = true;//true---200px  false-50px
        oDiv.onclick = function(){
            // oDiv.style.height = "200px";
            if(tag){ //开 200px
                oDiv.style.height = "200px";
                tag = false;
            }else{//关  50px
                oDiv.style.height = "50px";
                tag = true;
            }
        }
    </script>

4.1.2 多组开发效果(问题版)

<body>
    <div>盒子1</div>
    <div>盒子2</div>
    <div>盒子3</div>
    <div>盒子4</div>
    <div>盒子5</div>
    <script>
        var oDiv = document.getElementsByTagName("div");
        var tag = true;//true----200px   false--50px
        // 利用for循环添加点击事件
        for(var i = 0;i<oDiv.length;i++){
            oDiv[i].onclick = function(){
                // 通过for循环添加点击事件  在点击事件中无法拿到i的值  拿的永远是i最后一次值
                if(tag){
                   this.style.height = "200px";
                    tag = false;
                }else{
                   this.style.height = "50px";
                    tag = true
                }
            }
        }
​
        /*
             问题:公用了一个tag  交叉点击的时候  就出现了混乱
             解决:每个盒子都定义一个属于自己的tag值
        */ 
    </script>
    
</body>

4.4自定义属性

4.4.1什么是属性

  • 什么是属性:存在开始标签上 属性名=属性值 例如class="box" id="wrap"

    • 固有属性:系统给定的属性 例如 class id style href src

    • 自定义属性:程序员自己定义的属性

4.4.2设置和获取自定义属性

  • 如何设置和获取自定义属性

<body>
    <!-- class和id叫固有属性   a和b叫自定义属性 -->
    <div class="box" id="wrap" a="123" b="这是一个div标签"></div>
    <script>
        var oDiv = document.getElementsByTagName("div")[0];
        /*--------------如何获取自定义属性  标签.属性名----------------------*/
        
        //1.如果直接在标签上定义 可以在结构上看到  但是无法获取
        console.log(oDiv.a);//undefined
        console.log(oDiv.b);//undefined
​
       
        // 2.通过js添加属性:结构上看不到  但是可以在js中获取
        // 通过js设置自定义属性   标签.属性名  = 值
        oDiv.c = "456";
        console.log(oDiv.c);//456
    </script>
</body>

3.4.3自定义属性解决多组展开收起

  • 多组展开收起(解决)

<body>
    <div >盒子1</div>
    <div>盒子2</div>
    <div>盒子3</div>
    <div>盒子4</div>
    <div>盒子5</div>
    <script>
        var oDiv = document.getElementsByTagName("div");
        // var tag = true;//true----200px   false--50px
        // 利用for循环添加点击事件
        for (var i = 0; i < oDiv.length; i++) {
            oDiv[i].tag = true;//给每个盒子设置自定义属性tag=true
            oDiv[i].onclick = function () {
                console.log(this.tag)//点击谁  就获取谁的tag属性
                // 通过for循环添加点击事件  在点击事件中无法拿到i的值  拿的永远是i最后一次值
                if (this.tag) {
                    this.style.height = "200px";
                    this.tag = false;
                } else {
                    this.style.height = "50px";
                    this.tag = true;
                }
            }
        }
        /*
             问题:公用了一个tag  交叉点击的时候  就出现了混乱
             解决:每个盒子都定义一个属于自己的tag值
        */
    </script>
</body>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值