web -APIS(dom和BOM)


前言:js的基礎就是為了瀏覽器web端服務,所以有必要知道一下web端的api也就是接口,結合那個web-API的ppt來看。

image

  • dom :文檔對象模型(Document Object Model,簡稱 DOM),是 W3C 組織推薦的處理可擴展標記語言(HTML或者XML)的標准編程接口。

  • W3C 已經定義了一系列的 DOM 接口,通過這些 DOM 接口可以改變網頁的內容、結構和樣式。

image
image

  • dom 就是document文檔的意思,一個頁面就是一個文檔,里面的各個標簽,包括html和a標簽,這些都是它的元素,所有的標簽都是元素,image

getElentById獲取元素

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>getElentById獲取元素</title>

</head>

<body>
    <div id="time">2021-12-22</div>

    <script>
        // 1. 因為我們文檔頁面從上往下加載,所以先得有標簽,所以我們script寫到標簽的下面
        // 2. get 獲取 element元素by 通過 駝峰命名法
        // 3. 參數 id 是大小寫敏感的字符串,所以記得加 ''
        // 4. 返回的是一個元素對象
        const getElement = document.getElementById('time')

        console.log(getElement);
        // 查看標簽對象的類型 ,所有的標簽都是對象。
        console.log(typeof getElement); // object

        // 5.console.dir打印我們返回的元素對象 根號的查看里面的屬性和方法
        console.dir(getElement)
    </script>
</body>

</html>

getElementByTagName獲取某些元素

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>getElementByTagName獲取某些元素</title>
</head>

<body>
    <ul>
        <li>知否應是紅綠肥瘦</li>
        <li>知否應是紅綠肥瘦</li>
        <li>知否應是紅綠肥瘦</li>
        <li>知否應是紅綠肥瘦</li>
        <li>知否應是紅綠肥瘦</li>
    </ul>

    <ol id="ol">
        <li>聰明絕頂</li>
        <li>聰明絕頂</li>
        <li>聰明絕頂</li>
    </ol>

    <script>
        // 1.返回的是 獲取過來元素對象的集合 以偽數組的形式存儲的,它把八個li都給合在了一起
        const lis = document.getElementsByTagName('li')
        console.log(lis);
        console.log(lis[0]);
        // 2. 我們想要依次打印里面的元素對象我們可以采用遍歷的方式

        for (var i = 0; i < lis.length; i++) {
            console.log(lis[i]);
        }
        const ol = document.getElementsByTagName('ol')
        console.log(ol); //它是個偽數組,里面只有【ol】所以去里面找它的子元素li沒有,
        //它不能自己找自己
        // 3.如果頁面中只有一個li 返回的還是偽數組的形式
        // 4. 如果頁面中沒有這個元素 返回的是空的偽數組的形式
        // 5.element.getElementByTagName('標簽名');父元素必須是指定的單個元素,所以必須是ol[0]指定ol的第一個。
        //不可以
        // console.log(ol.getElementsByTagName('li'));

        console.log(ol[0]); //ol的第0個里面是它所有的li和它自己。
        console.log(ol[0].getElementsByTagName('li'));

        // 我們一般用id挑選,感覺就是要找到唯一性,不然它咋整啊

        const oll = document.getElementById('ol')
        console.log(oll.getElementsByTagName('li'));
    </script>
</body>

</html>

H5新增獲取元素方式

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>H5新增獲取元素方式</title>
</head>

<body>
    <ul class="firstPage1">
        <li class="firstPage">首頁</li>
        <li class="firstPage2">首頁</li>
    </ul>
    <ol>
        <li>商品</li>
        <li>商品</li>
    </ol>

    <div class="box">盒子1</div>
    <div>盒子2</div>
    <div id="nav">
        <ul>
            <li>商品</li>
            <li>商品</li>
        </ul>
    </div>


    <script type="text/javascript">
        // 1.getElementsByClassName 根據類名獲取某些元素集合
        const getName = document.getElementsByClassName('box')
        console.log(getName);
        console.log(document.getElementsByClassName('firstPage'));
        // 通過類名和和id,還有標簽名字-TagName--獲取的都是偽數組的形式,
        // 通過  選擇器的搜索直接整個標簽給你整出,因為它默認挑選的是第一個嘛,all的話是以節點的形式,也是一個偽數組。
        // 因為是選擇器它必須有標識。.或者#, 因為所有標簽元素都是對象所以里面有好多方法,
        // 包括點擊啊onclick,選出來就可以讓它為我們干事,而且都是偽數組的形式存儲。

        // 2.querySelector 返回指定選擇器的第一個元素對象
        console.log(document.querySelector('.firstPage1'));
        console.log(document.querySelector('.firstPage'));
        // 3. querySelectorAll()返回指定選擇器的所有元素對象集合
        console.log(document.querySelectorAll('.firstPage'));
    </script>
