10-關於DOM的事件操作


一、JavaScript的組成

JavaScript基礎分為三個部分:

  • ECMAScript:JavaScript的語法標准。包括變量、表達式、運算符、函數、if語句、for語句等。

  • DOM:文檔對象模型,操作網頁上的元素的API。比如讓盒子移動、變色、輪播圖等。

  • BOM:瀏覽器對象模型,操作瀏覽器部分功能的API。比如讓瀏覽器自動滾動。

二、事件

JS是以事件驅動為核心的一門語言。

事件的三要素

事件的三要素:事件源、事件、事件驅動程序

比如,我用手去按開關,燈亮了。這件事情里,事件源是:手。事件是:按開關。事件驅動程序是:燈的開和關。

再比如,網頁上彈出一個廣告,我點擊右上角的X,廣告就關閉了。這件事情里,事件源是:X。事件是:onclick。事件驅動程序是:廣告關閉了。

於是我們可以總結出:誰引發的后續事件,誰就是事件源。

總結如下:

  • 事件源:引發后續事件的html標簽。

  • 事件:js已經定義好了(見下圖)。

  • 事件驅動程序:對樣式和html的操作。也就是DOM。

 

代碼書寫步驟如下:(重要)

  • (1)獲取事件源:document.getElementById(“box”); //類似與ios語言的 UIButton *adBtn = [UIButton buttonWithType:UIButtonTypeCustom];

  • (2)綁定事件: 事件源box.事件onclick = function(){ 事件驅動程序 };

  • (3)書寫事件驅動程序:關於DOM的操作

代碼舉例:

<body>
<div id="box1"></div>

<script type="text/javascript">
    // 1、獲取事件源
    var div = document.getElementById("box1");
    // 2、綁定事件
    div.onclick = function () {
        // 3、書寫事件驅動程序
        alert("我是彈出的內容");
    }
</script>

</body>

常見事件如下:

下面針對這事件的三要素,進行分別介紹。

1、獲取事件源的方式(DOM節點的獲取)

獲取事件源的常見方式如下:

 

    var div1 = document.getElementById("box1");      //方式一:通過id獲取單個標簽

    var arr1 = document.getElementsByTagName("div1");     //方式二:通過 標簽名 獲得 標簽數組,所以有s

    var arr2 = document.getElementsByClassName("hehe");  //方式三:通過 類名 獲得 標簽數組,所以有s

  

2、綁定事件的方式

方式一:直接綁定匿名函數

<div id="box1" ></div>

<script type="text/javascript">
    var div1 = document.getElementById("box1");
    //綁定事件的第一種方式
    div1.onclick = function () {
        alert("我是彈出的內容");
    }
</script>

方式二:先單獨定義函數,再綁定

 <div id="box1" ></div>

<script type="text/javascript">
    var div1 = document.getElementById("box1");
    //綁定事件的第二種方式
    div1.onclick = fn;   //注意,這里是fn,不是fn()。fn()指的是返回值。
    //單獨定義函數
    function fn() {
        alert("我是彈出的內容");
    }
</script>

注意上方代碼的注釋。綁定的時候,是寫fn,不是寫fn()。fn代表的是整個函數,而fn()代表的是返回值。

方式三:行內綁定

<!--行內綁定-->
<div id="box1" onclick="fn()"></div>

<script type="text/javascript">

    function fn() {
        alert("我是彈出的內容");
    }

</script>

注意第一行代碼,綁定時,是寫的"fn()",不是寫的"fn"。因為綁定的這段代碼不是寫在js代碼里的,而是被識別成了字符串

3、事件驅動程序

我們在上面是拿alert舉例,不僅如此,我們還可以操作標簽的屬性和樣式。舉例如下:

  <style>
        #box {
            width: 100px;
            height: 100px;
            background-color: pink;
            cursor: pointer;
        }
    </style>
</head>

<body>

<div id="box" ></div>

<script type="text/javascript">
    var oDiv = document.getElementById("box");
    //點擊鼠標時,原本粉色的div變大了,背景變紅了
    oDiv.onclick = function () {
        oDiv.style.width = "200px";   //屬性值要寫引號
        oDiv.style.height = "200px";
        oDiv.style.backgroundColor = "red";   //屬性名是backgroundColor,不是background-Color
    }
