主頁 > 前端設計 > JavaScript——DOM

JavaScript——DOM

2021-12-16 08:41:14 前端設計

一、DOM

檔案物件模型(簡稱DOM),是W3C組織推薦的處理可擴展標記語言(HTML或者XML)的標準編程介面,W3C已經定義了一系列的DOM介面,通過這些DOM介面可以改變網頁的內容、結構和樣式,

二、DOM樹

DOM把以上內容都看做是物件,我們獲取過來的DOM元素是一個物件(object),所以稱為檔案物件模型,

  • 檔案:一個頁面就是一個檔案,DOM中使用document表示,
  • 元素:頁面中的所有標簽都是元素,DOM中使用element表示,
  • 節點:網頁中的所有內容都是節點(標簽、屬性、文本、注釋等),DOM中使用node表示,

三、DOM操作

1·1 獲取元素

獲取頁面中元素可以使用以下幾種方式:

  • 根據ID獲取,getElementById('ID名');
  • 根據標簽名獲取,getElementsByTagName('標簽名');
  • 通過HTML5新增的方法獲取,getElementsByClassName('類名),document.querySelector('(./#)選擇器'),document.querySelectorAll('(./#)選擇器');
  • 特殊元素獲取,document.body;(獲取body元素),document.documentElement;(獲取html元素);

注意:

  1. 通過標簽名獲取:因為得到的是一個物件的集合,所以我們想要操作里面的元素就需要遍歷,得到元素物件是動態的,
  2. 根據ID獲取元素是唯一的,
  3. H5新增方法:根據類名回傳的是元素物件集合,根據指定選擇器回傳的是第一個元素物件,

1·2 事件基礎

事件概述:JavaScript使我們有能力創建動態頁面,而事件是可以被JavaScript偵測到的行為,
簡單理解:觸發——回應機制,
網頁中的每個元素都可以產生某些可以觸發JavaScript的事件,

事件是有三部分組成 :事件源 事件型別 事件處理程式 我們也稱為事件三要素

例如:

<script>
        //點擊一個按鈕,彈出對話框
        //1、事件是有三部分組成 事件源 事件型別 事件處理程式 我們也稱為事件三要素
        //(1)事件源 事件被觸發的物件 誰 按鈕
        var btn = document.getElementById('btn');
        //(2)事件型別 如何觸發 什么事件 比如滑鼠點擊(onclick)還是滑鼠經過 還是鍵盤按下
        //(3)事件處理程式 通過一個函式賦值的方式 完成
        btn.onclick = function() {
            alert('點秋香');
        }
</script>

執行事件的步驟:

例如:

<script>
        //執行事件步驟
        //點擊div,控制臺輸出,我被選中了
        //1、獲取事件源
        var div = document.querySelector('div');
        //2、系結事件 注冊事件
        //div.onclick
        //3、添加事件處理程式
        div.onclick = function() {
            console.log('我被選中了');
        }
</script>

1·3 滑鼠事件

補充滑鼠事件:

  1. mouseenter:移入事件,
  2. mouseleave:移出事件,
  3. contextmenu:右鍵事件,
  4. selectstart:禁止滑鼠選中,

1·4 鍵盤事件

例如:

<script>
        // 常用的鍵盤事件
        //1. keyup 按鍵彈起的時候觸發 
        // document.onkeyup = function() {
        //         console.log('我彈起了');

        //     }
        document.addEventListener('keyup', function() {
            console.log('我彈起了');
        })

        //3. keypress 按鍵按下的時候觸發  不能識別功能鍵 比如 ctrl shift 左右箭頭啊
        document.addEventListener('keypress', function() {
                console.log('我按下了press');
            })
            //2. keydown 按鍵按下的時候觸發  能識別功能鍵 比如 ctrl shift 左右箭頭啊
        document.addEventListener('keydown', function() {
                console.log('我按下了down');
            })
            // 4. 三個事件的執行順序  keydown -- keypress -- keyup
</script>

1·5 操作元素

JavaScript的DOM操作可以改變網頁內容、結構和樣式,我們可以利用DOM操作元素來改變元素里面的內容、屬性等,

1·5·1 改變元素內容

  1. element.innerText;從起始位置到終止位置的內容,但它去除html標簽,同時空格和換行也會去掉
  2. element.innerHTML;起始位置到終止位置的全部內容,包括html標簽,同時保留空格和換行

例如:

<script>
        //innerText 和 innerHTML的區別
        //1、innerText 不識別html標簽 非標準 去除空格和換行
        var div = document.querySelector('div');
        //div.innerText='<strong>今天是:</strong> 2019';
        //2、innerHTML 識別html標簽 W3C標準 保留空格和換行
        div.innerHTML = '<strong>今天是:</strong> 2019';
        //這兩個屬性是可讀寫的 可以獲取元素里面的內容
        var p = document.querySelector('p');
        console.log(p.innerText);
        console.log(p.innerHTML);
</script>

輸出顯示:

1·5·2 修改元素屬性

常用元素的屬性操作:

  1. innerText、innerHTML,改變元素內容
  2. src、href;
  3. id、alt、title;

例如:

 <button id="ldh">劉德華</button>
<button id="zxy">張學友</button><br>
<img src="../images/ldh.jpg" alt="" width="600px" height="350px" title="劉德華">
<script>
        //修改元素屬性 src
        //1、獲取元素
        var ldh = document.getElementById('ldh');
        var zxy = document.getElementById('zxy');
        var img = document.querySelector('img');
        //2、注冊事件 處理程式
        zxy.onclick = function() {
            img.src = '../images/zxy.jpg';
            img.title = '張學友思密達';
        }
        ldh.onclick = function() {
            img.src = '../images/ldh.jpg';
            img.title = '劉德華';
        }
</script>

效果展示:

1·5·3 表單元素的屬性操作

利用DOM可以操作如下表單元素的屬性:type、value、checked、selected、disabled(禁用),

例如:

<button>按鈕</button>
<input type="text" value="輸入內容">
<script>
        //1、獲取元素
        var btn = document.querySelector('button');
        var input = document.querySelector('input');
        //2、注冊事件 處理程式
        btn.onclick = function() {
            //表單里面的值,文字內容是通過value來修改的;
            input.value = '被點擊了';
            //如果想要某個表單被禁用 不能再點擊 disabled 我們想要這個按鈕 button 禁用
            // btn.disabled = true;
            this.disabled = true;
            //this指向的是事件函式的呼叫 btn
        }
</script>

效果展示:

1·5·4 樣式屬性操作

通過JS修改元素的大小、顏色、位置等樣式,

  1. element.style:行內樣式操作
  2. element.className:類名樣式操作

例如:

<script>
        //1、獲取元素
        var div = document.querySelector('div');
        //2、注冊事件 處理程式
        div.onclick = function() {
            this.style.backgroundColor = "purple";
            this.style.width = '250px';
        }
</script>
<div class="first">文本</div>
<script>
        //1、使用element.style獲得修改元素樣式 如果樣式比較少,或者功能簡單的情況下使用比較好
        var test = document.querySelector('div');
        test.onclick = function() {
            // this.style.backgroundColor = 'purple';
            // this.style.color = '#fff';
            // this.style.fontSize = '25px';
            // this.style.marginTop = '100px';

            //2、我們可以通過修改元素的className更改元素的樣式,適合樣式較多或者功能復雜的情況
            //讓我們當前元素的類命改為了change
            // this.className = 'change';
            //如果想要保留原先的類命,我們可以這么做
            this.className = 'first change';
        }
</script>

注意:

  1. JS里面的樣式采取駝峰命名法,比如fontSize、backgroundColor,
  2. JS修改style樣式操作,產生的是行內樣式,css權重比較高,
  3. 如果樣式修改較多,可以采取操作類命方式更改元素樣式,
  4. class因為是個保留字,因此使用className來操作元素類命屬性,
  5. className會直接更改元素的類命,會覆寫原先的類命,

1·5·5 自定義屬性

自定義屬性目的:是為了保存并使用資料,有些資料可以保存到頁面中而不用保存到資料庫中,自定義屬性獲取是通過getAttribute('屬性')獲取,但是有些自定義屬性很容易引起歧義,不容易判斷是元素的內置屬性還是自定義屬性,

獲取屬性值:

  1. element.屬性;獲取屬性值
  2. element.getAttribute(‘屬性’)

區別:

  1. element.屬性;獲取內置屬性值(元素本身自帶的屬性)
  2. element.getAttribute(‘屬性’);主要獲得自定義的屬性(標準)我們程式員自定義的屬性

設定屬性值:

  1. element.屬性=‘值’;設定內置屬性值
  2. element.setAttribute(‘屬性’,‘值’);

移除屬性:

  • element.removeAttribute('屬性');
<div id="demo" index="1" class="nav"></div>
<script>
        var div = document.querySelector('div');
        //1、獲取元素的屬性值
        //(1)element.屬性
        console.log(div.id);
        //(2)element.getAttribute('屬性'); get得到獲取 attribute屬性的意思 我們程式員自己添加的屬性我們稱為自定義屬性
        console.log(div.getAttribute('id'));
        console.log(div.getAttribute('index'));
        //2、設定元素屬性值
        //(1)element.屬性='值';
        div.id = 'test';
        div.className = 'navs';
        //(2)element.setAttribute(‘屬性’,‘值’); 主要針對于自定義屬性
        div.setAttribute('index', 2);
        div.setAttribute('class', 'footer'); //class特殊 這里面寫的就是class,不是className
        //3、移除屬性 element.removeAttribute('屬性');
        div.removeAttribute('index');
</script>

輸出結果:


H5給我們新增了自定義屬性:
1】設定H5自定義屬性
H5規定自定義屬性data-開頭做為屬性名并且賦值,
比如<div data-index="1"></div>
或者使用JS設定
element.setAttribute('data-index',2);
2】獲取H5自定義屬性
1、兼容性獲取 element.getAttribute('data-index');
2、H5新增element.dataset.index或者element.dataset['index']; ie11才開始支持,
H5新增的獲取自定義屬性的方法,它只能獲取data-開頭的,dataset是一個集合里面存放了所有以data開頭的自定義屬性,如果自定義屬性里面有多個-鏈接的單詞,我們獲取的時候采取駝峰命名法,

1·5·6 操作元素總結

總結:

排他思想:如果有同一組元素,我們想要某一個元素實作某種樣式,需要用到回圈的排他思想演算法:

  1. 所有元素全部清除樣式(干掉其他人)
  2. 給當前元素設定樣式(留下我自己)
  3. 注意順序不能顛倒,首先干掉其他人,再設定自己,

例如:

<button>按鈕1</button>
<button>按鈕2</button>
<button>按鈕3</button>
<button>按鈕4</button>
<button>按鈕5</button>
<script>
        //1、獲取所有按鈕元素
        var btns = document.getElementsByTagName('button');
        //btns得到的是偽陣列,里面的每一個元素為btns[i]
        for (var i = 0; i < btns.length; i++) {
            btns[i].onclick = function() {
                //(1) 我們先把所有的按鈕背景顏色去掉,干掉所有人
                for (var i = 0; i < btns.length; i++) {
                    btns[i].style.backgroundColor = '';
                }
                //(2) 然后讓當前的元素的背景顏色為pink,留下自己
                this.style.backgroundColor = 'pink';
            }
        }
        //2、首先先排除其他人,然后才設定自己的樣式,這種排除其他人的思想我們稱為排他思想
</script>

效果展示:

1·6 節點操作

獲取元素通常使用兩種方式:
1】利用DOM提供的方法獲取元素;
特點:邏輯性不強、繁瑣;
2】利用節點層級關系獲取元素;
特點:利用父子兄弟節點關系獲取元素;邏輯性強,但兼容性不強;

1·6·1 節點概述

節點概述:網頁中所有內容都是節點(標簽、屬性、文本、注釋等),在DOM中,節點使用node來表示,HTML DOM數這的所有節點均可通過JavaScript進行訪問,所有HTML元素(節點)均可被修改,也可以創建或洗掉,

一般地,節點至少擁有nodeType(節點型別)、nodeName(節點名稱)和nodeValue(節點值)這三個基本屬性,

1】元素節點 nodeType為1;
2】屬性節點 nodeType為2;
3】文本節點 nodeType為3(文本節點包含文字、空格、換行等);

1·6·2 節點層級

利用DOM樹可以把節點劃分為不同的層級關系,常見的是父子兄層級關系,

父級節點:node.parentNode;

  1. parentNode屬性可回傳某節點的父節點,注意是最近的一個父節點;
  2. 如果指定的節點沒有父節點則回傳null;

子節點:

  1. parentNode.childNodes(標準);回傳包含指定節點的子節點的集合,
  2. parentNodes.children(非標準);回傳所有的子元素節點,
  3. parentNode.firstChild;回傳第一個子節點,找不到回傳null,同樣,也是包含所有節點,
  4. parentNode.lastChild;回傳最后一個子節點,找不到回傳null,同樣,也是包含所有節點,
  5. parentNode.firstElementChild;回傳第一個子元素節點,找不到則回傳null,
  6. parentNode.lastElementChild;回傳最后一個子元素節點,找不到則回傳null,

注意:

  1. parentNode.childNodes 回傳包含指定節點的子節點的集合,該集合為及時更新的集合,回傳值里面包含了所有的子節點,包括元素節點、文本節點等,
  2. parentNodes.children是一個只讀屬性,回傳所有的子元素節點,它只回傳子元素節點,其余節點不回傳,

兄弟節點:

  1. node.nextSibling;回傳當前元素的下一個兄弟節點,找不到則回傳null,同樣,也是包含所有節點,
  2. node.previousSibling;回傳當前元素上一個兄弟節點,找不到則回傳null,同樣,也包含所有節點,
  3. node.nextElementSibling;回傳當前元素下一個兄弟節點,找不到則回傳null,(IE9以上支持)
  4. node.previousElementSibling;回傳當前元素上一個兄弟節點,找不到則回傳null,

例如:

父節點:

<div class="demo">
        <div class="box">
            <span class="erweima">x</span>
        </div>
</div>

<script>
        //1、父節點 parentNode
        var erweima = document.querySelector('.erweima');
        // var box = document.querySelector('.box');
        //得到的是離元素最近的父級節點(親爸爸),如果找不到父節點就回傳null
        erweima.parentNode;
        console.log(erweima.parentNode);
</script>

結果:

子節點:

 <ul>
        <li>我是li</li>
        <li>我是li</li>
        <li>我是li</li>
        <li>我是li</li>
</ul>
<ol>
        <li>我是li</li>
        <li>我是li</li>
        <li>我是li</li>
        <li>我是li</li>
</ol>
<div class="demo">
        <div class="box">
            <span class="erweima">x</span>
        </div>
</div>

<script>
        //DOM提供的方法(API)獲取
        var ul = document.querySelector('ul');
        var lis = ul.querySelectorAll('li');
        //1、子節點 childNodes所有的子節點,包含元素節點、文本節點等等
        console.log(ul.childNodes);
        //2、children獲取所有子元素節點
        console.log(ul.children);
</script>

結果展示:

兄弟節點:

<div>我是div</div>
<span>我是span</span>
<script>
        var div = document.querySelector('div');
        //1、nextSbiling 下一個兄弟節點,包含元素節點或者文本節點等等
        console.log(div.nextSibling);
        console.log(div.previousSibling);
        //2、nextElementSibling 得到下一個兄弟元素節點
        console.log(div.nextElementSibling);
        console.log(div.previousElementSibling);
</script>

結果展示:

1·6·3 節點具體操作

  1. 創建節點:document.createElement('tagName');
  2. 添加節點:node.appendChild(child);將一個節點添加到指定父節點的子節點串列末尾,類似于CSS里面after偽元素,node.insertBefore(child,指定元素);將一個節點添加到父節點的指定子節點前面,類似于css里面的before偽元素,
  3. 洗掉節點:node.removeChild(child);從DOM中洗掉一個子節點,回傳洗掉的節點,
  4. 復制節點:node.cloneNode( );回傳呼叫該方法的節點的一個副本,如果括號引數為慷訓者false,則是淺拷貝,即只克隆復制節點本身,不克隆里面的子節點,

例如:

<ul>
        <li>123</li>
</ul>
<script>
        //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>

輸出結果:

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

效果展示:

   <ul>
        <li>1111</li>
        <li>2</li>
        <li>3</li>
    </ul>
    <script>
        var ul = document.querySelector('ul');
        //1、node.cloneNade();括號為慷訓者里面false,淺拷貝,只復制標簽不復制里面的內容
        //2、node.cloneNade(true);括號為turn 深拷貝,復制標簽和復制里面的內容
        var lili = ul.children[0].cloneNode(true);
        ul.appendChild(lili);
    </script>

輸出結果:

1·7 事件

1·7·1 注冊事件

給元素添加事件,稱為注冊事件或者系結事件,注冊事件有兩種方式:傳統方式和方法監聽注冊方式,

傳統注冊事件方式:

  • 利用on開頭的事件onclick;
  • <button οnclick="alert('hi~')"></button>;
  • btn.οnclick=function(){};
  • 特點:注冊事件的唯一性;
  • 同一個元素同一個事件只能設定一個處理函式,最后注冊的處理函式將會覆寫前面注冊的處理函式;

方法監聽注冊方式:

  • w3c標準 推薦方式;
  • addEventListenner()它是一個方法;
  • IE9之前的IE不支持此方法,可使用attachEvent()代替;
  • 特點:同一個元素同一事件可以注冊多個監聽器;

addEventListenner事件監聽方式:

語法:
eventTarget.addEvenListener(type,listener[,useCapture])
使用:
eventTarget.addEventListennertListener()方法將指定的監聽器注冊到eventTarget(目標物件)上,當該物件觸發指定的事件時,就會執行事件處理函式,
該方法接收三個引數:
1】type:事件型別字符,比如click、mouseover,注意這里不要帶on;
2】listener:事件處理函式,事件發生時,會呼叫該監聽函式;
3】useCapture:可選引數,是一個布林值,默認false,

1·7·2 洗掉事件

1】傳統注冊事件:
eventTarget.οnclick=null;
2】方法監聽注冊方式:
1、eventTarget.removeEventListener(type,listener[,useCapture]);
2、eventTarget.detachEvent(eventNameWithon,callback);

1·7·3 DOM事件流

事件流描述的是從頁面中接收事件的順序,
事件發生時會在元素節點之間按照特定的順序傳播,這個傳播程序即DOM事件流,

DOM事件流分為3個階段:
1、捕獲階段
2、當前目標階段
3、冒泡階段

事件冒泡:IE最早提出,事件開始時由最具體的元素接收,然后逐級向上傳播到DOM最頂層節點的程序,
事件捕獲:網景最早提出,由DOM最頂層節點開始,然后逐級向下傳播到最具體的元素接收的程序,

注意:

  1. JS代碼中只能執行捕獲或者冒泡其中的一個階段,
  2. onclick和attachEvent只能得到冒泡階段,
  3. addEventListener(type,listener[,useCapture])第三個引數如果是true,表示在事件捕獲階段呼叫事件處理程式;如果是false(不寫默認就是false),表示在事件冒泡階段呼叫事件處理程式,
  4. 實際開發中我們很少使用事件捕獲,我們更關注事件冒泡,
  5. 有些事件是沒有冒泡的,比如onblur、onfocus、onmouseenter、onmouseleave,
  6. 事件冒泡有時候會帶來麻煩,有時候又會幫助很巧妙的做某些事件,

阻止事件冒泡:
標準寫法:利用事件物件里面的stopPropagation()方法,

例如:

<div class="father">
        <div class="son">son兒子</div>
</div>
<script>
        //常見事件物件的屬性和方法
        //阻止冒泡 dom推薦的標準 stopPropagation()
        var son = document.querySelector('.son');
        son.addEventListener('click', function(e) {
            alert('son');
            e.stopPropagation(); //stop 停止 Propagation 傳播
            e.cancelBubble = true; //cannel 取消 bubble 泡泡
        }, false)
        var father = document.querySelector('.father');
        father.addEventListener('click', function() {
            alert('father');
        }, false)
        document.addEventListener('click', function() {
            alert('document');
        })
</script>

1·7·4 事件物件

官方解釋:event物件代表事件物件的狀態,比如鍵盤按鍵的狀態、滑鼠的位置、滑鼠按鈕的狀態,
簡單理解:事件發生后,跟事件相關的一系列資訊資料的集合都放到這個物件里面,這個物件就是事件物件event,它有很多屬性和方法,

事件物件的使用語法:
div.onclick = function(event) {
/這個event就是事件物件,可自己命名
}

 <div>123</div>
<script>
        //事件物件
        var div = document.querySelector('div');
        div.onclick = function(e) {
                e = e || window.event;
                console.log(e);
            }
            // div.onclick = function(event) {
            //         console.log(event);
            //     }
            // div.addEventListener('click', function(e) {
            //         console.log(e);
            //     })
            //1、event就是一個事件物件,寫到我們監聽函式的小括號里面,當形參看
            //2、事件物件只有有了事件才會存在,它是系統給我們自動創建的,不需要我們傳遞引數
            //3、事件物件是我們事件的一系列相關資料的集合,跟事件相關的,比如滑鼠點擊里面就包含了滑鼠相關的資訊,滑鼠坐標等,如果鍵盤事件里面就包含的鍵盤事件的資訊,比如,判斷用戶按下了哪個鍵
            //4、這個事件物件我們可以自己命名,比如event、evt、e
            //5、事件物件也有兼容性問題ie678通過window、event 兼容性寫法:e=e||window.event
</script>

事件物件屬性:

例如:

 <script>
        //常見事件物件的屬性和方法
        //1、e.target回傳觸發事件物件(元素) this回傳系結事件的物件(元素)
        var div = document.querySelector('div');
        div.addEventListener('click', function(e) {
            console.log(e.target);
            console.log(this);
        })
</script>

滑鼠事件物件:

例如:

 <script>
        //滑鼠事件物件 MouseEvent
        document.addEventListener('click', function(e) {
            //1、client 滑鼠在可視區的x和y坐標
            console.log(e.clientX);
            console.log(e.clientY);
            console.log('-------------------');

            //2、page滑鼠在頁面檔案的x和y坐標
            console.log(e.pageX);
            console.log(e.pageY);
            console.log('-------------------');

            //3、screen滑鼠在電腦螢屏的x和y坐標
            console.log(e.screenX);
            console.log(e.screenY);
        })
</script>

輸出結果:

鍵盤事件物件:

例如:

 <script>
        // 鍵盤事件物件中的keyCode屬性可以得到相應鍵的ASCII碼值
        // 1. 我們的keyup 和keydown事件不區分字母大小寫  a 和 A 得到的都是65
        // 2. 我們的keypress 事件 區分字母大小寫  a  97 和 A 得到的是65
        document.addEventListener('keyup', function(e) {
            // console.log(e);
            console.log('up:' + e.keyCode);
            // 我們可以利用keycode回傳的ASCII碼值來判斷用戶按下了那個鍵
            if (e.keyCode === 65) {
                alert('您按下的a鍵');
            } else {
                alert('您沒有按下a鍵')
            }

        })
        document.addEventListener('keypress', function(e) {
            // console.log(e);
            console.log('press:' + e.keyCode);

        })
</script>

注意:

  • onkeydown和onkeyup,不區分字母大小寫,onkeypress區分字母大小寫;
  • 在我們實際開發中,我們更多的使用keydown和keyup,它能識別所有的鍵(包括功能鍵);
  • keypress不識別功能鍵,但是keyCode屬性能區分大小寫,回傳不同的ASCII值,

事件委托(代理、委派)

事件委托也稱事件代理,在jQuery里面稱為事件委派,
事件委托的原理:不是每個子節點單獨設定事件監聽器,而是事件監聽器設定在其父節點上,然后利用冒泡原理影響設定每個子節點,

例如:

 <ul>
        <li>知否知否,點我應有彈框在手!</li>
        <li>知否知否,點我應有彈框在手!</li>
        <li>知否知否,點我應有彈框在手!</li>
        <li>知否知否,點我應有彈框在手!</li>
        <li>知否知否,點我應有彈框在手!</li>
</ul>
<script>
        //事件委托的核心原理:給父節點添加監聽器,利用事件冒泡影響每一個子節點
        var ul = document.querySelector('ul');
        ul.addEventListener('click', function(e) {
            // alert('知否知否,點我應有彈框在手!');
            //e.target這個可以得到我們點擊的物件
            e.target.style.backgroundColor = 'pink';
        })
</script>

效果展示:

四、案例

1·1 tab欄切換圖片

  <style>
        * {
            margin: 0;
            padding: 0;
        }
        
        .tab {
            width: 1100px;
            height: 550px;
            margin: 100px auto;
            border: 1px solid #ccc;
        }
        
        .tab_h {
            width: 1100px;
            height: 50px;
        }
        
        li {
            list-style: none;
            float: left;
            width: 90px;
            height: 50px;
            line-height: 50px;
            text-align: center;
            font-size: 24px;
            cursor: pointer;
        }
        
        .tab_h .here {
            background-color: rgb(180, 0, 0);
            color: #fff;
        }
        
        .tab_b img {
            width: 1100px;
            height: 500px;
        }
        
        .tab_b img {
            display: none;
        }
    </style>
</head>

<body>
    <div class="tab">
        <div class="tab_h">
            <ul>
                <li class="here">所</li>
                <li>見</li>
                <li>即</li>
                <li>所</li>
                <li>得</li>
            </ul>
        </div>
        <div class="tab_b">
            <img src="img/1.jpg" alt="" class="imgs" style="display: block;">
            <img src="img/2.jpg" alt="" class="imgs">
            <img src="img/3.jpg" alt="" class="imgs">
            <img src="img/4.jpg" alt="" class="imgs">
            <img src="img/5.jpg" alt="" class="imgs">
        </div>
    </div>
    <script>
        var tab_h = document.querySelector('.tab_h');
        tab_h.onmouseover = function() {
            tab_h.style.backgroundColor = '#eee';
        }
        var lis = document.querySelectorAll('li');
        var imgs = document.querySelectorAll('.imgs');
        for (var i = 0; i < lis.length; i++) {
            lis[i].setAttribute('index', i);
            lis[i].onclick = function() {
                for (var i = 0; i < lis.length; i++) {
                    lis[i].className = '';
                }
                this.className = 'here';
                var index = this.getAttribute('index');
                for (var i = 0; i < imgs.length; i++) {
                    imgs[i].style.display = 'none';
                }
                imgs[index].style.display = 'block';
            }

        }
    </script>

效果:

1·2 根據輸入內容生成表格

 <style>
        table {
            width: 600px;
            cursor: pointer;
        }
        
        table td {
            text-align: center;
        }
        
        table th {
            background-color: blueviolet;
        }
        
        table tr {
            background-color: pink;
        }
</style>
</head>

<body>
    <div id="dv">
        請輸入姓名:
        <input type="text" value="" id="uname" />
        <br/> 請輸入郵箱:
        <input type="text" value="" id="email" />
    </div>

    <input type="button" value="添加" id="btn" />
    <table border="1" cellpadding="0" cellspacing="0" id="tb">
        <thead>
            <tr>
                <th>姓名</th>
                <th>郵箱</th>
            </tr>
        </thead>
        <tbody id="tbd">
            <tr>
                <td>小黑</td>
                <td>xiaohei@126.com</td>
            </tr>
        </tbody>
    </table>
<script>
        //獲取元素
        var btn = document.querySelector('#btn');
        var uname = document.querySelector('#uname');
        var email = document.querySelector('#email');
        var tbody = document.querySelector('#tbd');
        var div = document.querySelector('#dv');
        var text = div.children;
        //注冊事件
        btn.addEventListener('click', function(e) {
            var un = uname.value;
            var em = email.value;
            if (un == '' || em == '') {
                alert('請將資料填入完全');
            } else {
                var tr = document.createElement('tr');
                tbody.appendChild(tr);
                for (var i = 1; i < text.length; i++) {
                    var td = document.createElement('td');
                    if (i == 1) {
                        td.innerHTML = un;
                        tr.appendChild(td);
                    } else {
                        td.innerHTML = em;
                        tr.appendChild(td);
                    }
                }
            }
        })
</script>

效果:

1·3 點擊按鈕改變盒子顏色

<style>
        div {
            width: 200px;
            height: 200px;
            background-color: green;
        }
    </style>
</head>

<body>
    <div></div>
    <button>改變</button>
<script>
        var div = document.querySelector('div');
        var btn = document.querySelector('button');
        var flag = 0;
        btn.onclick = function() {
            if (flag == 0) {
                div.style.backgroundColor = 'tan';
                flag = 1;
            } else if (flag == 1) {
                div.style.backgroundColor = 'red';
                flag = 2;
            } else if (flag == 2) {
                div.style.backgroundColor = 'yellow';
                flag = 3;
            } else if (flag == 3) {
                div.style.backgroundColor = 'blue';
                flag = 4;
            } else if (flag == 4) {
                div.style.backgroundColor = 'pink';
                flag = 5;
            } else if (flag == 5) {
                div.style.backgroundColor = 'gray';
                flag = 6;
            } else if (flag == 6) {
                div.style.backgroundColor = 'purple';
                flag = 7;
            } else if (flag == 7) {
                div.style.backgroundColor = 'green';
                flag = 0;
            }

        }
</script>

效果:

1·4 分時問候

<img src="../images/s.gif" alt="">
<div>上午好</div>
<script>
        //根據系統不同時間來判斷,所以需要用到日期內置物件
        //利用多分支陳述句來設定不同的圖片
        //需要一個圖片,并根據時間修改圖片,就需要用到操作元素src屬性
        //需要一個div元素,顯示不同問候語,修改元素內容即可
        //1、獲取元素
        var img = document.querySelector('img');
        var div = document.querySelector('div');
        //2、得到當前的小時數
        var date = new Date();
        var h = date.getHours();
        //3、判斷小時數改變圖片和文字資訊
        if (h < 12) {
            img.src = '../images/s.gif';
            div.innerHTML = '親,上午好,好好寫代碼';
        } else if (h < 18) {
            img.src = '../images/x.gif';
            div.innerHTML = '親,下午好,好好寫代碼';
        } else {
            img.src = '../images/w.gif';
            div.innerHTML = '親,晚午好,好好寫代碼';
        }
</script>

效果:

五、總結

關于DOM操作,我們主要針對于元素的操作,

主要有創建、增、刪、改、查、屬性操作、事件操作,

創建:
1、document.write
2、innerHTML
3、createElement

增:
1、appendChild
2、insertBefore

刪:
1、removeChild

改:
主要修改dom的元素屬性,dom元素的內容、屬性、表單的值等,
1、修改元素屬性:src、href、title等,
2、修改普通元素內容:
innerHTML、innerText,
3、修改表單元素:
value、type、disabled等,
4、修改元素樣式:style、className,

查:
主要獲取查詢dom的元素,
1、DOM提供的API方法:getElementByld、getElementByTagName 古老用法,不太推薦
2、H5提供的新方法:querySelector、querySelectorAll提倡;
3、利用節點操作獲取元素:父(parentNode)、子(children)、兄(previousElementSibling、nextElementSibling)提倡

屬性操作:
主要針對于自定義屬性,
1、setAttribute:設定dom的屬性值;
2、getAttribute:得到dom的屬性值;
3、removeAttribute移除屬性;

事件操作:
給元素注冊事件,采取:事件源.事件型別=事件處理程式,

轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/382003.html

標籤:其他

上一篇:ES6箭頭函式、rest引數、擴展運算子、Symbol的使用

下一篇:Vue ElmentUI message組件customClass使用方法

標籤雲
其他(157675) Python(38076) JavaScript(25376) Java(17977) C(15215) 區塊鏈(8255) C#(7972) AI(7469) 爪哇(7425) MySQL(7132) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5869) 数组(5741) R(5409) Linux(5327) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4554) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2429) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1958) Web開發(1951) python-3.x(1918) HtmlCss(1915) 弹簧靴(1913) C++(1909) xml(1889) PostgreSQL(1872) .NETCore(1853) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • vue移動端上拉加載

    可能做得過于簡單或者比較low,請各位大佬留情,一起探討技術 ......

    uj5u.com 2020-09-10 04:38:07 more
  • 優美網站首頁,頂部多層導航

    一個個人用的瀏覽器首頁,可以把一下常用的網站放在這里,平常打開會比較方便。 第一步,HTML代碼 <script src=https://www.cnblogs.com/szharf/p/"js/jquery-3.4.1.min.js"></script> <div id="navigate"> <ul> <li class="labels labels_1"> ......

    uj5u.com 2020-09-10 04:38:47 more
  • 頁面為要加<!DOCTYPE html>

    最近因為寫一個js函式,需要用到$(window).height(); 由于手寫demo的時候,過于自信,其實對前端方面的認識也不夠體系,用文本檔案直接敲出來的html代碼,第一行沒有加上<!DOCTYPE html> 導致了$(window).height();的結果直接是整個document的高 ......

    uj5u.com 2020-09-10 04:38:52 more
  • WordPress網站程式手動升級要做好資料備份

    WordPress博客網站程式在進行升級前,必須要做好網站資料的備份,這個問題良家佐言是遇見過的;在剛開始接觸WordPress博客程式的時候,因為升級問題和博客網站的修改的一些嘗試,良家佐言是吃盡了苦頭。因為購買的是西部數碼的空間和域名,每當佐言把自己的WordPress博客網站搞到一塌糊涂的時候 ......

    uj5u.com 2020-09-10 04:39:30 more
  • WordPress程式不能升級為5.4.2版本的原因

    WordPress是一款個人博客系統,受到英文博客愛好者和中文博客愛好者的追捧,并逐步演化成一款內容管理系統軟體;它是使用PHP語言和MySQL資料庫開發的,用戶可以在支持PHP和MySQL資料庫的服務器上使用自己的博客。每一次WordPress程式的更新,就會牽動無數WordPress愛好者的心, ......

    uj5u.com 2020-09-10 04:39:49 more
  • 使用CSS3的偽元素進行首字母下沉和首行改變樣式

    網頁中常見的一種效果,首字改變樣式或者首行改變樣式,效果如下圖。 代碼: <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, ......

    uj5u.com 2020-09-10 04:40:09 more
  • 關于a標簽的講解

    什么是a標簽? <a> 標簽定義超鏈接,用于從一個頁面鏈接到另一個頁面。 <a> 元素最重要的屬性是 href 屬性,它指定鏈接的目標。 a標簽的語法格式:<a href=https://www.cnblogs.com/summerxbc/p/"指定要跳轉的目標界面的鏈接">需要展示給用戶看見的內容</a> a標簽 在所有瀏覽器中,鏈接的默認外觀如下: 未被訪問的鏈接帶 ......

    uj5u.com 2020-09-10 04:40:11 more
  • 前端輪播圖

    在需要輪播的頁面是引入swiper.min.js和swiper.min.css swiper.min.js地址: 鏈接:https://pan.baidu.com/s/15Uh516YHa4CV3X-RyjEIWw 提取碼:4aks swiper.min.css地址 鏈接:https://pan.b ......

    uj5u.com 2020-09-10 04:40:13 more
  • 如何設定html中的背景圖片(全屏顯示,且不拉伸)

    1 <style>2 body{background-image:url(https://uploadbeta.com/api/pictures/random/?key=BingEverydayWallpaperPicture); 3 background-size:cover;background ......

    uj5u.com 2020-09-10 04:40:16 more
  • Java學習——HTML詳解(上)

    HTML詳解 初識HTML Hyper Text Markup Language(超文本標記語言) 1 <!--DOCTYPE:告訴瀏覽器我們要使用什么規范--> 2 <!DOCTYPE html> 3 <html lang="en"> 4 <head> 5 <!--meta 描述性的標簽,描述一些 ......

    uj5u.com 2020-09-10 04:40:33 more
最新发布
  • 我的第一個NPM包:panghu-planebattle-esm(胖虎飛機大戰)使用說明

    好家伙,我的包終于開發完啦 歡迎使用胖虎的飛機大戰包!! 為你的主頁添加色彩 這是一個有趣的網頁小游戲包,使用canvas和js開發 使用ES6模塊化開發 效果圖如下: (覺得圖片太sb的可以自己改) 代碼已開源!! Git: https://gitee.com/tang-and-han-dynas ......

    uj5u.com 2023-04-20 07:59:23 more
  • 生產事故-走近科學之消失的JWT

    入職多年,面對生產環境,盡管都是小心翼翼,慎之又慎,還是難免捅出簍子。輕則滿頭大汗,面紅耳赤。重則系統停擺,損失資金。每一個生產事故的背后,都是寶貴的經驗和教訓,都是專案成員的血淚史。為了更好地防范和遏制今后的各類事故,特開此專題,長期更新和記錄大大小小的各類事故。有些是親身經歷,有些是經人耳傳口授 ......

    uj5u.com 2023-04-18 07:55:04 more
  • 記錄--Canvas實作打飛字游戲

    這里給大家分享我在網上總結出來的一些知識,希望對大家有所幫助 打開游戲界面,看到一個畫面簡潔、卻又富有挑戰性的游戲。螢屏上,有一個白色的矩形框,里面不斷下落著各種單詞,而我需要迅速地輸入這些單詞。如果我輸入的單詞與螢屏上的單詞匹配,那么我就可以獲得得分;如果我輸入的單詞錯誤或者時間過長,那么我就會輸 ......

    uj5u.com 2023-04-04 08:35:30 more
  • 了解 HTTP 看這一篇就夠

    在學習網路之前,了解它的歷史能夠幫助我們明白為何它會發展為如今這個樣子,引發探究網路的興趣。下面的這張圖片就展示了“互聯網”誕生至今的發展歷程。 ......

    uj5u.com 2023-03-16 11:00:15 more
  • 藍牙-低功耗中心設備

    //11.開啟藍牙配接器 openBluetoothAdapter //21.開始搜索藍牙設備 startBluetoothDevicesDiscovery //31.開啟監聽搜索藍牙設備 onBluetoothDeviceFound //30.停止監聽搜索藍牙設備 offBluetoothDevi ......

    uj5u.com 2023-03-15 09:06:45 more
  • canvas畫板(滑鼠和觸摸)

    <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>canves</title> <style> #canvas { cursor:url(../images/pen.png),crosshair; } #canvasdiv{ bo ......

    uj5u.com 2023-02-15 08:56:31 more
  • 手機端H5 實作自定義拍照界面

    手機端 H5 實作自定義拍照界面也可以使用 MediaDevices API 和 <video> 標簽來實作,和在桌面端做法基本一致。 首先,使用 MediaDevices.getUserMedia() 方法獲取攝像頭媒體流,并將其傳遞給 <video> 標簽進行渲染。 接著,使用 HTML 的 < ......

    uj5u.com 2023-01-12 07:58:22 more
  • 記錄--短視頻滑動播放在 H5 下的實作

    這里給大家分享我在網上總結出來的一些知識,希望對大家有所幫助 短視頻已經無數不在了,但是主體還是使用 app 來承載的。本文講述 H5 如何實作 app 的視頻滑動體驗。 無聲勝有聲,一圖頂百辯,且看下圖: 網址鏈接(需在微信或者手Q中瀏覽) 從上圖可以看到,我們主要實作的功能也是本文要講解的有: ......

    uj5u.com 2023-01-04 07:29:05 more
  • 一文讀懂 HTTP/1 HTTP/2 HTTP/3

    從 1989 年萬維網(www)誕生,HTTP(HyperText Transfer Protocol)經歷了眾多版本迭代,WebSocket 也在期間萌芽。1991 年 HTTP0.9 被發明。1996 年出現了 HTTP1.0。2015 年 HTTP2 正式發布。2020 年 HTTP3 或能正... ......

    uj5u.com 2022-12-24 06:56:02 more
  • 【HTML基礎篇002】HTML之form表單超詳解

    ??一、form表單是什么

    ??二、form表單的屬性

    ??三、input中的各種Type屬性值

    ??四、標簽 ......

    uj5u.com 2022-12-18 07:17:06 more