</body>

</html>

獲取特殊元素(body和html)

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>獲取特殊元素</title>
</head>

<body>
    <script type='text/javascript'>
        // 1.獲取body 元素
        var bodyEle = document.body;
        console.log(bodyEle);
        console.dir(bodyEle); //有屬性和方法,一般都是
        //2. 獲取html元素
        var htmlEle = document.documentElement;
        console.log(htmlEle);
    </script>
</body>

</html>

事件三要素
image

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>事件三要素</title>
</head>

<body>
    <button id="click">唐伯虎</button>
    <script type='text/javascript'>
        // 點擊一個按鈕,彈出對話框

        // 1. 事件是由三部分組成 事件源 事件類型 事件處理程序 我們也成為事件三要素
        // (1)事件源 事件被觸發的對象 誰 按鈕
        const btn = document.getElementById('click');
        // (2) 事件類型 如何觸發 什么事件 比如鼠標手點擊(onclick)還是鼠標經過 還是鍵盤按下
        // (3)事件處理程序 通過一個函數賦值的方式 完成
        btn.onclick = function() {
            alert('加油努力向前沖!')
        }
    </script>
</body>

</html>

執行事件步驟

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>執行事件步驟</title>
</head>

<body>
    <div>123</div>
    <script type='text/javascript'>
        // 執行事件步驟
        //  點擊div 控制台輸出 我被選中了
        // 1。獲取事件源
        const box = document.querySelector('div')
            // 2. 綁定事件 注冊事件
            // div.onclick
            // 3. 添加事件處理程序
        box.onclick = function() {
            console.log('我被選中啦');
        }
    </script>
</body>

</html>
  • 執行事件的步驟
    1. 獲取事件源
    1. 注冊事件(綁定事件)
    1. 添加事件處理程序(采取函數賦值形式)

image

操作元素之改變元素內容

image

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>操作元素之改變元素內容</title>

    <style>
        /* 記得回車逗號之后 */
        
        div,
        p {
            width: 300px;
            height: 30px;
            line-height: 30px;
            color: rgb(223, 215, 215);
            background-color: green;
        }
    </style>
</head>

<body>

    <button>顯示當前系統時間</button>
    <div>某個時間</div>
    <p>具體時間</p>
    <script type='text/javascript'>
        // 可以直接寫div 或者button 它會返回第一個。也可以通過id,類名,來選着。
        // 要求:當我們點擊了按鈕 div 里面的文字會發生變化
        // 1.獲取元素
        const btn = document.querySelector('button')
        const box = document.querySelector('div')
            // 2. 注冊事件, (綁定事件)
        btn.onclick = () => {
                box.innerText = '2021-12-23';
            }
            // 格式化年月日
        function getDate() {

            var date = new Date(); // 它構造函數必須先 new了才能使用,也就是先實例化了再使用
            /*
            console.log(date.getFullYear());// 返回當前日期的年 2021
            console.log(date.getMonth() +1);// 月份 返回的月份小於1個月 記得月份+ 1哦
            console.log(date.getDate());//返回的是 幾號
            console.log(date.getDay()); // 4 周一返回的是 1 周六返回的是 6 但是周日返回的是0
            console.dir(date.getFullYear)// 是一個函數

            */
            var year = date.getFullYear();
            var month = date.getMonth() + 1;
            var dates = date.getDate();
            var arr = ['星期日', '星期一', '星期二', '星期三', '星期四', '星期五', '星期六']
            var day = date.getDay();

            return `今天是: ${year} 年 ${month}月 ${dates} 日${arr[day]}`
        }
        // 我們元素可以不用添加事件
        var pTag = document.querySelector('p')
        pTag.innerText = getDate();
    </script>
</body>

</html>

innerText和innerHTML的區別

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>innerText和innerHTML的區別</title>
</head>


