七蔓钟、DOM操作

lucky出品 必屬精品

DOM操作

當(dāng)網(wǎng)頁(yè)被加載時(shí)永票,瀏覽器會(huì)創(chuàng)建頁(yè)面的文檔對(duì)象模型(Document Object Model)。

HTML DOM 模型被構(gòu)造為對(duì)象的樹

DOM樹

[圖片上傳失敗...(image-c84426-1632303994282)]

通過可編程的對(duì)象模型滥沫,JavaScript 獲得了足夠的能力來創(chuàng)建動(dòng)態(tài)的 HTML侣集。

  • JavaScript 能夠改變頁(yè)面中的所有 HTML 元素
  • JavaScript 能夠改變頁(yè)面中的所有 HTML 屬性
  • JavaScript 能夠改變頁(yè)面中的所有 CSS 樣式
  • JavaScript 能夠?qū)?yè)面中的所有事件做出反應(yīng)

一、查找 HTML 元素

通常兰绣,通過 JavaScript世分,您需要操作 HTML 元素。

為了做到這件事情缀辩,您必須首先找到該元素臭埋。有三種方法來做這件事:

  • 通過 id 找到 HTML 元素
  • 通過標(biāo)簽名找到 HTML 元素
  • 通過類名找到 HTML 元素

1、通過 id 查找 HTML 元素

在 DOM 中查找 HTML 元素的最簡(jiǎn)單的方法雌澄,是通過使用元素的 id。

本例查找 id="intro" 元素:

實(shí)例

var x=document.getElementById("intro");

如果找到該元素杯瞻,則該方法將以對(duì)象(在 x 中)的形式返回該元素镐牺。

如果未找到該元素,則 x 將包含 null

2魁莉、通過標(biāo)簽名查找 HTML 元素

本例查找 id="main" 的元素睬涧,然后查找 id="main" 元素中的所有 <p> 元素:

實(shí)例

var x=document.getElementById("main");

var y=x.getElementsByTagName("p");

通過類名找到 HTML 元素

本例通過 getElementsByClassName 函數(shù)來查找 class="intro" 的元素:

實(shí)例

var x=document.getElementsByClassName("intro");

二募胃、HTML DOM - 改變 HTML

1、改變 HTML 內(nèi)容(innerHTML/innerText)

修改 HTML 內(nèi)容的最簡(jiǎn)單的方法是使用 innerHTML 屬性畦浓。

如需改變 HTML 元素的內(nèi)容痹束,請(qǐng)使用這個(gè)語(yǔ)法:

document.getElementById(id).innerHTML=新的 HTML

本例改變了 <p>元素的內(nèi)容:

實(shí)例

<html>
<body>
    <p id="p1">Hello World!</p>
<script>
    document.getElementById("p1").innerHTML="新文本!";
</script>
</body>
</html>

實(shí)例講解:

  • 上面的 HTML 文檔含有 id="p1" 的 <h1> 元素
  • 我們使用 HTML DOM 來獲得 id="p1" 的元素
  • JavaScript 更改此元素的內(nèi)容 (innerHTML)

document.getElementById(id).innerText=新的文本內(nèi)容

注意:

  1. innerHTML是可以獲取節(jié)點(diǎn)內(nèi) 標(biāo)簽和內(nèi)容
  2. innerText 只能獲取節(jié)點(diǎn)內(nèi)的文本內(nèi)容
  3. innerHTML可以設(shè)置html和文本一起的內(nèi)容 HTML標(biāo)簽會(huì)被瀏覽器所解析
  4. innerText不可以設(shè)置html和文本一起的內(nèi)容 HTML標(biāo)簽不會(huì)被瀏覽器所解析

2、改變 HTML 屬性 (attribute)

如需改變 HTML 元素的屬性讶请,請(qǐng)使用這個(gè)語(yǔ)法:

document.getElementById(id).attribute=新屬性值

本例改變了 <img> 元素的 src 屬性:

<img id="image" src="smiley.gif">
<script>
document.getElementById("image").src="landscape.jpg";
</script>
<img src="http://img.zcool.cn/community/01f9ea56e282836ac72531cbe0233b.jpg@2o.jpg" onclick="this.src='http://pic.58pic.com/58pic/13/80/78/35V58PICrWD_1024.jpg'" alt="">

注意:在jQuery里不能改變input的type類型 出于安全性祷嘶,只能是只讀 如更改input的type

  • js設(shè)置密碼的顯示隱藏
<input type="text" value="" name="xxx">
<button onclick="pas();">更改為密碼</button>
<button onclick="text();">更改為文本顯示</button>

function pas(){
  var i = document.getElementsByTagName('input')[0];
  i.type = 'password'
}
function text(){
  var i = document.getElementsByTagName('input')[0];
  i.type = 'text'
}

script>
        function change() {
            var input = document.getElementsByTagName('input')[0];
            var span = document.getElementsByTagName('span')[0];
            if(span.innerHTML == '顯示'){
                input.type = 'text';
                span.innerHTML = '隱藏';
            }else{
                input.type = 'password';
                span.innerHTML = '顯示';
            }
        }
    </script>
