1. 程式人生 > 實用技巧 >Java Web(1)-JavaScript

Java Web(1)-JavaScript

一、JavaScript 和 html 程式碼的結合方式

1. 第一種方式

只需要在 head 標籤中,或者在 body 標籤中, 使用 script 標籤 來書寫 JavaScript 程式碼

<!DOCTYPE html> 
<html lang="en"> 
    <head> <meta charset="UTF-8">
	<title>Title</title> 
        <script type="text/javascript"> 
            // alert 是 JavaScript 語 言 提 供 的 一 個 警 告 框 函 數 。 
            // 它 可 以 接 收 任 意 類 型 的 參 數 , 這 個 參 數 就 是 警 告 框 的 提 示 信 息 alert("hello javaScript!"); 
        </script> 
    </head> 
 <body>
</body>
</html>

2. 第二種方式

使用 script 標籤引入 單獨的 JavaScript 程式碼檔案

<!DOCTYPE html> 
<html lang="en"> 
    <head> 
        <meta charset="UTF-8"> 
        <title>Title</title> 
        <!- 現在需要使用 script 引入外部的 js 檔案來執行 src 屬性專門用來引入 js 檔案路徑(可以是相對路徑,也可以是絕對路徑)

script 標籤可以用來定義 js 程式碼,也可以用來引入 js 檔案 但是,兩個功能二選一使用。不能同時使用兩個功能

--> <script type="text/javascript" src="1.js">
        </script>
    <script type="text/javascript">

		alert("國哥現在可以帥了"); 
     </script> </head> <body>

</body>
</html>

二、變數

什麼是變數?變數是可以存放某些值的記憶體的命名。
JavaScript 的變數型別:

  • 數值型別: number
  • 字串型別: string
  • 物件型別: object
  • 布林型別: boolean
  • 函式型別: function

JavaScript 裡特殊的值: undefined 未定義,所有 js 變數未賦於初始值的時候,預設值都是 undefined. null 空值 NaN 全稱是:NotaNumber。非數字。非數值

JS 中的定義變數格式: var 變數名; var 變數名 = 值;

<!DOCTYPE html> 
<html lang="en"> 
    <head> 
        <meta charset="UTF-8"> 
        <title>Title</title> 
        <script type="text/javascript"> 
            var i; 
            // alert(i); 
            // undefined i = 12; 
            // typeof() 是 JavaScript 語 言 提 供 的 一 個 函 數 。 
            // alert( typeof(i) ); // number
			i = "abc"; 
            // 它 可 以 取 變 量 的 數 據 類 型 返 回 // alert( typeof(i) ); 
            // String
			var a = 12; var b = "abc";
		alert( a * b ); // NaN是 非 數 字 , 非 數 值 。
            
</script>  
</head> 
<body>
</body>
</html>

三、常見運算

1. 關係(比較)運算

  • 等於: == 等於是簡單的做字面值的比較
  • 全等於: === 除了做字面值的比較之外,還會比較兩個變數的資料型別
<!DOCTYPE html> 
<html lang="en"> 
    <head> 
        <meta charset="UTF-8"> 
        <title>Title</title> 
        <script type="text/javascript">
		var a = "12"; 
         var b = 12;
		alert( a == b ); // true 
        alert( a === b ); // false
</script> </head> <body>
</body> </html>

2. 邏輯運算

  • 且運算: &&、
  • 或運算:|| 、
  • 取反運算: !

在 JavaScript 語言中,所有的變數,都可以做為一個 boolean 型別的變數去使用。
0 、null、 undefined、””(空串) 都認為是 false;
注意:

  • && 且運算。 有兩種情況: 第一種:當表示式全為真的時候。返回最後一個表示式的值。 第二種:當表示式中,有一個為假的時候。返回第一個為假的表示式的值
  • || 或運算 第一種情況:當表示式全為假時,返回最後一個表示式的值 第二種情況:只要有一個表示式為真。就會把回第一個為真的表示式的值
  • 並且 && 與運算 和 ||或運算 有短路。 短路就是說,當這個&&或||運算有結果了之後 。後面的表示式不再執行 */
