1. 程式人生 > >前端學習第66天js高階

前端學習第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 {
            width: 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 {
            width: 200px;
            height: 200px;
            background-color: red;
        }
        .sub {
            width: 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)