</head>
<body>
密碼<input type="password"><span onclick="change();">顯示</span>
</body>

三 HTML DOM - 改變CSS

HTML DOM 允許 JavaScript 改變 HTML 元素的樣式。

1夺溢、改變 HTML 樣式 (style.property)

如需改變 HTML 元素的樣式论巍,請(qǐng)使用這個(gè)語(yǔ)法:

document.getElementById(id).style.property=新樣式

實(shí)例

<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title></title>
</head>
<body>
  <p id="p1">Hello World!</p>
  <p id="p2">Hello World!</p>
<script>
  document.getElementById("p2").style.color="blue";
  document.getElementById("p2").style.fontFamily="Arial";
  document.getElementById("p2").style.fontSize="larger";
  document.getElementById("p2").style.backgroundImage="url(2.jpg)";
</script>
    <p>以上段落通過腳本修改。</p>
</body>
</html>
  • 獲取生效style樣式

    window.getComputedStyle("元素", "偽類");

    style = window.getComputedStyle(box, null); //支持IE9+及非IE瀏覽器

    style = window.getComputedStyle(box, null).width;獲取box的width屬性值

    • 和style區(qū)別

      box.style.xxx 只能獲取內(nèi)聯(lián)樣式

    getComputedStyle 獲取的生效樣式可以獲取全局的樣式

    實(shí)例

    <style>
        #div{
            width:200px;
            height: 200px;
        }
    </style>
    <script>
        window.onload = function (ev) {
            var div = document.getElementById('div');
            // console.log(div.style.backgroundColor)
            // console.log(div.style.width)
            var style = window.getComputedStyle(div,null);
            console.log(style.width);
            console.log(style.height);
            console.log(style.backgroundColor);
        }
    </script>
</head>
<body>
<div id="div" style="background-color: red;"></div>
</body>
</html>

2风响、設(shè)置多個(gè)css樣式

  1. 設(shè)置cssText
element.style.cssText = "樣式1;樣式2..."
div.style.cssText = 'width:200px;height: 200px;background-color: red';
  1. 設(shè)置style的屬性