<body>
    <div></div>
    <span></span>
    <p>
        今天是:
        <span id="pSpan">123</span>
    </p>
    <script type='text/javascript'>
        //innerText 和 innerHTML的區別
        // 1. innerText 不識別html標簽 非標准 去除空行和換行

        const div = document.querySelector('div')
        const span = document.querySelector('span')
        const p = document.querySelector('p')
        div.innerText = '<strong>今天是</strong> 2021年,我又重學代碼了啊啊啊奔潰~'
        span.innerHTML = '<strong>今天是</strong> 2021年,不學到后面會不懂寫的越來越少,模模糊糊的'
            // 2. innerHTML 識別html 標簽 w3c標准 保留空格和換行的
            // 她兩還能讀取內容
            // 這兩個屬性是可讀寫的 可以獲取元素里面的內容
        console.log(div.innerText); //也是可以的自己添加上去。還是能讀取出來
        console.log(p.innerText);
        console.log(p.innerHTML);
    </script>
</body>

</html>

操作元素之修改元素屬性

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>操作元素之修改元素屬性</title>

</head>

<body>
    <div>點擊切換大明星</div>
    <button id="yml">於朦朧</button>
    <button id="lhr">劉昊然</button>
    <br/>
    <img src="../img/yml.jpeg" alt="" title="於朦朧最帥!">

    <script type='text/javascript'>
        // 修改元素屬性 src
        // 1.獲取元素
        const yml = document.getElementById('yml')
        const lhr = document.getElementById('lhr')
        const img = document.querySelector('img')
            // 2. 注冊事件 處理程序
        yml.onclick = () => {
            img.src = '../img/yml.jpeg';
            img.title = '於朦朧最帥!!!!'
        }
        lhr.onclick = () => {
            img.src = '../img/lhr.jpeg';
            img.title = '劉昊然笑起來好看'
        }
    </script>
</body>

</html>

image

分時問候並顯示不同圖片案例

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>分時問候並顯示不同圖片案例</title>
    <style>
        img {
            width: 400px;
        }
    </style>
</head>

<body>
    <img src="../img/yml2.jpeg" alt="">\

    <div>上午好</div>

    <script type='text/javascript'>
        // 根據系統不同時間來判斷,所以需要用到日期內置對象
        // 利用多分支語句來設置不同的圖片
        // 需要一個圖片,並且根據時間修改圖片,就需要用到操作元素src屬性
        // 需要一個div 元素 顯示不同問候語,修改元素內容即可
        // 1.獲取元素
        const img = document.querySelector('img')
        const box = document.querySelector('div')
        const date = new Date()
            // 2.得到當前的小時數
        const h = date.getHours();
        console.log(h);
        // 3.判斷小時數改變圖片和文字信息。
        if (h < 12) {
            img.src = '../img/yml2.jpeg';
            box.innerHTML = '上午好'
        } else if (h < 18) {
            img.src = '../img/yml.jpeg';
            box.innerHTML = '下午好'
        } else {
            img.src = '../img/lhr.jpeg';
            box.innerHTML = '晚上好'
        }
    </script>
</body>

</html>

操作元素之表單屬性設置

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>操作元素之表單屬性設置</title>
</head>

<body>
    <button>按鈕</button>
    <input type="text" value="請輸入內容">
    <script type='text/javascript'>
        //1.獲取元素
        const btn = document.querySelector('button')
        const input = document.querySelector('input')

        /*
                btn.onclick = () => {
                    //  input.innerHTML= 'lallal' 不可以用,innerHTML只是針對div ol等標簽
                    這個是 普通盒子 比如div 標簽里面的內容
                    表單里面的值 文字內容是通過 value 來修改的
                    input.value = '加油努力向前沖'
                    如果想要某個表單被禁用 不能再點擊 disabled 我們想要這個按鈕 button禁用
                        // btn.disabled = true;
                        // console.log(this);全局變量
                        // this.disabled = true; 箭頭函數,this指向的是上一級,不起作用。
                }
        */
        // 2.注冊事件 處理程序
        btn.onclick = function() {

            input.value = '加油努力向前沖'
            this.disabled = true; // 普通函數 this 指向的是事件函數的調用者 btn
        }
    </script>
</body>

</html>

image

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>操作元素之修改樣式屬性</title>
    <style>
        div {
            width: 200px;
            height: 200px;
            background-color: pink;
        }
    </style>
</head>

<body>
    <div>
    </div>

    <script type='text/javascript'>
        // 1.獲取元素
        var div = document.querySelector('div')
            // 2. 注冊事件 處理程序
        div.onclick = function() {
            // div.style里面的屬性 采取駝峰命名法
            // 記住顏色也要采取駝峰命名法
            div.style.backgroundColor = 'skyBlue';

            div.style.width = '400px';
            div.style.height = '400px';

        }
    </script>