<!DOCTYPE html> 
<html lang="en"> 
    <head> 
        <meta charset="UTF-8"> 
        <title>Title</title> 
        <script type="text/javascript">
		 var a = 0; 
             if (a) { 
            	alert(" 零 為 真 "); 
           	 } else {
				alert(" 零 為 假 "); 
             }
		var b = null; 
             if (b) { 
                 alert("null為 真 ");
			 } else { 
             alert("null為 假 ");
			 }
 		var c = undefined;  
            if (c) {  
                alert("undefined為 真 ");
			} else { 
                alert("undefined為 假 ");
			}
		var d = ""; 
            if (d) {  
                alert(" 空 串 為 真 "); 
            } else { 
                alert(" 空 串 為 假 ");  
            }

			var a = "abc"; 
            var b = true; 
            var d = false; 
            var c = null;
			alert( a && b );//true 
            alert( b && a );//true
            alert( a && d ); // false 
            alert( a && c ); // null
            
		   alert( d || c ); // null 
            alert( c|| d ); //false
		   alert( a || c ); //abc 
            alert( b || c ); //true
	</script> 
</head> 
	<body>
	</body> 
</html>

四、陣列

1. 陣列定義方式

  • var 陣列名 =[]; //空陣列
  • var 陣列名 =[1,’abc’,true]; // 定義陣列同時賦值元素
<!DOCTYPE html> 
<html lang="en"> 
    <head> 
        <meta charset="UTF-8"> 
        <title>Title</title> 
        <script type="text/javascript">
		var arr = [true,1]; //定 義 數 組 
         // alert( arr.length ); // 2
		arr[0] = 12; 
         // alert( arr[0] );//12 
        
// javaScript語 言 中 的 數 組 , 只 要 我 們 通 過 數 組 下 標 賦 值 , 那 麼 最 大 的 下 標 值 , 就 會 自 動 的 給 數 組 做 擴 容 操 作 。 
            arr[2] = "abc"; 
            alert(arr.length); //3
			// alert(arr[1]);// undefined 
            // 數 組 的 遍 歷 
            for (var i = 0; i < arr.length; i++){ 
                alert(arr[i]); 
            }
</script> </head>
<body>
</body> </html>

五、函式

函式的二種定義方式

1. 第一種定義方式

可以使用 function 關鍵字來定義函式

function 函式名(形參列表){

函式體

}
在 JavaScript 語言中,如何定義帶有返回值的函式? 只需要在函式體內直接使用 return 語句返回值即可!

<!DOCTYPE html> 
<html lang="en"> 
    <head> 
        <meta charset="UTF-8"> 
        <title>Title</title> 
        <script type="text/javascript"> 
            // 定 義 一 個 無 參 函 數 
            function fun(){ 
                alert("無參函式 fun()被呼叫了");
            } 
            // 函 數 調 用 === 才 會 執 行
            fun();
            
		   function fun2(a ,b) { 
               alert("有參函式 fun2()被呼叫了 a=>" + a + ",b=>"+b); 
           }
		   fun2(12,"abc");
            
		//定 義 帶 有 返 回 值 的 函 數
		function sum(num1,num2) { 
            var result = num1 + num2; 
            return result; 
        }
		alert( sum(100,50) );
</script> </head> <body>
</body> </html>

2. 第二種定義方式

var 函式名 =function(形參列表){

函式體

}

<!DOCTYPE html> 
<html lang="en"> 
    <head> 
        <meta charset="UTF-8"> 
        <title>Title</title> 
        <script type="text/javascript"> 
            var fun = function () { 
                alert("無參函式");
            }  
            fun();

            var fun2 = function (a,b) { 
                alert("有參函式 a=" + a + ",b=" + b); 
            } 
            fun2(1,2);
            
		    var fun3 = function (num1,num2) { 
                return num1 + num2; 
            }
			alert( fun3(100,200) ); 
        </script>
</head> 
    <body>
	</body> 
</html>

注意:在 Java 中函式允許過載。但是在 JS 中函式的過載會直接覆蓋掉上一次的定義

<!DOCTYPE html> 
<html lang="en"> 
    <head> 
        <meta charset="UTF-8"> 
        <title>Title</title> 
        <script type="text/javascript">
		function fun() { 
            alert("無參函式 fun()"); 
        }
		function fun(a,b) { 
            alert("有參函式 fun(a,b)"); 
        }
            
		fun();
	</script> 
</head> 
    <body>
	</body> 
</html>

3. 函式的 arguments 隱形引數