element.setAttribute('style', 'height: 100px !important');
  • 設(shè)置id或者class名稱

    //設(shè)置id
    element.setAttribute('id, 'id名稱');
    element.id = id名稱嘉汰;
    //設(shè)置class
    element.setAttribute('class, 'class名稱');
    element.className = class名稱;
    設(shè)置多個(gè)class
    element.className = '樣式1 樣式2';
    element.setAttribute('class','樣式1 樣式2')
    
  1. 通過add方法添加多個(gè)類名
document.getElementById("myDIV").classList.add("mystyle", "anotherClass", "thirdClass");

classList

classList 屬性返回元素的類名状勤,作為 DOMTokenList 對(duì)象鞋怀。

該屬性用于在元素中添加,移除及切換 CSS 類持搜。

classList 屬性是只讀的密似,但你可以使用 add() 和 remove() 方法修改它。

3朵诫、使用事件

HTML DOM 允許我們通過觸發(fā)事件來執(zhí)行代碼辛友。

比如以下事件:

  • 元素被點(diǎn)擊。
  • 頁(yè)面加載完成剪返。
  • 輸入框被修改废累。

在接下來的章節(jié),你會(huì)學(xué)到更多關(guān)于事件的知識(shí)脱盲。

本例改變了 id="id1" 的 HTML 元素的樣式邑滨,當(dāng)用戶點(diǎn)擊按鈕時(shí):

實(shí)例

<!DOCTYPE html>
<html>
<body>
    <h1 id="id1">我的標(biāo)題 1</h1>
  <button type="button" 
  onclick="document.getElementById('id1').style.color='red'">
  點(diǎn)我!</button>
</body>
</html>

四、HTML DOM 事件

對(duì)事件做出反應(yīng)

我們可以在事件發(fā)生時(shí)執(zhí)行 JavaScript钱反,比如當(dāng)用戶在 HTML 元素上點(diǎn)擊時(shí)掖看。

如需在用戶點(diǎn)擊某個(gè)元素時(shí)執(zhí)行代碼,請(qǐng)向一個(gè) HTML 事件屬性添加 JavaScript 代碼:

onclick=JavaScript

HTML 事件的例子:

  • 當(dāng)用戶點(diǎn)擊鼠標(biāo)時(shí)
  • 當(dāng)網(wǎng)頁(yè)已加載時(shí)
  • 當(dāng)圖像已加載時(shí)
  • 當(dāng)鼠標(biāo)移動(dòng)到元素上時(shí)
  • 當(dāng)輸入字段被改變時(shí)
  • 當(dāng)提交 HTML 表單時(shí)
  • 當(dāng)用戶觸發(fā)按鍵時(shí)

1面哥、onclick 點(diǎn)擊事件

onclick = javascript

實(shí)例

<!DOCTYPE html>
<html>
<body>
    <h1 onclick="this.innerHTML='Ooops!'">點(diǎn)擊文本!</h1>
</body>
</html>

本例從事件處理器調(diào)用一個(gè)函數(shù):

onclick="changetext(this)"

實(shí)例

<script>
  function changetext(id)
  {
      id.innerHTML="Ooops!";
  }
</script>
</head>
<body>
    <h1 onclick="changetext(this)">點(diǎn)擊文本!</h1>
</body>
</html>

2哎壳、使用 HTML DOM 來分配事件

HTML DOM 允許您使用 JavaScript 來向 HTML 元素分配事件:

  • 實(shí)例

    向 button 元素分配 onclick 事件:

    <p>點(diǎn)擊按鈕執(zhí)行 <em>displayDate()</em> 函數(shù).</p>
    <button id="myBtn">點(diǎn)這里</button>
    <script>
    document.getElementById("myBtn").onclick=function(){displayDate()};
    function displayDate(){
      document.getElementById("demo").innerHTML=Date();
    }
    </script>
    <p id="demo"></p>
    
  • 阻止右鍵菜單默認(rèn)行為:

    在之前使用event對(duì)象的button屬性時(shí), 點(diǎn)擊鼠標(biāo)右鍵會(huì)彈出系統(tǒng)菜單, 如果我們想要?jiǎng)?chuàng)建自己的右鍵菜單, 則需要先阻止默認(rèn)的右鍵菜單

    document.oncontextmenu = function(){
          console.log("右鍵被按下");
          return false;
    }
    

    不使用監(jiān)聽事件的停止傳播(不再派發(fā)事件)

  • 當(dāng)標(biāo)簽進(jìn)行嵌套時(shí)

    event.stopPropagation();[prɑp??ɡe??n]

    <script>
            onload = function(){
                var divOne = document.getElementById('divOne');
                var divTwo = document.getElementById('divTwo');
                divOne.onclick = function(){
                    alert('點(diǎn)擊了one');
                }
    
                divTwo.onclick = function(e){
                    alert('點(diǎn)擊了two');
                    e.stopPropagation();//停止時(shí)間的傳播(不在派發(fā)事件)
                
            }
        </script>
    </head>
    <body>
    <div id="divOne">one
        <div id="divTwo">two</div>
    </div>
    

    e是事件,在firefox中只能在事件現(xiàn)場(chǎng)使用window.event尚卫,所以只有把event傳給函數(shù)使用企孩。為了兼容FF和其它瀏覽器怔蚌,一般會(huì)在函數(shù)里重新給e賦值:
    e = window.event || e;
    也就是說,如果window.event存在患整,則該瀏覽器支持直接使用window.event,否在就是不支持,不支持就使用傳進(jìn)來的e。

    e是event,其中包含鼠標(biāo)事件的各種信息
    event 對(duì)象代表事件的狀態(tài)盅蝗,比如事件在其中發(fā)生的元素、鍵盤按鍵的狀態(tài)姆蘸、鼠標(biāo)的位置墩莫、鼠標(biāo)按鈕的狀態(tài)。

    事件通常與函數(shù)結(jié)合使用乞旦,函數(shù)不會(huì)在事件發(fā)生前被執(zhí)行贼穆!

3、onload 和 onunload 事件

onload 事件會(huì)在頁(yè)面或圖像加載完成后立即發(fā)生兰粉。

onload 和 onunload 事件會(huì)在用戶進(jìn)入或離開頁(yè)面時(shí)被觸發(fā)故痊。

onload 事件可用于檢測(cè)訪問者的瀏覽器類型和瀏覽器版本,并基于這些信息來加載網(wǎng)頁(yè)的正確版本玖姑。

onload 和 onunload(了解) 事件可用于處理 cookie愕秫。

onunload 關(guān)閉當(dāng)前頁(yè)面的操作時(shí)候的操作(了解)

實(shí)例:

<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
    <title></title>
</head>
<body onload="checkCookies()">
<script>
function checkCookies(){
    if (navigator.cookieEnabled==true){
        alert("Cookies 可用")
    }
    else{
        alert("Cookies 不可用")
    }
}
</script>
    <p>彈窗-提示瀏覽器 cookie 是否可用。</p>
</body>
</html>

4焰络、onchange 當(dāng)文本框(input 或 textarea)內(nèi)容改變且失去焦點(diǎn)后觸發(fā)戴甩。

onchange 事件常結(jié)合對(duì)輸入字段的驗(yàn)證來使用。

下面是一個(gè)如何使用 onchange 的例子闪彼。當(dāng)用戶改變輸入字段的內(nèi)容時(shí)甜孤,會(huì)調(diào)用 upperCase() 函數(shù)。

實(shí)例

<script>
  function upperCase(){
    var x=document.getElementById("fname");
    x.value=x.value.toUpperCase();
  }
</script>
<body>
    <input type="text" id="fname" onchange="upperCase()">
    <select onchange="alert(this.value);">
      <option value="1">北京</option>
</body>    
----------------------------------------------------------------------------------------
<script>
  function upperCase(this){
    this.value=this.value.toUpperCase();
  }
</script>
<body>
<input type="text" id="fname" onchange="upperCase(this)">
</body>    
<input type="text" id="fname" onchange="this.value = this.value.toUpperCase();">

onselect:當(dāng)用戶選擇文本框(input 或 textarea)中的內(nèi)容觸發(fā)

<script>
function showMsg()
{
alert("您選中了一些文本畏腕!");
}
</script>
</head>
<body>

一些文本:<input type="text" value="請(qǐng)選中我缴川!" onselect="showMsg()">

<p>函數(shù) showMsg() 在輸入字段中的文本被選中時(shí)觸發(fā)。此函數(shù)顯示一段消息描馅。</p>

5把夸、 onfocus/onblur 獲取焦點(diǎn)/失去焦點(diǎn)

輸入框獲取焦點(diǎn) 的事件

實(shí)例:

<script>
function myFunction(x){
    x.style.background="yellow";
}
</script>

輸入你的名字: <input type="text" onfocus="myFunction(this)" onblur="this.style.backgroundColor='red'">
<p>當(dāng)輸入框獲取焦點(diǎn)時(shí),修改背景色(background-color屬性) 將被觸發(fā)铭污。</p>

6恋日、onmouseover 和 onmouseout 事件

onmouseover 和 onmouseout 事件可用于在用戶的鼠標(biāo)移至 HTML 元素上方或移出元素時(shí)觸發(fā)函數(shù)。

實(shí)例:

<div onmouseover="mOver(this)" onmouseout="mOut(this)" style="background-color:#D94A38;width:120px;height:20px;padding:40px;">Mouse Over Me</div>
<script>
function mOver(obj){
    obj.innerHTML="Thank You"
}
function mOut(obj){
    obj.innerHTML="Mouse Over Me"
}
</script>

7嘹狞、onmouseenter 和 onmouseleave 事件

事件可用于在用戶的鼠標(biāo)移至 HTML 元素上方或移出元素時(shí)觸發(fā)函數(shù)岂膳。

over 和 enter的區(qū)別

  1. 如果元素沒有子元素的時(shí)候,效果完全一樣

  2. 如果元素包含子元素

    當(dāng)由父元素進(jìn)入子元素的時(shí)候磅网,over會(huì)繼續(xù)觸發(fā)

    over實(shí)際上只要在跨越邊界的時(shí)候谈截,就會(huì)進(jìn)行觸發(fā)

  • onmousemove

    鼠標(biāo)移動(dòng)

    實(shí)例(包含了onmousemove onmouseenter. onmouseover)

    <style>
    div {
        width: 100px;
        height: 100px;
        border: 1px solid black;
        margin: 10px;
        float: left;
        padding: 30px;d
        text-align: center;
        background-color: lightgray;
    }
    p {
        background-color: white;
    }
    </style>
    </head>
    <body>
    <h3>該實(shí)例演示了 onmousemove, onmouseenter 和 onmouseover 的不同。</h3>
    <p> onmousemove 事件在鼠標(biāo)移動(dòng)到 div 元素上時(shí)觸發(fā)。</p>
    <p> mouseenter 事件中有在鼠標(biāo)指針進(jìn)入 div 元素時(shí)觸發(fā)傻盟。 </p>
    <p> onmouseover 事件在鼠標(biāo)指針進(jìn)入 div 元素時(shí)觸發(fā),在子元素上也會(huì)觸發(fā)(p 和 span)。</p>
    <div onmousemove="myMoveFunction()">
      <p>onmousemove: <br> <span id="demo">鼠標(biāo)移動(dòng)到我這!</span></p>
    </div>
    <div onmouseenter="myEnterFunction()">
      <p>onmouseenter: <br> <span id="demo2">鼠標(biāo)移動(dòng)到我這!</span></p>
    </div>
    <div onmouseover="myOverFunction()">
      <p>onmouseover: <br> <span id="demo3">鼠標(biāo)移動(dòng)到我這!</span></p>
    </div>
    <script>
    x = 0;
    y = 0;
    z = 0;
    function myMoveFunction() {
        document.getElementById("demo").innerHTML = z+=1;
    }
    function myEnterFunction() {
        document.getElementById("demo2").innerHTML = x+=1;
    }
    function myOverFunction() {
        document.getElementById("demo3").innerHTML = y+=1;
    }
    </script>
    

8嫂丙、onmousedown娘赴、onmouseup 以及 onclick 事件

onmousedown, onmouseup 以及 onclick 構(gòu)成了鼠標(biāo)點(diǎn)擊事件的所有部分。首先當(dāng)點(diǎn)擊鼠標(biāo)按鈕時(shí)跟啤,會(huì)觸發(fā) onmousedown 事件诽表,當(dāng)釋放鼠標(biāo)按鈕時(shí),會(huì)觸發(fā) onmouseup 事件隅肥,最后竿奏,當(dāng)完成鼠標(biāo)點(diǎn)擊時(shí),會(huì)觸發(fā) onclick 事件腥放。

實(shí)例:

<p onmousedown="this.innerHTML='mousedown'" onmouseup="this.innerHTML='out了'">點(diǎn)擊</p>
<h1 onclick="console.log(this)" onmousedown="console.log('over')" onmouseup="console.log('up')">點(diǎn)擊文本!</h1>

9泛啸、事件對(duì)象 event(隱藏參數(shù))

鼠標(biāo)事件

clientX: 瀏覽器可視區(qū)域的x坐標(biāo)

clientY: 瀏覽器可視區(qū)域的y坐標(biāo)

clientX:跟screenX相比就是將參照點(diǎn)改成了瀏覽器內(nèi)容區(qū)域的左上角,該參照點(diǎn)會(huì)隨之滾動(dòng)條的移動(dòng)而移動(dòng)秃症。

pageX: 瀏覽器內(nèi)容區(qū)域的x坐標(biāo)

pageY: 瀏覽器內(nèi)容區(qū)域的y坐標(biāo)

pageX:參照點(diǎn)也是瀏覽器內(nèi)容區(qū)域的左上角候址,但它不會(huì)隨著滾動(dòng)條而變動(dòng)

screenX: 顯示器屏幕的x坐標(biāo)

screenY: 顯示器屏幕的y坐標(biāo)

screenX:鼠標(biāo)位置相對(duì)于用戶屏幕水平偏移量,而screenY也就是垂直方向的种柑,此時(shí)的參照點(diǎn)也就是原點(diǎn)是屏幕的左上角岗仑。

offsetX: 鼠標(biāo)點(diǎn)擊的元素位置距離元素左邊界的x坐標(biāo)

offsetY: 鼠標(biāo)點(diǎn)擊的元素位置距離元素上邊界的y坐標(biāo)

例如:

document.onmousedown= function(evt) {
       var e = evt ; 
       console.log(e.clientX + ',' + e.clientY); 
       console.log(e.screenX + ',' + e.screenY);
       console.log(e.pageX + “,” + e.pageY);
};

10、鍵盤事件

  • onkeydown 鍵盤按住不放會(huì)一直觸發(fā) 任意鍵
  • onkeypress 鍵盤按住不放會(huì)一直觸發(fā) 字符鍵
  • onkeyup:當(dāng)用戶釋放鍵盤上的某個(gè)鍵觸發(fā)聚请。

鍵碼 : keyCode屬性

  所有按鍵(包括功能鍵control, alt,shift, tab, 方向鍵等, 不包括亮度,音量..的按鍵)在發(fā)生 keydown和keyup 事件時(shí)荠雕,event對(duì)象的 keyCode屬性中會(huì)包含一個(gè)代碼,與鍵盤上一個(gè)特定的鍵對(duì)應(yīng)驶赏。對(duì)數(shù)字字母字符集炸卑,keyCode屬性的值與 ASCII 碼中對(duì)應(yīng).

document.onkeydown = function(evt) {

    var e = evt ;

    console.log(e.keyCode);  //按任意鍵,得到相應(yīng)的 keyCode 

String.fromCharCode(e.keyCode) //獲對(duì)應(yīng)字符

};

注意: 大寫字母或小寫的編碼相同, 都為大寫字母矾兜。

字符編碼: charCode屬性

  Firefox,Chrome和Safari的event對(duì)象支持charCode屬性,只有按下字符鍵并且使用keypress事件時(shí)才會(huì)得到charCode,這個(gè)charCode的值和UniCode碼對(duì)應(yīng),和keyCode也類似,但是charCode的字母區(qū)分大小寫.(字符鍵:數(shù)字,字母(區(qū)分大小寫),字符,空格,回車)

實(shí)例

document.onkeypress =function(evt) { 
      var e= evt ;
      console.log(e.charCode);

}

注:可以使用String.fromCharCode()將 Unicode編碼轉(zhuǎn)換成實(shí)際的字符

11、HTML DOM EventListener 事件監(jiān)聽

可以對(duì)一個(gè)element綁定多個(gè)同樣的事件 且不會(huì)被覆蓋

  • addEventListener() 方法

    語(yǔ)法

    element.addEventListener(event, function, useCapture);

    第一個(gè)參數(shù)是事件的類型 (如 "click" 或 "mousedown").

    第二個(gè)參數(shù)是事件觸發(fā)后調(diào)用的函數(shù)患久。

    第三個(gè)參數(shù)是個(gè)布爾值用于描述事件是冒泡還是捕獲篙挽。該參數(shù)是可選的敞峭。

    • 實(shí)例:

    在用戶點(diǎn)擊按鈕時(shí)觸發(fā)監(jiān)聽事件:

    //使用函數(shù)名沉迹,來引用外部函數(shù):
    <p>該實(shí)例使用 addEventListener() 方法在按鈕中添加點(diǎn)擊事件。 </p>
    <button id="myBtn">點(diǎn)我</button>
    <p id="demo"></p>
    <script>
      document.getElementById("myBtn").addEventListener("click", displayDate);
      function displayDate() {
          document.getElementById("demo").innerHTML = Date();
      }
    </script>
    //直接添加函數(shù)體
    element.addEventListener("click", function(){ alert("Hello World!"); });
    
    //不使用事件監(jiān)聽的情況
    window.onload = function(){ 
     var btn = document.getElementById("myBtn"); 
     btn.onclick = function(){ 
      alert("第一個(gè)事件"); 
     } 
     btn.onclick = function(){ 
      alert("第二個(gè)事件"); 
     } 
     btn.onclick = function(){ 
      alert("第三個(gè)事件"); 
     } 
    }
    最后只輸出:第三個(gè)事件刻坊,因?yàn)楹笠粋€(gè)方法都把前一個(gè)方法覆蓋掉了
    