</body>

</html>

關閉淘寶二維碼案例

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>關閉淘寶二維碼案例</title>
    <style>
        .box {
            position: relative;
            width: 74px;
            height: 88px;
            border: 1px solid #ccc;
            margin: 100px auto;
            font-size: 12px;
            text-align: center;
            color: #f40;
            /* display: block; */
        }
        
        .box img {
            width: 60px;
            margin-top: 5px;
        }
        
        .close-btn {
            position: absolute;
            top: -1px;
            left: -16px;
            width: 14px;
            height: 14px;
            border: 1px solid #ccc;
            line-height: 14px;
            font-family: Arial, Helvetica, sans-serif;
            cursor: pointer;
        }
    </style>

</head>

<body>
    <div class="box">
        淘寶二維碼
        <img src="../img/二維碼.png" alt="">
        <i class="close-btn">X</i>
    </div>
    <script type='text/javascript'>
        var btn = document.querySelector('.close-btn')
        var box = document.querySelector('.box')
        btn.onclick = function() {
            box.style.display = 'none';

        }
    </script>
</body>

</html>

循環精靈圖

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>循環精靈圖</title>

    <style>
        * {
            margin: 0;
            padding: 0;
        }
        
        li {
            list-style-type: none;
        }
        
        .box {
            width: 250px;
            margin: 100px auto;
        }
        
        .box li {
            float: left;
            width: 24px;
            height: 24px;
            background-color: pink;
            margin: 15px;
            background: url(../img/sprite.png) no-repeat;
        }
    </style>
</head>

<body>
    <div class="box">
        <ul>
            <li></li>
            <li></li>
            <li></li>
            <li></li>
            <li></li>
            <li></li>
            <li></li>
            <li></li>
            <li></li>
            <li></li>
            <li></li>
            <li></li>
        </ul>
    </div>
    <script type='text/javascript'>
        // 1.獲取元素 所有的小li
        var lis = document.querySelectorAll('li')
        for (var i = 0; i < lis.length; i++) {
            // 讓索引號 乘以 44就是每一個li 的背景 y坐標 index 就是我們的Y坐標
            var index = i * 44;
            lis[i].style.backgroundPosition = '0 -' + index + 'px'
        }
    </script>
</body>

</html>

  • 節點操作

image

image

image

image

  • 父節點的使用,得到的是離它最近的那個父親
<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>父節點操作</title>
</head>

<body>
    <ul>
        <li>我是li</li>
        <li>我是li</li>
        <li>我是li</li>
        <li>我是li</li>
    </ul>
    <div class="demo">
        <div class="box">
            <span class="erweima"> x</span>
        </div>
    </div>
    <script type='text/javascript'>
        // 1. 父節點 node.parentNode
        var erweima = document.querySelector('.erweima')
        var div = document.querySelector('.box')
            // console.log(div);
            // 打印出來至少它有三個基本屬性 - nodeType (節點類型) nodeName(節點名稱) nodeValue(節點值)
        console.dir(div)
            // var div = document.querySelector('.box')
            // 挺麻煩的 
            // 得到的是離元素最近的父級節點
        console.log(erweima.parentNode);
    </script>
</body>

</html>

**子節點的使用-parentNode.children(非標准)
image

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>子節點操作</title>
</head>

<body>
    <ul>
        <li>我是li</li>
        <li>我是li</li>
        <li>我是li</li>
        <li>我是li</li>
    </ul>
    <ol>
        <li>子節點</li>
        <li>子節點</li>
        <li>子節點</li>
    </ol>
    <div class="demo">
        <div class="box">
            <span class="erweima"> x</span>
        </div>
    </div>
    <script type='text/javascript'>
        // DOM提供的方法(API)獲取
        var ul = document.querySelector('ul') //這一句是不能少的,因為它還是要根據這個去找,
            //我以為它自己會知道那個是ul哈哈哈哈怎么可能
            // var lis = ul.querySelectorAll('li')
            // console.log(lis);
            // 1.子節點 childNodes 所有的子節點 包含元素節點 文本節點 等等 一般不用
        console.log(ul.childNodes);
        console.log(ul.childNodes[0].nodeType);
        console.log(ul.childNodes[1].nodeType);
        // 2. children 獲取所有的子元素節點 也是我們實際開發中常用的 下次直接用這個。
        console.log(ul.children);
    </script>
</body>

</html>

子節點第一個元素和最后一個子元素
image