只在 function 函式內,就是在 function 函式中不需要定義,但卻可以直接用來獲取所有引數的變數。我們管它叫隱形引數

隱形引數特別像 java 基礎的可變長引數一樣。

public void fun(Object...args); ,可變長引數其他是一個數組

那麼 js 中的隱形引數也跟 java 的可變長引數一樣,操作類似陣列

<!DOCTYPE html> 
<html lang="en"> 
    <head> 
        <meta charset="UTF-8"> 
        <title>Title</title> 
        <script type="text/javascript"> 
            function fun(a) { 
                alert( arguments.length );// 可 看 參 數 個 數
			   alert( arguments[0] ); 
                alert( arguments[1] ); 
                alert( arguments[2] );
			   alert("a = " + a);
                
			   for (var i = 0; i < arguments.length; i++){ 
                   alert( arguments[i] ); 
               }
			alert("無參函式 fun()");
		} 
            fun(1,"ad",true);
//需 求 : 要 求 編 寫 一 個 函 數 。 用 於 計 算 所 有 參 數 相 加 的 和 並 返 回 
            function sum(num1,num2) { 
                var result = 0; 
                for (var i = 0; i < arguments.length; i++) {
                    if (typeof(arguments[i]) == "number") { 
                        result += arguments[i]; } 
                	} 
                	return result; 
            	}
			alert( sum(1,2,3,4,"abc",5,6,7,8,9) );
	</script> 
</head> 
 <body>
</body> 
</html>

六、JS 中的自定義物件

1. Object 形式的自定義物件

物件的定義:

​ var 變數名 =newObject(); // 物件例項(空物件)

​ 變數名.屬性名 = 值; // 定義一個屬性

變數名.函式名 =function(){} // 定義一個函式

物件的訪問:

​ 變數名.屬性 / 函式名();

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <script type="text/javascript">

        var obj = new Object();
        obj.name = "馬達";
        obj.age = 18;
        obj.fun = function () {
            alert("姓名:" + this.name + " , 年齡:" + this.age);
        }

        // 物件的訪問
        // alert(obj.name);
        obj.fun();
    </script>
</head>
<body>
</body>
</html>

2. {}花括號形式的自定義物件

物件的定義:

​ var 變數名 ={ // 空物件

​ 屬性名:值, // 定義一個屬性

​ 屬性名:值, // 定義一個屬性

​ 函式名:function(){} // 定義一個函式

};

物件的訪問:

​ 變數名.屬性 / 函式名();

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <script type="text/javascript">
        var obj = {
            name: "馬達",
            age: 18,
            fun: function () {
                alert("姓名:" + this.name + " , 年齡:" + this.age);
            }
        };

        // alert(obj.name);
        obj.fun();
    </script>
</head>
<body>
</body>
</html>

七、JS中的事件

什麼是事件?事件是電腦輸入裝置與頁面進行互動的響應,稱之為事件

1. 常用的事件

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

事件的註冊又分為靜態註冊和動態註冊兩種

什麼是事件的註冊(繫結)?

其實就是告訴瀏覽器,當事件響應後要執行哪些操作程式碼,叫事件註冊或事件繫結。

2. 靜態註冊事件

通過 html 標籤的事件屬性直接賦於事件響應後的程式碼,這種方式我們叫靜態註冊

3. 動態註冊事件

是指先通過 js 程式碼得到標籤的 dom 物件,然後再通過 dom物件.事件名 =function(){} 這種形式賦於事件
響應後的程式碼,叫動態註冊

動態註冊基本步驟:

  • 獲取標籤物件
  • 標籤物件.事件名 =fucntion(){}

4. onload 載入完成事件

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

        
        // 這個是動態註冊,固定的寫法
        window.onload = function () {
            alert("動態註冊onload事件");
        }


    </script>
</head>

<!--靜態註冊onload事件,這個事件是在瀏覽器解析完頁面之後自動觸發的事件,裡面自定義的函式
<body onload="onLoadFun()">

-->

</body>
</html>

5. onclick 單擊事件

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

        // 動態註冊
        window.onload = function () {
            // 1. 獲取標籤物件
            // document是JS語言提供的一個物件
            // 通過屬性的id來獲取標籤物件
            var b = document.getElementById("b01");
            // alert(b);
            
            // 2. 通過標籤物件.事件名 =  function (){}
            b.onclick = function () {
                alert("動態註冊onclick事件");
            }
        }
        
    </script>