[圖片上傳失敗...(image-461478-1632303994283)] 注意:不要使用 "on" 前綴灾而。 例如锡搜,使用 "click" ,而不是使用 "onclick"肠缔。
  • 向同一個(gè)元素中添加多個(gè)事件句柄

    addEventListener() 方法允許向同一個(gè)元素添加多個(gè)事件,且不會(huì)覆蓋已存在的事件:

    • 實(shí)例

      element.addEventListener("click", myFunction);
      element.addEventListener("click", mySecondFunction);
      

      你可以向同個(gè)元素添加不同類型的事件:

    • 實(shí)例

      element.addEventListener("mouseover", myFunction);
      element.addEventListener("click", mySecondFunction);
      element.addEventListener("mouseout", myThirdFunction);
      
  • 向 Window 對(duì)象添加事件句柄

    addEventListener() 方法允許你在 HTML DOM 對(duì)象添加事件監(jiān)聽行疏, HTML DOM 對(duì)象如: HTML 元素, HTML 文檔, window 對(duì)象柳譬【俗或者其他支出的事件對(duì)象如: xmlHttpRequest 對(duì)象。

    • 實(shí)例

    當(dāng)用戶重置窗口大小時(shí)添加事件監(jiān)聽:

    window.addEventListener("resize", function(){
        document.getElementById("demo").innerHTML = document.body.scrollWidth+''+document.body.scrollHeight;
    });
    
  • 傳遞參數(shù)