image

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>子節點第一個元素和最后一個子元素</title>
</head>

<body>
    <ul>
        <li>我是li</li>
        <li>我是li</li>
        <li>我是li</li>
        <li>我是li</li>
    </ul>
    <ol>
        <li>子節點</li>
        <li>子節點</li>
        <li>子節點</li>
    </ol>
    <script type='text/javascript'>
        var ul = document.querySelector('ul')
            // 1.firstChild 第一個子節點 不管是文本節點還是元素節點 那記它干嘛,忘記吧
        console.log(ul.firstChild);
        console.log(ul.lastChild);
        //ie9 以上才支持 2. firstElementChild 返回第一個子元素節點
        console.log(ul.firstElementChild);
        console.log(ul.lastElementChild);

        // 3.實際開發中的寫法 既沒有兼容性問題又返回第一個子元素也可以返回最后一個子元素
        // 這個是獲取它孩子-子元素的第一個節點
        console.log(ul.children[0]);
        // ul.children 是獲取所有它孩子元素的子節點
        console.log(ul.childNodes[ul.children.length - 1]);
    </script>
</body>

</html>

新浪下拉菜單

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>新浪下拉菜單</title>
    <style>
        * {
            margin: 0;
            padding: 0;
        }
        
        li {
            list-style-type: none;
        }
        
        a {
            text-decoration: none;
            font-size: 14px;
        }
        
        .nav {
            margin: 100px;
        }
        
        .nav>li {
            position: relative;
            float: left;
            width: 80px;
            height: 41px;
            text-align: center;
        }
        
        .nav li a {
            display: block;
            width: 100%;
            height: 100%;
            line-height: 41px;
            color: #333;
        }
        
        .nav>li>a:hover {
            background-color: #eee;
        }
        
        .nav ul {
            display: none;
            position: absolute;
            top: 41px;
            left: 0;
            width: 100%;
            border-left: 1px solid #FECC5B;
            border-right: 1px solid #FECC5B;
        }
        
        .nav ul li {
            border-bottom: 1px solid #FECC5B;
        }
        
        .nav ul li a:hover {
            background-color: #FFF5DA;
        }
    </style>
</head>

<body>
    <ul class="nav">
        <li>
            <a href="#">微博</a>
            <ul>
                <li>
                    <a href="">私信</a>
                </li>
                <li>
                    <a href="">評論</a>
                </li>
                <li>
                    <a href="">@我</a>
                </li>
            </ul>
        </li>
        <li>
            <a href="#">微博</a>
            <ul>
                <li>
                    <a href="">私信</a>
                </li>
                <li>
                    <a href="">評論</a>
                </li>
                <li>
                    <a href="">@我</a>
                </li>
            </ul>
        </li>
        <li>
            <a href="#">微博</a>
            <ul>
                <li>
                    <a href="">私信</a>
                </li>
                <li>
                    <a href="">評論</a>
                </li>
                <li>
                    <a href="">@我</a>
                </li>
            </ul>
        </li>
        <li>
            <a href="#">微博</a>
            <ul>
                <li>
                    <a href="">私信</a>
                </li>
                <li>
                    <a href="">評論</a>
                </li>
                <li>
                    <a href="">@我</a>
                </li>
            </ul>
        </li>
    </ul>
    <script type='text/javascript'>
        // 1.獲取元素
        var nav = document.querySelector('.nav')
        var lis = nav.children; //得到4個小li
        // 2. 循環注冊事件
        for (let i = 0; i < lis.length; i++) {
            lis[i].onmouseover = function() {
                //記住 lis[1] 不等於 它孩子的第一個。
                this.children[1].style.display = 'block'
            }
            lis[i].onmouseout = function() {
                this.children[1].style.display = 'none'
            }
        }
    </script>
</body>

</html>

image

兄弟節點(用的特別少)
image

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>兄弟節點(用的特別少)</title>
</head>

<body>
    <div>我是DIV</div>
    <span>我是span</span>
    <script type='text/javascript'>
        // 1.nextSibling下一個兄弟節點 包含元素節點 或者文本節點等
        var div = document.querySelector('div')
        console.log(div.nextSibling);
        console.log(div.previousSibling);
        // 2. nexElementSibling 得到下一個兄弟元素節點
        //ie9可以用 
        console.log(div.nextElementSibling);
        console.log(div.previousElementSibling); //沒有當然為null
    </script>
</body>

</html>

創建和添加節點
image

image


<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>創建和添加節點</title>
</head>

