前端学习第66天js高级

一.对象使用的高级

1,对象的key为字符串类型, value为任意类型

```js
var obj = {
       name: "obj"
}
// 删除
delete obj.name
// 添加
obj.age = 18  // 如果age的key已存在就是修改值, 不存在就是添加键值对, 添加的key任意
// 注: 获取的页面元素(标签对象)也可以任意添加/删除属性
```

2, 对象的属性可以任意添加与删除

``js
var obj = {
       name: "obj"
}
// 删除
delete obj.name
// 添加
obj.age = 18  // 如果age的key已存在就是修改值, 不存在就是添加键值对, 添加的key任意
// 注: 获取的页面元素(标签对象)也可以任意添加/删除属性
```

二,.页面标签全局属性操作

```js
ele.getAttribute("alert");
// 获取页面标签ele的alert全局属性的值, 如果没有该全局属性值为null

ele.setAttribute("attr_key", "attr_value");
// 页面标签ele已有该全局属性,就是修改值, 没有就是添加该全局属性并赋相应值
// 注: 一般应用场景, 结合css的属性选择器完成样式修改
```

三,事件

1,事件的绑定和取消

```js
// 第一种
box.onclick = function(){}
// 只能绑定一个实现体, 如果有多次绑定, 保留最后一次
// box.onclick = null来取消事件的绑定

// 第二种
var fn = function() {}
box.addEventListener('click', fn)
// 能绑定多个实现体, 如果有多次绑定, 按顺序依次执行
// box.removerEventListener('click', fn)来取消事件的绑定
// 了解: 第三个参数决定冒泡顺序(子父级谁先相应事件)
```
<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">
    <title>事件的绑定与取消</title>
    <style>
        .box {
             100px;
            height: 100px;
            background-color: orange;
            border-radius: 50%;
        }
    </style>
</head>
<body>
<div class="box"></div>
<div class="box"></div>
<div class="box"></div>
<div class="begin">开始</div>
<div class="event_on1">事件的绑定1</div>
<div class="event_on2">事件的绑定2</div>
</body>
<script>
    // 每一个box点击都会toggle颜色, 当颜色都变成黑色, 取消所有点击事件,
    // 点击开始, 重新获得点击事件(所有状态应该重置)

    var beginBtn = document.querySelector('.begin');
    var boxs = document.querySelectorAll('.box');

    // 定义一个count计算器,计黑的个数
    var count = 0;

    // 启动服务
    beginBtn.onclick = init;
    
    // 开始功能
    // function beginAction() {
    //     // 让所有box拥有点击事件
    // }
    // box点击切换颜色
    function toggleColor() {
        // console.log(this)
        if (this.style.backgroundColor == "orange") {
            this.style.backgroundColor = "black";
            count++;
        } else {
            this.style.backgroundColor = "orange";
            count--;
        }
        // 检测是否需要结束
        count == 3 && overAction();
    }
    // 结束功能, 取消所有box点击事件
    function overAction() {
        for (var i = 0; i < boxs.length; i++) {
             boxs[i].onclick = null;
        }
    }
    // 重置功能, 并让所有box拥有点击事件
    function init() {
        for (var i = 0; i < boxs.length; i++) {
            boxs[i].style.backgroundColor = "orange";
            boxs[i].onclick = toggleColor;
        }
        // 计算器重置
        count = 0;
    }
    // 启动服务
    // init();
</script>
<script>
    var event_on1 = document.querySelector('.event_on1');
    // 事件绑定的第一种方式
    event_on1.onclick = function () {
        console.log(1)
    };
    event_on1.onclick = function () {
        console.log(2)
    }

    // 事件绑定的第二种方式
    var event_on2 = document.querySelector('.event_on2');
    // 可以为一个元素绑定多个事件, 按绑定顺序依次执行
    event_on2.addEventListener('click', function () {
        console.log("a")
    });
    var action = function () {
        console.log("b")
    }
    event_on2.addEventListener('click', action);

    // 如何取消事件
    event_on2.removeEventListener('click', action)


</script>
</html>

2,事件对象

``js
// 系统回调事件函数时, 传递了一个 事件(event) 实参
// 如果要使用传递来的实参 事件(event), 定义接收的 形参 即可
box.onclick = function(ev){
    // 使用事件对象
    // 特殊按键 eg: ev.altKey: true | false
    // 鼠标触发点: ev.clientX | ev.clientY
    
    // 取消冒泡
    ev.cancelBubber = true;
    
    // 取消默认事件
    return false;
}
```
<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">
    <title>事件对象</title>
    <style>
        body {
            margin: 0;
        }
        .box {
            background-color: pink;
        }
        .sup {
             200px;
            height: 200px;
            background-color: red;
        }
        .sub {
             100px;
            height: 100px;
            background-color: orange;
        }
    </style>