當(dāng)傳遞參數(shù)值時(shí)附鸽,使用"匿名函數(shù)"調(diào)用帶參數(shù)的函數(shù):

<button id="myBtn">點(diǎn)我</button>
<p id="demo"></p>
<script>
var p1 = 5;
var p2 = 7;
document.getElementById("myBtn").addEventListener("click", function() {
    myFunction(p1, p2);
});
function myFunction(a, b) {
    var result = a * b;
    document.getElementById("demo").innerHTML = result;
}
</script>
  • 事件冒泡或事件捕獲赌蔑?

事件傳遞有兩種方式:冒泡與捕獲。

事件傳遞定義了元素事件觸發(fā)的順序椎例。 如果你將<p> 元素插入到 <div> 元素中慎陵,用戶點(diǎn)擊 <p> 元素, 哪個(gè)元素的 "click" 事件先被觸發(fā)呢过牙?

冒泡 中撵溃,內(nèi)部元素的事件會(huì)先被觸發(fā)疚鲤,然后再觸發(fā)外部元素,即:<p> 元素的點(diǎn)擊事件先觸發(fā)缘挑,然后會(huì)觸發(fā) <div> 元素的點(diǎn)擊事件集歇。

捕獲 中,外部元素的事件會(huì)先被觸發(fā)卖哎,然后才會(huì)觸發(fā)內(nèi)部元素的事件,即: <div> 元素的點(diǎn)擊事件先觸發(fā) 删性,然后再觸發(fā) <p> 元素的點(diǎn)擊事件亏娜。