<body>
    <ul>
        <li>123</li>
    </ul>
    <script type='text/javascript'>
        //1.創建節點元素節點
        var li = document.createElement('li')
            // 2.添加節點 node.appendChild(child) node父級 child 是子級 后面追加元素類似於數組中的push
        var ul = document.querySelector('ul')

        ul.appendChild(li)
            // 3. 添加節點 node.insertBefore(child, 指定元素) 指定元素就是指定添加到哪個地方
        var lili = document.createElement('li')
        ul.insertBefore(lili, ul.children[0])
            // 4.我們想要頁面添加一個新的元素: 1.創建元素 2. 添加元素
    </script>
</body>

</html>

簡單版發布留言案例

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>簡單版發布留言案例</title>

    <style>
        * {
            margin: 0;
            padding: 0;
        }
        
        body {
            padding: 100px;
        }
        
        textarea {
            width: 200px;
            height: 100px;
            border: 1px solid pink;
            outline: none;
            resize: none;
        }
        
        ul {
            margin-top: 50px;
        }
        
        li {
            width: 300px;
            padding: 5px;
            background-color: rgb(245, 209, 243);
            color: red;
            font-size: 14px;
            margin: 15px 0;
        }
    </style>
</head>

<body>
    <textarea name=""></textarea>
    <button>發布</button>

    <ul></ul>
    <script type='text/javascript'>
        // 1.獲取元素
        var text = document.querySelector('textarea')
        var btn = document.querySelector('button')
        var ul = document.querySelector('ul')
            // 2.注冊事件
        btn.onclick = function() {
            // text.value == null 怎么可能等於空嘛,明明里面是字符串
            if (text.value == "") {
                alert('請輸入內容');
                return false;
                //程序結束返回,返回值是false(調用者可以根據函數的返回值進行接下來的操作)
                //程序返回false,不會再執行下面的語句
            } else {
                // console.log(text.value);
                // (1)創建元素
                var li = document.createElement('li');
                // 先有li 才能賦值
                li.innerHTML = text.value
                    // (2) 添加元素
                    // ul.appendChild(li)
                ul.insertBefore(li, ul.children[0]);

            }

        }
    </script>

</body>

</html>

節點操作之刪除節點
image

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>節點操作之刪除節點</title>
</head>

<body>
    <button>刪除</button>
    <ul>
        <li>熊大</li>
        <li>熊二</li>
        <li>光頭強</li>
    </ul>
    <script type='text/javascript'>
        //1.獲取元素
        var btn = document.querySelector('button')
        var ul = document.querySelector('ul')
        var lis = ul.children
            // 2.刪除元素 node.removeChild(child)
            // ul.removeChild(ul.children[0]);
            //3.點擊按鈕依次刪除里面的孩子
        btn.onclick = function() {
            if (lis.length == 0) {
                //disabled 殘廢的
                this.disabled = true;
            } else {
                ul.removeChild(lis[0])

            }
        }
    </script>
</body>

</html>

刪除留言案例

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>刪除留言案例</title>
</head>

<body>
    <style>
        * {
            margin: 0;
            padding: 0;
        }
        
        body {
            padding: 100px;
        }
        
        textarea {
            width: 200px;
            height: 100px;
            border: 1px solid pink;
            outline: none;
            resize: none;
        }
        
        ul {
            margin-top: 50px;
        }
        
        li {
            width: 300px;
            padding: 5px;
            background-color: rgb(245, 209, 243);
            color: red;
            font-size: 14px;
            margin: 15px 0;
        }
        
        li a {
            /* 向右浮動 */
            float: right;
        }
    </style>
    </head>

    <body>
        <textarea name=""></textarea>
        <button>發布</button>

        <ul></ul>
        <script type='text/javascript'>
            // 1.獲取元素
            var text = document.querySelector('textarea')
            var btn = document.querySelector('button')
            var ul = document.querySelector('ul')
                // 2.注冊事件
            btn.onclick = function() {

                if (text.value == "") {
                    alert('請輸入內容');
                    return false;

                } else {

                    // (1)創建元素
                    var li = document.createElement('li');

                    // 先有li 才能賦值
                    // (2) 添加元素
                    // ul.appendChild(li)
                    // <a href = "javascript:;" --表示默認不跳轉
                    li.innerHTML = text.value + '<a href = "javascript:;"> 刪除</a>'

                    ul.insertBefore(li, ul.children[0]);
                    // (3)刪除元素 刪除的是當前鏈接的li a它的父親 
                    var as = document.querySelectorAll('a')
                    for (var i = 0; i < as.length; i++) {
                        as[i].onclick = function() {
                            // node.removeChild(child);刪除的是li 當前a 所在的li this.parentNode- 這個就近原則的父節點
                            ul.removeChild(this.parentNode)
                        }

                    }
                    //但是不能把  ul.insertBefore(li, ul.children[0]);放在for循環之后,第一次能刪-只有它單獨一個的時候
                    //但是輸入多行以后的,都不能刪掉第一個這是為什么呢暫時沒有想通

                }

            }
        </script>

    </body>