</head>
<body>

<!-- 靜態註冊onclick-->
    <button onclick="onclickFun();">按鈕1</button>
    <button id="b01">按鈕2</button>
</body>
</html>

6. onblur失去焦點事件

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


        // 動態註冊
        window.onload = function () {
            //1 獲 取 標 籤 對 象
            var passwordObj = document.getElementById("password");
            // alert(passwordObj);
            // 2 通 過 標 籤 對 象 . 事 件 名 = function(){};
            passwordObj.onblur = function () {
                console.log("動態註冊失去焦點事件");
            }
        }
    </script>
</head>
<body>
    使用者名稱:<input type="text" onblur="onblurFun();"><br/>
    密碼:<input id="password" type="text"><br/>
</body>
</html>

7. onchange內容發生改變事件

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <script type="text/javascript">
        function onchangeFun() {
            alert("電影改變");
        }

        window.onload = function () {
            var sObj = document.getElementById("s01");
            sObj.onchange = function () {
                alert("書籍已經改變");
            }
        }

    </script>
</head>
<body>

    <!--靜態註冊事件-->
    請選擇你喜歡看的電影
    <select onchange="onchangeFun();">
        <option>--電影--</option>
        <option>盜墓筆記</option>
        <option>黑客帝國</option>
        <option>千與千尋</option>
    </select>

    <br>
    請選擇你喜歡看的書籍
    <select id="s01">
        <option>--書籍--</option>
        <option>平凡的世界</option>
        <option>小王子</option>
        <option>解憂雜貨店</option>
    </select>

</body>
</html>

8. onsubmit 表單提交事件

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <script type="text/javascript">
        // 靜態登錄檔單提交事務
        function onsubmitFun() {
            alert("提交不合法");

            return false;
        }

        // 動態登錄檔單提交事務
        window.onload = function () {
            var formObj = document.getElementById("form01");
            formObj.onsubmit = function () {
                alert("動態註冊提交不合法");
                return false;
            }
        }

    </script>
</head>
<body>
    <!--return false    可 以 阻 止 表 單 提 交-->
    <form action="http://localhost:8080" method="get" onsubmit="return onsubmitFun();">
        <input type="submit" value="靜態註冊"/>
    </form>

    <form action="http://localhost:8080" id="form01">
        <input type="submit" value="動態註冊"/>
    </form>

</body>
</html>

八、DOM模型

DOM 全稱是 DocumentObjectModel 文件物件模型
就是把文件中的標籤,屬性,文字,轉換成為物件來管理。 那麼 它們是如何實現把標籤,屬性,文字轉換成為物件來管理呢

1. Document 物件

Document 物件的理解:

  • Document 它管理了所有的 HTML 文件內容
  • document 它是一種樹結構的文件,有層級關係
  • 它讓我們把所有的標籤 都 物件化
  • 我們可以通過 document 訪問所有的標籤物件

2. 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
以上三個方法,一定要在頁面載入完成之後執行,才能查詢到標籤物件

3. getElementById 方法

需 求 : 當用戶點選了校驗按 鈕 , 要 獲 取 輸 出 框 中 的 內 容 。 然 後 驗 證 其 是 否 合 法 。

驗 證 的 規 則 是 : 必 須 由 字 母、數 字、下 劃 線 組 成 。 並 且 長 度 是 5 到 12 位

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <script type="text/javascript">
        
        function onClick() {
            // 1 當我們要 操 作 一 個 標 籤 的 時 候 , 一 定 要 先 獲 取 這 個 標 籤 對 象 。
            var usernameObj = document.getElementById("username");
            // [object HTMLInputElement] 就是dom物件
            var usernameText = usernameObj.value;

            //如 何 驗 證 字 符 串 , 符 合 某 個 規 則 , 需 要 使 用 正 則 表 達 式 技 術
            var patt =  /^\w{5,12}$/;
            /*
             test() 方 法 用 於 測 試 某 個 字 符 串 , 是 不 是 匹 配 我 的 規 則 ,
             匹配就返回true,否則返回false
             */

            var usernameSpanObj = document.getElementById("usernameSpan");
            // innerHTML表 示 起 始 標 籤 和 結 束 標 籤 中 的 內 容
            // innerHTML 這個屬性可讀,可寫
            usernameSpanObj.innerHTML = "你好!";

            if (patt.test(usernameText)) {
                alert("使用者名稱合法");
                usernameSpanObj.innerHTML = "使用者名稱合法!";
            }else{
                alert("使用者名稱不合法");
                usernameSpanObj.innerHTML = "使用者名稱不合法!";
            }
        }
    </script>