addEventListener() 方法可以指定 "useCapture" 參數(shù)來設(shè)置傳遞類型:

addEventListener(event, function, useCapture);

默認(rèn)值為 false, 即冒泡傳遞,當(dāng)值為 true 時(shí), 事件使用捕獲傳遞蹬挺。

實(shí)例:

<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<style>
div {
    background-color: coral;
    border: 1px solid;
    padding: 50px;
}
</style>
</head>
<body>
<p>實(shí)例演示了在添加不同事件監(jiān)聽時(shí)维贺,冒泡與捕獲的不同。</p>
<div id="myDiv">
    <p id="myP">點(diǎn)擊段落巴帮,我是冒泡溯泣。</p>
</div><br>
<div id="myDiv2">
    <p id="myP2">點(diǎn)擊段落,我是捕獲榕茧。 </p>
</div>
<script>
  document.getElementById("myP").addEventListener("click", function() {
      alert("你點(diǎn)擊了 P 元素!");
  }, false);
  document.getElementById("myDiv").addEventListener("click", function() {
      alert(" 你點(diǎn)擊了 DIV 元素 !");
  }, false);
  document.getElementById("myP2").addEventListener("click", function() {
      alert("你點(diǎn)擊了 P2 元素!");
  }, true);
  document.getElementById("myDiv2").addEventListener("click", function() {
      alert("你點(diǎn)擊了 DIV2 元素 !");
  }, true);
</script>
</body>
</html>