</html>

節點操作之克隆節點
image

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>節點操作之克隆節點</title>
</head>

<body>
    <ul>
        <li>111</li>
        <li>2</li>
        <li>3</li>
    </ul>
    <script type='text/javascript'>
        // 1.node.cloneNode(); 括號為空或者里面是 false 淺拷貝 只復制標簽不復制里面的內容
        // 2. node.cloneNode(true) ; 括號為 true 深拷貝 復制標簽復制里面的內容
        var ul = document.querySelector('ul')
        var lili = ul.children[0].cloneNode(true)
        ul.appendChild(lili)
    </script>

</body>

</html>

動態生成表格案例

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>動態生成表格案例</title>
    <style>
        table {
            width: 500px;
            margin: 100px auto;
            border-collapse: collapse;
            text-align: center;
        }
        
        td,
        th {
            border: 1px solid #333;
        }
        
        thead tr {
            height: 40px;
            background-color: #ccc;
        }
    </style>
</head>

<body>
    <!-- cellspacing: 單元格間距 -->
    <table cellspacing="0">
        <thead>
            <tr>
                <th>姓名</th>
                <th>科目</th>
                <th>成績</th>
                <th>操作</th>
            </tr>
        </thead>
        <tbody>
        </tbody>
    </table>
    </head>

    <body>
        <script type='text/javascript'>
            //   1.先准備好學生的數據

            var datas = [{
                        name: '魏瓔珞',
                        subject: 'Javascript',
                        score: 100
                    },

                    {
                        name: '弘歷',
                        subject: 'Javascript',
                        score: 99
                    }, {
                        name: '傅亨',
                        subject: 'Javascript',
                        score: 98
                    }, {
                        name: '明玉',
                        subject: 'Javascript',
                        score: 90
                    }, {
                        name: '聰明頂呱呱',
                        subject: 'Javascript',
                        score: 100
                    },

                ]
                // 2.往tbody里面創建行: 有幾個人(通過數組的長度) 我們就創建幾行
            var tbody = document.querySelector('tbody');

            for (let i = 0; i < datas.length; i++) {
                // 創建 tr 行
                var tr = document.createElement('tr')
                tbody.appendChild(tr);
                // 行里面創建單元格 td 單元格的數量取決於每個對象里面的屬性個數 for 循環遍歷對象 datas[i]

                for (let k in datas[i]) {
                    // 創建單元格
                    let td = document.createElement('td')
                        // 把對象里面的屬性值 datas[i][k]給td
                    td.innerHTML = datas[i][k]; //每一次好像都是先把值給它再渲染到頁面上
                    tr.appendChild(td)
                }
                //3.創建有刪除2個字的單元格

                var td = document.createElement('td')
                td.innerHTML = '<a href = "javascript:;">刪除</a>'
                tr.appendChild(td);


            }
            var as = document.querySelectorAll('a')

            for (let i = 0; i < as.length; i++) {
                // tbody.children 在變,但是我的 as不變,所以我刪除了第一個 
                as[i].onclick = function() {
                    //為什么每次的刪除到最后一個就刪不掉了呢
                    // 不可以這樣。重點看*******因為
                    // tbody.removeChild(tbody.children[i])

                    console.log(tbody.children);
                    tbody.removeChild(this.parentNode.parentNode)
                    console.log(i);



                }

            }


            // 遍歷對象復習
            // for (let k in obj) {
            // k 得到的是屬性名
            // Object[k]得到的是屬性值

            // }
        </script>


    </body>

</html>

遇到的問題

image

image

image
三種創建元素方式區別
image

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>三種創建元素方式區別</title>
</head>