</head>
<body>
    <div class="box">12345</div>

    <div class="sup">
        <div class="sub"></div>
    </div>

    <a href="https://www.baidu.com">只想相应点击事件</a>
</body>
<script>
    var box = document.querySelector('.box');
    // 事件的钩子函数, 系统回调时传递了一个值, 该值为事件对象
    box.onclick = function (ev) {  // 回调函数
        console.log(ev)
        // 特殊按键 altKey | shiftKey | ctrlKey
        console.log(ev.altKey)
        // 鼠标的点击点
        console.log(ev.clientX, ev.clientY)
    }
</script>
<script>
    var sup = document.querySelector('.sup');
    var sub = document.querySelector('.sub');

    // 事件默认有冒泡, 子级相应事件后,会将事件传递给父级,如果父级有相同事件,也会被激活, 最终传递给document
    sub.onclick = function (ev) {
        console.log(ev);
        // 取消冒泡, 当自身处理事件后, 该事件就处理完毕, 结束, 不再向上传递
        ev.cancelBubble = true;
        console.log("子级被点击了")
    };
    sup.onclick = function () {
        console.log("父级被点击了")
    };
    document.onclick = function () {
        console.log("文档被点击了")
    }
</script>
<script>
    // 默认事件
    var aBtn = document.querySelector('a');
    aBtn.onclick = function (ev) {
        ev.cancelBubble = true;
        console.log("a被点击了");
        // 手动转跳页面
        open('https://www.oldboyedu.com', '_self');
        // a标签默认会完成转跳, 如果取消默认事件
        return false;
    }

</script>
</html>

五,循环绑定之变量污染

本质原因:没有区分作用域,

解决方法:

1, 利用块级作用域解决

2, 利用块级作用域解决

3,利用闭包处理循环绑定

<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">
    <title>循环绑定</title>
</head>
<body>
<div class="box">0000000000000000001</div>
<div class="box">0000000000000000002</div>
<div class="box">0000000000000000003</div>
</body>
<script>
    var divs = document.querySelectorAll(".box");
    /* 存在污染
    for (var i = 0; i < divs.length; i++) {
        // i = 0 | 1 | 2 | 3
        // 循环绑定
        divs[i].onclick = function () {
            console.log("***", i)
        }
    }
    // i = 3
    console.log(">>>", i);
    */

    /* 利用块级作用域解决
    for (let i = 0; i < divs.length; i++) {
        // {i=0 <= i} {i=1 <= i} {i=2 <= i}
        // i = 3
        // 循环绑定
        divs[i].onclick = function () {
            console.log("***", i)
        }
    } // for运行结束, i=3会被销毁
    console.log(">>>", i)
    */

    // 利用标签的属性解决
    /*
    for (var i = 0; i < divs.length; i++) {
        divs[i].index = i;
        divs[i].onclick = function () {
            // console.log("###", i)
            console.log(this.index)
        }
    }
    */

    // 利用闭包处理循环绑定
    for (var i = 0; i < divs.length; i++) {
        (function () {
            var index = i;
            divs[index].onclick = function () {
                console.log("###", index)
            }
        })()
        /*
        (function (index) {
            divs[index].onclick = function () {
                console.log("###", index)
            }
        })(i)
         */
        /*
        (function (i) {
            divs[i].onclick = function () {
                console.log("###", i)
            }
        })(i)
原文地址:https://www.cnblogs.com/ye-hui/p/10152520.html