1. 程式人生 > 實用技巧 >【JavaWeb】JavaScript 基礎

【JavaWeb】JavaScript 基礎

JavaScript 基礎

事件

事件是指輸入裝置與頁面之間進行互動的響應。

常用的事件

  • onload 載入完成事件:頁面載入完成之後,常用於頁面 js 程式碼初始化操作;
  • onclick 單擊事件:常用於按鈕的點選響應操作;
  • onblur 失去焦點事件:常用於輸入框失去焦點後驗證其輸入內容是否合法;
  • onchange 內容發生改變事件:常用於下拉列表和輸入框內容發生改變後操作;
  • onsubmit 表單提交事件:常用於表單提交前,驗證所有表單項是否合法。

事件的註冊(繫結):告訴瀏覽器,當事件響應後需要執行哪些操作程式碼。分為兩種型別:

  • 靜態註冊事件:通過 html 標籤的事件屬性直接賦予事件響應後的程式碼;
  • 動態註冊事件:先通過 js 程式碼得到標籤的 DOM 物件,然後再通過 物件.事件名 = funciton() {} 這種形式賦予事件響應後的程式碼。基本步驟:
    • 獲取標籤 DOM 物件
    • 物件.事件名 = funciton() {}

onload

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>onload 載入完成事件</title>
    <script type="text/javascript">
        // 靜態註冊
        function onLoadFun() {
            alert("靜態註冊 onload 事件");
        }

        // 動態註冊
        window.onload = function () {
            alert("動態註冊 onload 事件");
        }
    </script>
</head>
<!--onload 事件是瀏覽器解析完頁面之後就會自動觸發的事件-->
<body onload="onLoadFun()">

</body>
</html>

onclick

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>onclick 單擊事件</title>
    <script type="text/javascript">
        function onClickFun() {
            alert("靜態註冊 onclick 事件");
        }

        window.onload = function () {
            // 1.
            let btnObj = document.getElementById("btn02");
            // 2.
            btnObj.onclick = function () {
                alert("動態註冊 onclick 事件");
            }
        }
    </script>
</head>
<body>

    <button onclick="onClickFun()">按鈕1</button>
    <button id="btn02">按鈕2</button>

</body>
</html>

onblur

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>onblur 失去焦點事件</title>
    <script type="text/javascript">
        // console 是控制檯物件,是由 JavaScript 語言提供,專門用來向瀏覽器的控制器列印輸出, 用於測試使用
        function onBlurFun() {
            console.log("靜態註冊 onblur 事件");
        }

        window.onload = function () {
            let element = document.getElementById("password");
            element.onblur = function () {
                console.log("動態註冊 onblur 事件");
            }
        }
    </script>
</head>
<body>

    <table>
        <tr>
            <th>使用者名稱</th>
            <th><input type="text" onblur="onBlurFun()"></th>
        </tr>
        <tr>
            <th>密碼</th>
            <th><input type="password" id="password"></th>
        </tr>
    </table>

</body>
</html>

onchange

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>onchange 內容發生改變事件</title>
    <script type="text/javascript">
        function onChangeFun() {
            alert("最喜歡的程式語言已變化!")
        }

        window.onload = function () {
            let tools = document.getElementById("tools");
            tools.onchange = function () {
                alert("最喜歡的開發工具已變化!")
            }
        }

    </script>
</head>
<body>

    <label>
        請選擇你最喜歡的程式語言:
        <select onchange="onChangeFun()">
            <option>Java</option>
            <option selected="selected">Python</option>
            <option>JavaScript</option>
            <option>C++</option>
        </select>
    </label>

    <br>

    <label for="tools">請選擇你最喜歡的開發工具:</label><select id="tools">
        <option>IDEA</option>
        <option>VSCode</option>
        <option>Vim</option>
        <option>GitHub</option>
    </select>

</body>
</html>

onsubmit

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>onsubmit 表單提交事件</title>
    <script type="text/javascript">
        function onSubmitFun() {
            // 要驗證所有表單項是否合法,如果,有一個不合法就阻止表單提交
            alert("靜態登錄檔單提交事件 - 發現不合法");
            return false;
        }

        window.onload = function () {
            let form1 = document.getElementById("form1");
            form1.onsubmit = function () {
                alert("靜態登錄檔單提交事件 - 發現合法");
                return true;
            }

        }
    </script>
</head>
<body>

    <!--return false 可以阻止 表單提交 -->
    <form action="http://localhost:8080" method="get" onsubmit="return onSubmitFun()">
        <input type="submit" name="submit" value="靜態註冊">
    </form>
    <form action="http://localhost:8080" method="post" id="form1">
        <input type="submit" name="submit" value="動態註冊">
    </form>

</body>
</html>

DOM

DOM(Document Object Model),即文件物件模型。它把 HTML 文件中的標籤,屬性,文字等轉換成物件來管理。

Document 物件

對 Document 物件的理解:

  • Document 它管理了所有的 HTML 文件內容;
  • Document 是一種樹結構的文件,有層級關係;
  • Document 把所有的標籤都物件化
<body>
    <div id="div01">div01</div>
</body>

以上的 html 標籤物件化,相當於:

class DOM {
    private String id;  // id 屬性
    private String tagNmae; // 標籤名
    private DOM parentNode; // 父節點
    private List<DOM> childrens;    // 孩子節點
    private String innerHTML;   // 起始標籤和結束標籤中間的內容
}