</script>

上方代碼的注意事項:

  • 在js里寫屬性值時,要用引號
  • 在js里寫屬性名時,是backgroundColor,不是CSS里面的background-Color。記得所有的像css屬性的text-*,line-*、backgroun-*等在js中都寫成駝峰

onload事件

當頁面加載(文本和圖片)完畢的時候,觸發onload事件。

舉例:

<script type="text/javascript">
    window.onload = function () {
        console.log("小馬哥");  //等頁面加載完畢時,打印字符串
    }
</script>

有一點我們要知道:js的加載是和html同步加載的。因此,如果使用元素在定義元素之前,容易報錯。這個時候,onload事件就能派上用場了,我們可以把使用元素的代碼放在onload里,就能保證這段代碼是最后執行。

建議是:整個頁面上所有元素加載完畢在執行js內容。所以,window.onload可以預防使用標簽在定義標簽之前。

 

事件案例

1、京東頂部廣告欄關閉

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Document</title>
    <style type="text/css">
        *{
            padding: 0;
            margin: 0;
        }
        .top-banner{
            /*position: relative;*/
            background-color: rgb(230, 15, 82);
        }
        .top-banner .w{
            width: 1190px;
            position: relative;
            margin: 0 auto;
        }
        .top-banner .banner{
            display: block;
            width: 100%;
            height: 80px;
            background: url('./close.jpg') no-repeat center 0;
        }
        .top-banner .close{
            position: absolute;
            right: 0;
            top:0;
            text-decoration: none;
            color: white;    
            width: 20px;
            height: 20px;
            line-height: 20px;
            text-align: center;    
        }
        .hide{
            display: none;
        }

    </style>
</head>
<body>
    <div class="top-banner" id="topBanner">
        <div class="w">
            <a href="#" class="banner"></a>
            <a href="#" class="close" id="closeBanner">x</a>
        </div>
    </div>
    <script type="text/javascript">
        // /需求:點擊案例,隱藏盒子。
            //思路:點擊a鏈接,讓top-banner這個盒子隱藏起來(加隱藏類名)。

        window.onload  = function(){
            // /1.獲取事件源和相關元素
            var closeBanner = document.getElementById('closeBanner');
            var topBanner = document.getElementById('topBanner');
            //2.綁定事件
            closeBanner.onclick = function(){
                //3.書寫事件驅動程序
                        //類控制
                //topBanner.className += ' hide';//保留原類名,添加新類名
                //topBanner.className = 'hide';
                //替換舊類名
                topBanner.style.display = 'none';
            }
        }
    </script>

    
</body>
</html>

 

2.要求實現效果:當鼠標懸停在img上時,更換為另外一張圖片;鼠標離開時,還原為本來的圖片。

<!DOCTYPE html>
<html>
<head lang="en">
    <meta charset="UTF-8">
    <title></title>
    <script>
        //window.onload頁面加載完畢以后再執行此代碼
        window.onload = function () {
            //需求:鼠標放到img上,更換為另一張圖片,也就是修改路徑(src的值)。
            //步驟:
            //1.獲取事件源
            //2.綁定事件
            //3.書寫事件驅動程序

            //1.獲取事件源
            var img = document.getElementById("box");
            //2.綁定事件(懸停事件:鼠標進入到事件源中立即出發事件)
            img.onmouseover = function () {
                //3.書寫事件驅動程序(修改src)
                img.src = "image/jd2.png";
//                this.src = "image/jd2.png";
            }

            //1.獲取事件源
            var img = document.getElementById("box");
            //2.綁定事件(懸停事件:鼠標進入到事件源中立即出發事件)
            img.onmouseout = function () {
                //3.書寫事件驅動程序(修改src)
                img.src = "image/jd1.png";
            }
        }
    </script>
</head>
<body>

    <img id="box" src="image/jd1.png" style="cursor: pointer;border: 1px solid #ccc;"/>

</body>
</html>

 


免責聲明!

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



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