組織當(dāng)標(biāo)簽嵌套時(shí)候的冒泡擴(kuò)散

   <script>
        onload = function () {
            var divOne = document.getElementById('div_one');
            var divTwo = document.getElementById('div_two');
            divOne.style.cssText = 'width:100%;height:400px;background-color:red;';
            divTwo.style.cssText = 'width:100%;height:200px;background-color:green;';
            divOne.addEventListener('click',function (evt) {
                console.log('紅')
            })
            divTwo.addEventListener('click',function (evt) {
                console.log('綠')
                evt.stopPropagation();//阻止擴(kuò)散
            })
        };
    </script>
</head>
<body>
<div id="div_one">
    <div id="div_two"></div>
</div>
</body>
</html>
  • removeEventListener() 方法

    removeEventListener() 方法移除由 addEventListener() 方法添加的事件句柄:

    element.removeEventListener("mousemove", myFunction);

    實(shí)例

    <!DOCTYPE html>
    <html>
    <head>
    <meta charset="utf-8">
    </head>
    <head>
    <style>
    #myDIV {
        background-color: coral;
        border: 1px solid;
        padding: 50px;
        color: white;
    }
    </style>
    </head>
    <body>
    
    <div id="myDIV"> div 元素添加了 onmousemove 事件句柄垃沦,鼠標(biāo)在桔紅色的框內(nèi)移動(dòng)時(shí)會(huì)顯示隨機(jī)數(shù)。
      <p>點(diǎn)擊按鈕移除 DIV 的事件句柄用押。</p>
      <button onclick="removeHandler()" id="myBtn">點(diǎn)我</button>
    </div>
    <p id="demo"></p>
    <script>
    document.getElementById("myDIV").addEventListener("mousemove", myFunction);
    function myFunction() {
        document.getElementById("demo").innerHTML = Math.random();
          document.getElementById("demo").style.backgroundColor = 'rgb('+Math.floor(255*Math.random())+','+Math.floor(255*Math.random())+','+Math.floor(255*Math.random());
    }
    function removeHandler() {
        document.getElementById("myDIV").removeEventListener("mousemove", myFunction);
    }
    </script>
    </body>
    </html>
    

12肢簿、HTML DOM 元素(節(jié)點(diǎn))

創(chuàng)建新的 HTML 元素

如需向 HTML DOM 添加新元素,您必須首先創(chuàng)建該元素(元素節(jié)點(diǎn))蜻拨,然后向一個(gè)已存在的元素追加該元素池充。

  1. 創(chuàng)建節(jié)點(diǎn)

    document.createElement('標(biāo)簽名')

  2. 創(chuàng)建文本節(jié)點(diǎn)

    document.createTextNode("文本內(nèi)容")

  3. 添加節(jié)點(diǎn)

    節(jié)點(diǎn)名.appendChild("node")

    或者

    節(jié)點(diǎn)名.innerText = '文本的內(nèi)容';

  4. 從父元素中刪除子元素

    parent.removeChild(child);

    例如:

    var child=document.getElementById("p1");
    child.parentNode.removeChild(child);

    ul.removeChild(ul.lastElementChild);//刪除節(jié)點(diǎn)

  5. cloneNode() 方法

    定義和用法

    cloneNode() 方法創(chuàng)建節(jié)點(diǎn)的拷貝,并返回該副本缎讼。

    cloneNode(true) 方法克隆所有屬性以及它們的值收夸。

    如果您需要克隆所有后代,請(qǐng)把 deep 參數(shù)設(shè)置 true血崭,否則設(shè)置為 false卧惜。

    實(shí)例

    <ul>
        <li>1</li>
        <li>2</li>
        <li>3</li>
        <li>4</li>
    </ul>
    <hr>
    <ul>
    </ul>
    <script>
        var node = document.getElementsByTagName('ul')[0];
        var node1 = document.getElementsByTagName('ul')[1];
        var newLi = document.createElement('li')
        newLi.innerText = '新的'
        l = node.children.length;
        for(var i=0;i<l;i++){
            var x = node.children[i].cloneNode(true);
            node1.appendChild(x)
        }
    </script>
    
  1. element.replaceChild() 替換元素中的子節(jié)點(diǎn)

    document.getElementById("myList").replaceChild(newnode,oldnode);
    

    實(shí)例

    document.getElementById("ul").replaceChild(document.getElementsByTagName('li')[1]
            ,document.getElementsByTagName('li')[0]);
    
  1. 獲取父節(jié)點(diǎn)

    node.parentNode

  2. 獲取父類的第一個(gè)節(jié)點(diǎn)/最后一個(gè)

    node.parentNode.firstChild 如果父類換行才是第一個(gè)子標(biāo)簽 那么會(huì)是空白

    node.parentNode.lastChild 獲取最后一個(gè)節(jié)點(diǎn)

    firstChild//第一個(gè)HTML存在換行則會(huì)獲取空白節(jié)點(diǎn)
    lastChild//最后一個(gè)HTML存在換行則會(huì)獲取空白節(jié)點(diǎn)
    firstElementChild  
    lastElementChild  
    

    注意:因?yàn)榈谝粋€(gè)是空白節(jié)點(diǎn) 原因是 代碼換行 如果不換行第一個(gè)就是正常的標(biāo)簽

  3. 前一個(gè)同胞節(jié)點(diǎn)

    previousSibling 如果前一個(gè)HTML存在換行則會(huì)獲取空白節(jié)點(diǎn)

    previousElementSibling 前一個(gè)兄弟節(jié)點(diǎn)是否換行不會(huì)造成影響

    注釋:如果沒有 previousSibling 節(jié)點(diǎn)厘灼,則返回值是 null。

  4. 后一個(gè)同胞節(jié)點(diǎn)