Document 物件的常用方法

  • document.getElementById(elementId) 通過標籤的 id 屬性查詢標籤的 DOM 物件引用,elementId 是標籤的 id 屬性值;
  • document.getElementsByname(elementName) 通過標籤的 name 屬性查詢標籤的 DOM 物件集合,elementName 是標籤的 name 屬性值;
  • document.getElementsByTagName(tagName) 通過標籤名查詢標籤 DOM 物件集合,tagName 是標籤名;
  • document.createElement(tagName) 通過給定的標籤名,建立一個標籤物件,tagName 是要建立的標籤名。

注意:Document 物件的三個查詢方法,如果有 id 屬性,優先使用 getElementById 方法來進行查詢。如果沒有 id 屬性,則優先使用 getElementsByName 方法來進行查詢。如果 id 屬性和 name 屬性都沒有最後再按標籤名來進行查詢 getElementsByTagName。而且,一定要在頁面載入完成之後執行,才能查詢到標籤物件。


<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>getElementById 方法示例</title>
    <style type="text/css">
        img {
            width: 18px;
            height: 18px;
        }
    </style>
    <script type="text/javascript">
        // 當用戶點選了較驗按鈕,要獲取輸出框中的內容。然後驗證其是否合法。
        // 驗證的規則是:必須由字母,數字。下劃線組成。並且長度是 5 到 12 位。
        function onClickFun() {
            let username = document.getElementById("username");
            let usernameText = username.value;

            // 正則表示式
            let pattern = /^\w{5,12}$/;

            let usernameSpan = document.getElementById("usernameSpan");
            usernameSpan.innerHTML = "Hello World!";

            if (pattern.test(usernameText)) {
                // usernameSpan.innerHTML = "使用者名稱合法!";
                usernameSpan.innerHTML = "<img src=\"../img/right.png\" alt=\"資源不存在\">";

            } else {
                // usernameSpan.innerHTML = "使用者名稱不合法!";
                usernameSpan.innerHTML = "<img src=\"../img/wrong.png\" alt=\"資源不存在\">";
            }
        }
    </script>
</head>
<body>

    <label for="username">使用者名稱:</label><input type="text" id="username" value="xxx"/>
    <button onclick="onClickFun()">校驗</button>
    <span id="usernameSpan" style="color: red">

    </span>

</body>
</html>

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>getElementsByName 方法示例</title>
    <script type="text/javascript">
        // 實現 全選 全不選 反選
        // document.getElementsByName() 是根據 指定的 name 屬性查詢返回多個標籤物件集合
        // 這個集合的操作跟陣列一樣,集合中每個元素都是 dom 物件
        let lang = document.getElementsByName("lang");

        function checkAll() {
            for (let i = 0; i < lang.length; i++) {
                lang[i].checked = true;
            }
        }

        function checkNo() {
            for (let i = 0; i < lang.length; i++) {
                lang[i].checked = false;
            }
        }

        function checkReverse() {
            for (let i = 0; i < lang.length; i++) {
                lang[i].checked = !lang[i].checked;
            }
        }
    </script>
</head>
<body>

    喜歡的程式語言:
    <label>
        <input type="checkbox" name="lang" value="java" checked="checked">
    </label>Java
    <label>
        <input type="checkbox" name="lang" value="cpp">
    </label>C++
    <label>
        <input type="checkbox" name="lang" value="python">
        Python
    </label>
    <label>
        <input type="checkbox" name="lang" value="js">
        JavaScript
    </label>

    <br>

    <button onclick="checkAll()">全選</button>
    <button onclick="checkNo()">全不選</button>
    <button onclick="checkReverse()">反選</button>


</body>
</html>

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>getElementsByTagName 方法示例</title>
    <script type="text/javascript">
        let lang = document.getElementsByTagName("input");

        function checkAll() {
            for (let i = 0; i < lang.length; i++) {
                lang[i].checked = true;
            }
        }

        function checkNo() {
            for (let i = 0; i < lang.length; i++) {
                lang[i].checked = false;
            }
        }

        function checkReverse() {
            for (let i = 0; i < lang.length; i++) {
                lang[i].checked = !lang[i].checked;
            }
        }
    </script>
</head>
<body>

喜歡的程式語言:
<label>
    <input type="checkbox" name="lang" value="java" checked="checked">
</label>Java
<label>
    <input type="checkbox" name="lang" value="cpp">
</label>C++
<label>
    <input type="checkbox" name="lang" value="python">
    Python
</label>
<label>
    <input type="checkbox" name="lang" value="js">
    JavaScript
</label>

<br>

<button onclick="checkAll()">全選</button>
<button onclick="checkNo()">全不選</button>
<button onclick="checkReverse()">反選</button>


</body>
</html>

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>createElement 方法示例</title>
    <script type="text/javascript">
        window.onload = function () {
            // 使用 js 建立 html 標籤,並顯示在頁面上
            // 標籤內容為 <div> Hello World </div>
            let divObj = document.createElement("div");
            let textNodeObj = document.createTextNode("Hello World");
            divObj.appendChild(textNodeObj);
            document.body.appendChild(divObj);
        }
    </script>
</head>
<body>

</body>
</html>

節點的常用屬性和方法

  • 節點就是標籤物件;
  • getElementsByTagName() 獲取當前節點的指定標籤名孩子節點
  • appendChild( oChildNode) 可以新增一個子節點,oChildNode 是要新增的孩子節點
  • childNodes 獲取當前節點的所有子節點
  • firstChild 獲取當前節點的第一個子節點
  • lastChild 獲取當前節點的最後一個子節點
  • parentNode 獲取當前節點的父節點
  • nextSibling 獲取當前節點的下一個節點
  • previousSibling 獲取當前節點的上一個節點
  • className 用於獲取或設定標籤的 class 屬性值
  • innerHTML 表示獲取/設定起始標籤和結束標籤中的內容
  • innerText 表示獲取/設定起始標籤和結束標籤中的文字

練習和總結