</head>
<body>
    使用者名稱:<input type="text" id="username" value="md">
    <span id="usernameSpan" style="color: red;">
        
    </span>

    <button onclick="onClick()">校驗</button>
</body>
</html>

4. getElementsByName 方法

讓 所 有 復 選 框 都 選 中

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>

    <script type="text/javascript">

        function checkAll() {
            // document.getElementsByName("hobby"),是根據指定的name來查詢返回多個標籤物件集合
            // 這個集合的操作和陣列一樣,集合中每個元素都是dom物件
            // 這個集合中元素的順序是按照html頁面的上下順序
            var hobbies = document.getElementsByName("hobby");
            // checked表示複選框的選中狀態,選中是true
            for (var i = 0; i < hobbies.length; i++){
                hobbies[i].checked = true;
            }
        }

        // 全不選
        function checkNo() {
            var hobbies = document.getElementsByName("hobby");
            for (var i = 0; i < hobbies.length; i++){
                hobbies[i].checked = false;
            }
        }

        // 反選
        // 這裡用的取反操作
        function checkReverse() {
            var hobbies = document.getElementsByName("hobby");
            for (var i = 0; i < hobbies.length; i++){
                hobbies[i].checked = !hobbies[i].checked;
            }
        }
    </script>
</head>
<body>

    興趣愛好:
    <input type="checkbox" name="hobby" value="c" checked="checked"> C
    <input type="checkbox" name="hobby" value="java"> Java
    <input type="checkbox" name="hobby" value="python"> Python

    <br>

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

</body>
</html>

5. getElementsByTagName 方法

也是全選操作

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>

    <script type="text/javascript">

        function checkAll() {
            // document.getElementsByTagName("input"),
            // 是根據指定標籤名來查詢返回多個標籤物件集合
            // 這個集合的操作和陣列一樣,集合中每個元素都是dom物件
            // 這個集合中元素的順序是按照html頁面的上下順序
            var hobbies = document.getElementsByTagName("input");

            for (var i = 0; i < hobbies.length; i++){
                hobbies[i].checked = true;
            }
        }


    </script>
</head>
<body>

    興趣愛好:
    <input type="checkbox" name="hobby" value="c" checked="checked"> C
    <input type="checkbox" name="hobby" value="java"> Java
    <input type="checkbox" name="hobby" value="python"> Python

    <br>

    <button onclick="checkAll()">全選</button>


</body>
</html>

6. createElement 方法

使用js程式碼來建立html標籤

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <script type="text/javascript">

        window.onload = function () {
            // 在記憶體中有<div> </div>
            var divObj = document.createElement("div");

            // 有一個文字節點物件 你好,山丘
            var textNodeObj = document.createTextNode("你好,山丘");

            // <div>你好,山丘 </div>
            divObj.appendChild(textNodeObj);

            // 新增子元素,在body裡
            document.body.appendChild(divObj);
        }

    </script>
</head>
<body>

</body>
</html>

7. 節點常用的屬性和方法

方法:

  • 通過具體的元素節點呼叫 getElementsByTagName() 方法,獲取當前節點的指定標籤名孩子節點
  • appendChild(ChildNode) 方法,可以新增一個子節點,ChildNode 是要新增的孩子節點

屬性:

  • childNodes 屬性,獲取當前節點的所有子節點
  • firstChild 屬性,獲取當前節點的第一個子節點 ,會匹配換行和空格資訊 ,使用firstElementChild 則不會匹配換行和空格資訊,其他的類似
  • lastChild 屬性,獲取當前節點的最後一個子節點
  • parentNode 屬性,獲取當前節點的父節點
  • nextSibling 屬性,獲取當前節點的下一個節點
  • previousSibling 屬性,獲取當前節點的上一個節點,previousElementSibling這個不包括換行和空格
  • className 用於獲取或設定標籤的 class 屬性值
  • innerHTML 屬性,表示獲取/設定起始標籤和結束標籤中的內容
  • innerText 屬性,表示獲取/設定起始標籤和結束標籤中的文字

8. DOM練習

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>

    <script type="text/javascript">

        window.onload = function () {
            // 1. 查詢#bj節點
            document.getElementById("b01").onclick = function () {
                var bjObj = document.getElementById("bj");
                alert(bjObj.innerHTML);
            };

            // 2. 查詢所有 li 節點
            var but02Ele = document.getElementById("b02");
            but02Ele.onclick = function () {
                var lis = document.getElementsByTagName("li");
                alert(lis.length);
            };
            // 3. 查詢 name=gender 的所有節點
            var but03Ele = document.getElementById("b03");
            but03Ele.onclick = function () {
                var genders = document.getElementsByName("gender");
                alert(genders.length);
            };



            // 4. 查詢#city 下所有 li 節點
            var but04Ele = document.getElementById("b04");
            but04Ele.onclick = function () {
               var lis = document.getElementById("city").getElementsByTagName("li");
               alert(lis.length);
            };

            // 5. 返回#city 的所有子節點
            var but05Ele = document.getElementById("b05");
            but05Ele.onclick = function () {
               var obj = document.getElementById("city").childNodes;
               console.log(obj.length);
               for (var i = 0; i < obj.length; i++){
                   console.log(obj[i]);
               }
            };

            // 6. 返回#phone 的第一個子節點
            var but06Ele = document.getElementById("b06");
            but06Ele.onclick = function () {
                var objphone = document.getElementById("phone").firstElementChild;
                alert(objphone.innerHTML);

            };

            // 7. 返回#bj 的父節點
            var but07Ele = document.getElementById("b07");
            but07Ele.onclick = function () {
                var objbj = document.getElementById("bj").parentNode;
                alert(objbj.innerHTML);
            };

            // 8. 返回#ML 的前一個兄弟節點
            var but08Ele = document.getElementById("b08");
            but08Ele.onclick = function () {
                alert(document.getElementById("ML").previousElementSibling.innerHTML);
            };

            // 9. 返回#username 的 value 屬性值
            var but09Ele = document.getElementById("b09");
            but09Ele.onclick = function () {
                alert(document.getElementById("username").value);
            };

            // 10. 設定#username 的 value 屬性值
            var but10Ele = document.getElementById("b10");
            but10Ele.onclick = function () {
                document.getElementById("username").value = "山丘";
            };

            // 11. 返回#city 的文字值
            var but11Ele = document.getElementById("b11");
            but11Ele.onclick = function () {
                alert(document.getElementById("city").innerText);
            };
        };

    </script>
</head>
<body>
    <div id="total">
        <div class="inner">
            <p>
                你喜歡那個城市?
            </p>

            <ul id="city">
                <li id="bj">北京</li>
                <li>南京</li>
                <li>東京</li>
                <li>上海</li>
            </ul>

            <br>

            <p>
                你喜歡那款遊戲?
            </p>

            <ul id="game">
                <li id="wz">王者榮耀</li>
                <li>飛車</li>
                <li>聯盟</li>
                <li>DNF</li>
            </ul>

            <br>

            <p>
                你的手機是什麼品牌?
            </p>

            <ul id="phone">
                <li>華為</li>
                <li id="ML">小米</li>
                <li>oppo</li>
                <li>一加</li>
            </ul>
        </div>


        <div class="inner">
            gender:
            <input type="radio" name="gender" value="male">
            Male
            <input type="radio" name="gender" value="female">
            Female

            <br>
            name:
            <input type="text" name="name" id="username" value="md">
        </div>
    </div>

    <div id="btuList">
        <div><button id="b01">查詢#bj節點</button></div>
        <div><button id="b02">查詢所有 li 節點</button></div>
        <div><button id="b03">查詢 name=gender 的所有節點</button></div>
        <div><button id="b04">查詢#city 下所有 li 節點</button></div>
        <div><button id="b05">返回#city 的所有子節點</button></div>
        <div><button id="b06">返回#phone 的第一個子節點</button></div>
        <div><button id="b07">返回#bj 的父節點</button></div>
        <div><button id="b08">返回#android 的前一個兄弟節點</button></div>
        <div><button id="b09">返回#username 的 value 屬性值</button></div>
        <div><button id="b10">設定#username 的 value 屬性值</button></div>
        <div><button id="b11">返回#city 的文字值</button></div>
    </div>
</body>
</html>