nextElementSibling 后一個(gè)兄弟節(jié)點(diǎn)是否換行不會(huì)造成影響

  1. 獲取所有子節(jié)點(diǎn)

    node.children

  2. 返回元素的標(biāo)簽名序苏。

    element.tagName

  3. 從元素中移除指定屬性

    removeAttribute(name)

    console.log(document.getElementById("ul").removeAttribute('id'));
    
  4. 在指定的已有的子節(jié)點(diǎn)之前插入新節(jié)點(diǎn)手幢。

    element.insertBefore(新的節(jié)點(diǎn),插入節(jié)點(diǎn)的位置)

    <ul id="myList"><li>Coffee</li><li>Tea</li></ul>
    <p id="demo">請(qǐng)點(diǎn)擊按鈕向列表插入一個(gè)項(xiàng)目。</p>
    <button onclick="myFunction()">試一下</button>
    <script>
      function myFunction()
      {
      var newItem=document.createElement("LI")
      var textnode=document.createTextNode("Water")
      newItem.appendChild(textnode)
    
      var list=document.getElementById("myList")
      list.insertBefore(newItem,list.childNodes[0]);
      }
    </script>
    

節(jié)點(diǎn)添加

實(shí)例

<div id="div1">
  <p id="p1">這是一個(gè)段落忱详。</p>
  <p id="p2">這是另一個(gè)段落围来。</p>
</div>
<script>
  var para=document.createElement("p");
  var node=document.createTextNode("這是一個(gè)新段落。");
  para.appendChild(node);
  var element=document.getElementById("div1");
  element.appendChild(para);
</script>
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末匈睁,一起剝皮案震驚了整個(gè)濱河市监透,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌航唆,老刑警劉巖胀蛮,帶你破解...
    沈念sama閱讀 218,451評(píng)論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異糯钙,居然都是意外死亡粪狼,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,172評(píng)論 3 394
  • 文/潘曉璐 我一進(jìn)店門任岸,熙熙樓的掌柜王于貴愁眉苦臉地迎上來再榄,“玉大人,你說我怎么就攤上這事享潜±福” “怎么了?”我有些...
    開封第一講書人閱讀 164,782評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵剑按,是天一觀的道長(zhǎng)疾就。 經(jīng)常有香客問我,道長(zhǎng)艺蝴,這世上最難降的妖魔是什么猬腰? 我笑而不...
    開封第一講書人閱讀 58,709評(píng)論 1 294
  • 正文 為了忘掉前任,我火速辦了婚禮猜敢,結(jié)果婚禮上漆诽,老公的妹妹穿的比我還像新娘。我一直安慰自己锣枝,他們只是感情好厢拭,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,733評(píng)論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著撇叁,像睡著了一般供鸠。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上陨闹,一...
    開封第一講書人閱讀 51,578評(píng)論 1 305
  • 那天楞捂,我揣著相機(jī)與錄音薄坏,去河邊找鬼。 笑死寨闹,一個(gè)胖子當(dāng)著我的面吹牛胶坠,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播繁堡,決...
    沈念sama閱讀 40,320評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼沈善,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了椭蹄?” 一聲冷哼從身側(cè)響起闻牡,我...
    開封第一講書人閱讀 39,241評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎绳矩,沒想到半個(gè)月后罩润,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,686評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡翼馆,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,878評(píng)論 3 336
  • 正文 我和宋清朗相戀三年割以,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片应媚。...
    茶點(diǎn)故事閱讀 39,992評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡严沥,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出珍特,到底是詐尸還是另有隱情祝峻,我是刑警寧澤魔吐,帶...
    沈念sama閱讀 35,715評(píng)論 5 346
  • 正文 年R本政府宣布扎筒,位于F島的核電站,受9級(jí)特大地震影響酬姆,放射性物質(zhì)發(fā)生泄漏嗜桌。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,336評(píng)論 3 330
  • 文/蒙蒙 一辞色、第九天 我趴在偏房一處隱蔽的房頂上張望骨宠。 院中可真熱鬧,春花似錦相满、人聲如沸层亿。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,912評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)匿又。三九已至,卻和暖如春建蹄,著一層夾襖步出監(jiān)牢的瞬間碌更,已是汗流浹背裕偿。 一陣腳步聲響...
    開封第一講書人閱讀 33,040評(píng)論 1 270
  • 我被黑心中介騙來泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留痛单,地道東北人嘿棘。 一個(gè)月前我還...
    沈念sama閱讀 48,173評(píng)論 3 370
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像旭绒,于是被迫代替她去往敵國(guó)和親鸟妙。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,947評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容