<body>
    <button>點擊按鈕重新加載</button>

    <div>慢慢來吧</div>
    <div class="inner"></div>
    <div class="create"></div>
    <script type='text/javascript'>
        //當我整個頁面加載完了再去執行里面的代碼和頁面重繪一個道理
        // window.onload = function() {
        //         document.write('<div>只能一直往前走</div>')
        //     }
        // 三中的創建元素方式的區別
        // 1. document.write() 創建元素 如果頁面文檔流加載完畢,再調用這句話就會導致頁面重繪,
        //整個頁面都只有它
        // var btn = document.querySelector('button')
        // btn.onclick = function() {
        //     document.write('<div>只能一直往前走</div>')
        // }

        //2. innerHTML 創建元素
        var inner = document.querySelector('.inner');
        // 耗時
        // for (var i = 0; i <= 100; i++) {
        //     inner.innerHTML += '<a href="#">百度</a>'
        // }

        // var arr = [];

        // for (var i = 0; i <= 100; i++) {

        //     arr.push('<a href="#">百度</a>')

        // }
        // // arr.join('')把數組的分割號轉換為 字符串拼接。
        // inner.innerHTML = arr.join('')

        // 3. document.createElement()創建元素
        var create = document.querySelector('.create')
        for (var i = 0; i <= 100; i++) {
            var a = document.createElement('a')

            create.appendChild(a)
        }
    </script>
</body>

</html>

image

自定義屬性操作

image

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>自定義屬性操作</title>
</head>

<body>
    <div id="demo" index="1" class="start">
    </div>
    <script type='text/javascript'>
        // 獲取元素的屬性值
        // (1) element.屬性
        var div = document.querySelector('div')
            // element.屬性 來獲取自身的屬性

        console.log(div.id);
        //(2)element.getAttribute('屬性') get得到獲取attribute屬性的意思 我們程序自己添加的屬性
        // 我們稱之為自定義屬性 index
        console.log(div.getAttribute('id'));
        console.log(div.getAttribute('index'));
        //2.設置元素屬性值
        // (1) element.屬性 = '值'
        div.id = 'text';
        div.className = 'navs';
        //(2)element.setAttribute('屬性','值'):主要針對於自定義屬性
        //我覺得是js能識別的的后面2是數字js能夠解析所以不加字符串,假如是是字符串的話,肯定要加''
        div.setAttribute('index', 2);
        div.className = '123' //這個是通過它的屬性值去設置的。
        div.setAttribute('class', 'foot') //class 特殊 這里寫的就是class 而不是className
        div.setAttribute('id', 'good');
        //(3) removeAttribute(屬性)
        div.removeAttribute('index')
    </script>
</body>

</html>

DOM總結

image

image
image
image
image
image
image
image
注冊事件兩種方式

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>注冊事件兩種方式</title>
</head>

<body>
    <button>傳統注冊事件</button>
    <button>方法監聽注冊事件</button>
    <script type='text/javascript'>
        var btns = document.querySelectorAll('button')
            // 1.傳統方式注冊事件
        btns[0].onclick = function() {
            alert('加油加油')
        }
        btns[0].onclick = function() {
                alert('加油加油哈哈哈')
            }
            //2.事件偵聽注冊事件 addElementListener
            // (1)里面的事件類型是字符串,必定加引號 而且不帶on
            //(2) 同一個元素 同一個事件可以添加多個偵聽器(事件處理程序)
        btns[1].addEventListener('click', function() {
            alert('加油加油')
        })

        btns[1].addEventListener('click', function() {
                alert('加油加油aaa')
            })
            // 3.attachEvent ie9以前的版本支持

        btns[2].attachEvent('onclick', function() {

            alert(11)
        })
    </script>
</body>

</html>

刪除事件

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>刪除事件</title>
    <style>
        div {
            width: 100px;
            height: 100px;
            background-color: pink;
        }
    </style>
</head>

<body>
    <div>1</div>
    <div>2</div>
    <div>3</div>
    <script type='text/javascript'>
        var divs = document.querySelectorAll('div')

        divs[0].onclick = function() {
                alert('11');
                // 1.傳統方式刪除事件
                divs[0].onclick = null;
            }
            // 2.removeEventLister 刪除事件
        divs[1].addEventListener('click', fn) // 里面的fn 不需要調用小括號

        function fn() {
            alert('11')
            divs[1].removeEventListener('click', fn) //callback 回調函數的意思: 自己調用自己
        }
        //3.detachEvent ie9以上才用。
        divs[2].attachEvent('onclik', fn1);

        function fn1() {
            alert(33);
            divs[2].detachEvent('onclik', fn1)
        }
    </script>
</body>

</html>

BOM

image

image
image


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM