前端筆記4 JS BOM&DOM

Bom

概念

Browser Object Model 瀏覽器對象模型

BOM提供了獨立於內容的、可以與瀏覽器窗口進行互動的對象結構

window對象

概念

稱爲 瀏覽器對象, 當瀏覽器打開一個 html 文檔的時候, 通常會創建一個 window 對象

屬性

window對象屬性 含義
history 歷史- 表示客戶訪問過的歷史記錄(URL)
location 當前頁面 URL (網址) 信息
screen 只讀屬性, 包含有關客戶端顯示屏幕的有關信息

方法

方法名 說明
彈窗 alert 警告框 (帶有提示信息,和一個確定按鈕)
彈窗 confirm 確認框 (帶有提示信息, 和確認 與取消按鈕的對話框)
彈窗 prompt 輸入框 (可以使用對話框接收用戶的輸入信息)
close() 關閉窗口功能
open() 打開一個新的瀏覽器窗口,加載指定URL 文檔
setTimeout() 在指定毫秒數後執行指定函數(一次性)
setInterval() 在指定毫秒數後執行指定函數(週期性)
clearInterval() 取消由 setInterval() 設置的 timeout。

彈窗案例

警告框

<button onclick="window.alert('有種再點我一次')">點我一下試試</button>
<button onclick="alert('有種再點我一次')">點我一下試試</button>

確認框

<button onclick="f1()">點我一下試試</button>
function f1(){
	// confirm 確認框 有返回值, 當點擊確認的時候,返回true 
    var boo = confirm('有種再點我一次');
    console.log(boo);
}
// 主要用處 刪除按鈕. 確認用戶是否確定要刪除

function f1(){
    var boo = confirm('你確定要刪除嗎?');
    if(boo){
        console.log("刪除成功!");
    }else{
        console.log("取消刪除!");
    }
}

輸入框

prompt(參數一,參數二) , 表示 提示信息 和 默認值

<button onclick="f1()">登錄</button>

function f1(){
    var pwd = prompt('請輸入密碼');
    console.log(pwd);
}

窗口案例

// 父頁面
<button onclick="open_win()">打開頁面</button>
function open_win(){
    window.open("test.html"); // 可以傳遞一些參數, 用於表示新窗口的樣式
}

// 子頁面 test.html 
<button onclick="close_win()">關閉頁面</button>
function close_win(){
    window.close();
}

定時任務

setTimeout() 一次性定時任務

function open_win(){
    // 執行定時任務
    // window.setTimeout("要執行的函數",需要等待的毫秒數);
    window.setTimeout("window.open('test.html')",3000);
}

setInterval() 週期性任務

// 向瀏覽器中 輸出一些小圖片(每隔兩秒鐘輸入一張圖片)
function setInterval_print(){
    window.setInterval("document.write('<img src=\"a.gif\">')",2000);
}
setInterval_print();

撤銷定時任務 clearInterval()

<button onclick="setInterval_print()">開啓定時任務</button>
<button onclick="clearInterval_print()">關閉定時任務</button>

var num;
function setInterval_print(){
    // 返回值表示 該定時任務的一個編號
    num = window.setInterval("console.log('123')",200);
}
function clearInterval_print(){
    // 取消 編號爲num的定時任務
    window.clearInterval(num);
}

history

history 方法 說明
back() 加載history 對象列表中 前一個 URL
forward() 加載history 對象列表中 後一個 URL
go(參數) 加載history 對象列表中 指定的一個 URL

back() forward()

<button onclick="history.back()">返回到上一個頁面</button><br><br>
<button onclick="history.forward()">加載到一個頁面</button>
<h1>A 頁面</h1>
<a href="b.html">B頁面</a>

go()

<button onclick="history.back()">返回到上一個頁面</button><br><br>
<button onclick="history.forward()">加載到一個頁面</button>
/*******相當於********/
<button onclick="history.go(-1)">返回到上一個頁面</button><br><br>
<button onclick="history.go(1)">加載到一個頁面</button>

<button onclick="history.go(-2)">返回到上兩層頁面</button><br><br>
<h1>B 頁面</h1>

location

屬性方法 名稱 說明
屬性 host 主機號,url 端口號
屬性 hostname 主機名
屬性 href 返回完整URL
方法 reload() 重新加載當前文檔
方法 replace() 用新文檔替換當前文檔

獲取屬性案例

console.log(window.location.host);
console.log(window.location.hostname)
console.log(window.location.href);
// 需要使用 webStorm 內置服務器打開頁面

設置屬性

location.href 直接獲取

location.href = “”; 設置新網址

window.location.href = "URL地址"; 跳轉頁面到指定地

<button onclick="changeURL()">改變網頁地址</button>
<br>
<br>
<a href="http://www.baidu.com">百度首頁</a>
    
function changeURL(){
    //改變頁面網址, 類似於 使用a鏈接 跳轉頁面
    window.location.href = "http://www.baidu.com";
}

方法案例

<script>
   document.write(new Date());
   document.write("<br/>");
   document.write("<br/>");
   function changeDate(){
       //刷新頁面
        window.location.reload();
   }
</script>
 <button onclick="changeDate()">改變時間</button>

Dom 文檔模型

DOM 文檔對象模型

基於文檔編程的一組API 接口

是W3C組織 編寫的一組規範, 允許訪問和操作 HTML 頁面中每一個單獨的元素

“W3C 文檔對象模型 (DOM) 是中立於平臺和語言的接口,它允許程序和腳本動態地訪問和更新文檔的內容、結構和樣式。”

類似於一個上帝視角, 可以對看到的每一個元素, 進行操作

下棋 沒有棋盤 , 定位某一個旗棋子的位置

document 文檔對象

獲取節點對象的常用方法

常用方法 方法含義
write() 向文檔書寫文本, html標籤 甚至 script 腳本
getElementById() 返回 指定ID的第一個對象的引用
getElementsByName() 返回所有該名稱屬性的對象集合
getElementsByTagName() 返回所有該標籤名稱的對象集合

事件和 Dom 聯動

行內方法聯動

<body>
    <button onclick="f1()">點擊</button>
</body>
<script>
    function f1(){
        // 執行代碼
    }
</script>

對象聯動

<body>
    <button >點擊</button>
</body>
<script>
    var button = document.getElementsByTagName("button")[0];

    // 對象.事件 = 函數, (只能寫函數名, 不能加括號)
    // button.onclick = f1(); //錯誤
    button.onclick = f1;  // 正確
    //錯誤的原因   當程序運行到 f1() 認爲 是函數的調用 , 直接執行 f1 函數
    function f1(){
        alert(123);
    }
</script>

匿名函數

<script>
    var button = document.getElementsByTagName("button")[0];

    // 對象.事件 = 匿名函數
    button.onclick = function (){
        alert(123);
    }
</script>

this 關鍵字

button.onclick = function (){
	// this 指代當前對象
    alert(this.innerHTML);
}

DOM 節點

HTML DOM 將 HTML 文檔視作樹結構。這種結構被稱爲節點樹

  • 在節點樹中,頂端節點被稱爲根(root)
  • 每個節點都有父節點、除了根(它沒有父節點)
  • 一個節點可擁有任意數量的子節點
  • 同胞是擁有相同父節點的節點 (兄弟節點)

節點分類

  • 整個文檔是一個文檔節點
  • 每個 HTML 元素是元素節點
  • HTML 元素內的文本是文本節點
  • 每個 HTML 屬性是屬性節點
  • 註釋是註釋節點

每一個節點 都有相同的屬性

nodeName

nodeValue

nodeType 類型編號

分類(類型) nodeType 值
元素 Element 1
屬性 attr 2
文本 text 3
註釋節點 comments 8
文檔節點document 9
<html>
	<!-- 註釋 -->
	<head>
		<meta charset="UTF-8" />
		<title >標題</title>
	</head>
</html>

節點的屬性

屬性名稱 描述
parentNode 獲取該節點的父節點
childNodes 獲取所有子節點的集合
firstChild 獲取該節點的第一個子節點(最常用的是獲取元素的文本節點)
lastChild 獲取最後一個子節點
nextSibling 下一個節點 (兄弟節點)
previousSibling 上一個節點

通常使用 firstChild 想要獲取元素節點 但是有可能 會被 空格 換行之類的內容影響, 所以需要換成

避免空格影響
firstElementChild 獲取第一個子節點, 元素節點(標籤節點)
lastElementChild
nextElementSibling
previousElementSibling

案例

<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
</body>
<script>
    // 根據標籤獲取對象 , 標籤可以重複, 對象是一個集合
    var arr = document.getElementsByTagName("html");
    // 獲取集合中的第一個對象
    var obj = arr[0];
    var children = obj.childNodes;
    // console.log(children);
    for(var i in children){
        console.log(children[i].nodeName + "\t"+children[i].nodeType);
    }
</script>
</html>
<body>
    <div class="dv">
    	<p id="pid"></p>
    </div>
</body>
<script>
    var dvs = document.getElementsByClassName("dv");

    // console.log(dvs[0].firstChild);
    // console.log(dvs[0].lastChild);
    // 使用 firstChild 用可能 會被 空格 換行之類的內容影響, 所以需要換成
    console.log(dvs[0].firstElementChild);
    console.log(dvs[0].lastElementChild);
</script>
</html>

獲取標籤屬性

獲取節點屬性 getAttribute(“屬性名”);

設置節點屬性 setAttribute(“屬性名”,“屬性值”);

<body>
    <input type="text">
    <br/>
    <br/>
    <input type="button">
    <button onclick="fun()">改變樣式</button>
</body>
<script>
    function fun(){
        // 獲取input 節點對象
        var ipt = document.getElementsByTagName("input")[0];
        console.log(ipt.getAttribute("type"));

        var ipt1 = document.getElementsByTagName("input")[1];
        console.log(ipt1.getAttribute("type"));
        ipt1.setAttribute("type","date");
    }
</script>

獲取標籤文本

表單元素 value

<body>
    <input type="text" >
    <input type="radio" value="男" name="sex">男
    <input type="radio" value="女" name="sex">女

    <select name="" id="">
        <option value="青島">青島</option>
        <option value="濟南">濟南</option>
    </select>
</body>
<script>

    var set = document.getElementsByTagName("select")[0];
    set.onchange = function(){
        alert(set.value);
    }

    // 兩個焦點事件
    var ipt = document.getElementsByTagName("input")[1]
    // 光標從 輸入框移除的時候
    ipt.onblur = f1;
    function f1(){
       alert(ipt.value);
    }
/*
    ipt.onfocus = f2;
    function f2(){
        alert("focus");
    }*/
</script>

普通標籤 innerHTML

<p><b>123</b></p>
<button>點擊切換 p 標籤中的內容</button>

var btn = document.getElementsByTagName("button")[0];
var p = document.getElementsByTagName("p")[0];
btn.onclick = function (){
    // innerHTML 獲取 標籤之內的所有內容
   //  alert(p.innerHTML);  //  <b>123</b>
    p.innerHTML = "切換完成";
}

innerText


// innerText 只獲取文本 不獲取標籤
alert(p.innerText);  // 123

創建節點,插入節點,刪除和替換節點

節點操作方法
createElement(“標籤名”) 創建一個新元素節點
A.appendChild(B) 把B 標籤 添加到 A 標籤的(內部)尾部
insertBefore(A,B) 把A節點添加到B節點之前
cloneNode(A) 複製節點A
A.removeChild(B) 從A節點中刪除節點B
replaceChild(A,B) 使用新節點A 替換 舊節點B

案例1

<body>
    選擇你喜歡的書:
    <input type="radio" name="book" onclick="add1()">我和狗狗一起活下來
    <input type="radio" name="book" onclick="add2()">灰霾來了怎麼辦
    <br><br>
</body>
    <script>
        function add1(){
            // <img src="images/dog.jpg" alt="">
            // 1- 創建一張圖片 對象
            var img = document.createElement("img");  // <img />
            // 2- 設置圖片的屬性爲 一個圖片路徑
            img.setAttribute("src","images/dog.jpg"); // <img src="images/dog.jpg">
            // 3- 把圖片添加到body 網頁中
            var body = document.getElementsByTagName("body")[0];
            body.appendChild(img);

        }
        function add2(){
            // <img src="images/dog.jpg" alt="">
            // 1- 創建一張圖片 對象
            var img = document.createElement("img");  // <img />
            // 2- 設置圖片的屬性爲 一個圖片路徑
            img.setAttribute("src","images/mai.jpg"); // <img src="images/dog.jpg">
            // 3- 把圖片添加到body 網頁中
            var body = document.getElementsByTagName("body")[0];
            body.appendChild(img);
        }

    </script>

案例2

<body>
    <h1>微博發佈系統</h1>
    <br><br>
    <textarea name="" id="" cols="30" rows="10">

    </textarea>
    <br>
    <button onclick="submit_1()">發佈</button>
    <hr>
    <ul>
        <li>2018年 已成爲歷史</li>

    </ul>
    <script>
        function submit_1(){
            /*
            1- 獲取到用戶輸入的內容

            2- 把用戶輸入的內容 添加到之後的ul列表中(新添加的內容 優先顯示)
             */
            // 獲取textarea 對象
            var area = document.getElementsByTagName("textarea")[0];
            // 表單元素 使用 value 屬性獲取 元素內容

            // 創建li 對象
            var li = document.createElement("li");  // <li></li>
            // li 是 普通標籤 非表單標籤
            li.innerHTML =  area.value; //<li>新添加的信息</li>
            // 添加元素到 列表
            var ul = document.getElementsByTagName("ul")[0];
            /*ul.appendChild(li);*/
            // 獲取 ul 中的第一個元素
            // 把 li 插入到 ul 中的第一個元素之前
            ul.insertBefore(li,ul.firstElementChild);
        }

    </script>
</body>

案例3

<body>
<ul>
    <li id="first">
        <img src="images/f01.jpg" >
        <p><button onclick="del()">刪除我吧</button></p>
    </li>
    <li id="second">
        <img src="images/f02.jpg" >
        <p><button onclick="rep()">替換我吧</button></p>
    </li>
</ul>
</body>
<script>

    function del(){
        // 獲取第一個 li 對象
        var first = document.getElementById("first");
        // 獲取li 中的 img 對象
        var li = first.firstElementChild;
        // 移除
        first.removeChild(li);
    }
    function rep(){
        var second = document.getElementById("second");
        // 先創建一個img 對象
        var img = document.createElement("img");
        img.setAttribute("src","images/f04.jpg");
        // 使用新對象替換舊對象
        second.replaceChild(img,second.firstElementChild);
    }

</script>

操作節點樣式

對象.style.樣式屬性

案例1 購物車案例 , 鼠標指向顯示列表, 鼠標移除, 列表隱藏

<body>
<section id="shopping">
    <div id="cart" onmouseover="over()" onmouseout="out()">我的購物車<span>1</span>
    </div>

    <div id="cartList">
        <h2>最新加入的商品</h2>
        <ul>
            <li><img src="images/makeup.jpg"></li>
            <li>倩碧經典三部曲套裝(液體皁200ml+明肌2號水200ml+潤膚乳125ml)</li>
            <li>¥558.00×1<br/>刪除</li>
        </ul>
        <div class="footer">共1件商品<span>共計¥558.00</span> <span>去購物車</span></div>
    </div>
</section>
</body>
<script>
    function over(){
        // 獲取 cartList 對象
        var cartList = document.getElementById("cartList");
        var cart = document.getElementById("cart");
        // 把該對象的樣式切換爲 block
        cart.style.borderBottom = "none";
        cart.style.backgroundColor = "#fff";
        cart.style.zIndex = 100;  // 圖層級別很高
        cartList.style.display = "block";
        cartList.style.position = "relative";
        cartList.style.top = "-1px";
    }
    function out(){
        // 獲取 cartList 對象
        var cartList = document.getElementById("cartList");
        // 把該對象的樣式切換爲 none
        cartList.style.display = "none";
    }

</script>
*{margin: 0;padding: 0; font-family: "Arial", "微軟雅黑"; font-size: 12px; line-height: 25px;}
ul,li{list-style: none;}
#shopping{margin: 20px auto 0 auto; width: 320px;
}
#cart{
    background: #f9f9f9 url("../images/cart.png") 20px 6px no-repeat;
    border: solid 1px #dcdcdc;
    float: right;
    width: 100px;
    height: 28px;
    padding-left: 45px;
    line-height: 28px;
    position: relative;
    cursor: pointer;
}
#cart span{
    position: absolute;
    color: #fff;
    background: #dc1742;
    display: block;
    width: 15px;
    height: 15px;
    border-radius: 50%;
    top:-5px;
    right: 20px;
    font-size: 8px;
    line-height: 15px;
    text-align: center;
}
#cartList{
	width: 310px; 
	float: right; 
	border: solid 1px #dcdcdc; 
	display: none;}
#cartList h2{border-bottom: 1px dashed #cccccc; font-size: 14px; padding-left: 10px;}
#cartList li{float: left;}
#cartList li:nth-of-type(1){width: 65px; text-align: center;}
#cartList li:nth-of-type(2){width: 155px;}
#cartList li:nth-of-type(3){text-align: center; width: 85px;}
#cartList .footer{clear: both; height: 35px; line-height: 35px; background: #f5f5f5; padding:0  5px;}
#cartList .footer span{padding: 0 12px;}
#cartList .footer span:nth-of-type(2){
    color: #fff;
    background: #dc1742;
    display: block;
    height: 25px;
    border-radius: 6px;
    float: right;
    text-align: center;
    font-weight: bold;
    margin-top: 5px;
}

#shopping .cartOver{
    background-color: #ffffff;
    z-index: 100;
    border-bottom: none;
}
#shopping .cartListOver{
    display:block;
    position:relative;
    top:-1px;
}
#shopping .cartOut{
    background-color:#f9f9f9;
    border-bottom:solid 1px #dcdcdc;
}
#shopping .cartListOut{
    display:none;
}

案例優化 使用 className 優化

<script>
    function over(){
        // 獲取 cartList 對象
        var cartList = document.getElementById("cartList");
        var cart = document.getElementById("cart");
        // 把該對象的樣式切換爲 block
        cart.className = "cartOver";
        cartList.className = "cartListOver";
    }
    function out(){
        // 獲取 cartList 對象
        var cartList = document.getElementById("cartList");
        var cart = document.getElementById("cart");
        // 把該對象的樣式切換爲 none
        cartList.className = "cartListOut";
        cart.className = "cartOut";
    }

</script>

操作位置屬性

scrollTop scrollLeft

獲得滾動軸的位置

<script>
    // 當 頁面 滾動軸 移動的時候 觸發事件
    window.onscroll = f1;
// 獲取到 滾動軸的位置
    var top1;
    var left1;
    function f1(){
        /*top1 = parseInt(document.documentElement.scrollTop || document.body.scrollTop);
        console.log(top1);*/
        left1 = parseInt(document.documentElement.scrollLeft || document.body.scrollLeft);
        console.log(left1);
    }
</script>

案例

隔行換色

// 隔行換色功能
/*
1- 獲取所有li 對象
2- 如果是奇數行 設置爲一個顏色, 偶數行 相反
 */
var arr = document.getElementsByTagName("li");
for(var i in arr){
    if(i % 2 == 0){
        arr[i] .style.backgroundColor = "skyblue";
    }else{
        arr[i] .style.backgroundColor = "pink";
    }
}

鼠標指向高亮顯示

第一種

var lis = document.getElementsByTagName("li");
for(let i in lis){
    // 給每一個li 添加事件
    lis[i].onmouseover = function (){
        lis[i].style.backgroundColor = "gold";
    }
    lis[i].onmouseout = function (){
        lis[i].style.backgroundColor = "#fff";
    }
}

第二種


// 給每一個li 添加 樣式  給他的所有兄弟修改顏色
var lis = document.getElementsByTagName("li");
for(let i in lis){
    // 給每一個li 添加事件
    lis[i].onmouseover = function (){
       // alert(123);
        // 其他所有標籤全部變爲白色
        for(let k in lis){
            if(k == i){
                lis[k].style.backgroundColor = "gold";
            }else{
                lis[k].style.backgroundColor = "white";
            }
        }
    }
}

全選全不選案例/反選案例

<body>

    <input type="checkbox" name="hobby">抽菸
    <br>
    <input type="checkbox" name="hobby">喝酒
    <br>
    <input type="checkbox" name="hobby">燙頭
    <br>
    <input type="checkbox" name="hobby">學Java
    <br>
    <input type="checkbox" name="check" >全選/全不選
    <input type="checkbox" name="reverse">反選

</body>
<script>
    // 1- 獲取所有的hobby 的 標籤對象
    // 2- 獲取全選和全不選框的選擇狀態
    // 3- 給全選框添加點擊事件
    // 4- 更改 所有hobby的狀態 和 check的狀態保持一致
    // 1
    var hobbies = document.getElementsByName("hobby");

    // 2  html 中 如果給標籤添加 checked 屬性 默認選中
    var check01 = document.getElementsByName("check")[0];
    //  alert(check01.checked);  選中狀態 是 true , 非選中狀態爲 false

    // 3
    check01.onclick = function(){
        // 4
        for(let i in hobbies){
            hobbies[i].checked = check01.checked;
        }
    }
    // 反選步驟
    // 1- 給反選按鈕添加點擊事件
    // 2- 把所有 hobby 的 狀態修改爲相反的狀態
    var reverse = document.getElementsByName("reverse")[0];
    reverse.onclick = function(){
        for(let i in hobbies){
            hobbies[i].checked = !hobbies[i].checked;
        }
    }
</script>

圖片輪播器

<body>
    <div class="main">
        <img src="img/left.png" alt="" id="left">
        <img src="img/right.png" alt="" id="right">
        <img src="img/1.jpg" alt="" id="content">
    </div>
</body>

樣式

    div{
        height: 400px;
        width: 600px;
        margin: 0 auto;
        position: relative;
    }
    #left,#right{
        position: absolute;
        width: 50px;
        height: 50px;
        top: 175px;
    }
    #left{
        left: 10px;
    }
    #right{
        right: 10px;
    }
    #content{
        width: 100%;
        height: 100%;
    }
</style>

JS 控制 手動切換

<script>
    // 1- 左右兩個圖標 需要添加點擊事件
    // 2- 每一次點擊需要切換圖片, 實際上就是修改圖片的src 屬性
    var left = document.getElementById("left");
    var right = document.getElementById("right");
    var content = document.getElementById("content");
    // 3- 因爲圖片 的名稱 是 從1-11 的  修改src 屬性就是修改這些 數字
    // 設置當前圖片的 圖片數字名稱爲 count
    var count = 1;
    right.onclick = next;
    left.onclick = pre;

    function next(){
        // 每一次向右切換 count + 1
        count++;
        // 如果超出第十一張圖片, 就需要重新回到第一張
        if(count > 11){
            count = 1;
        }
        content.src = "img/"+count+".jpg";
    }
    function pre(){
        count--;
        // 如果圖片小於 1
        if(count < 1){
            count = 11;
        }
        content.src = "img/"+count+".jpg";
    }
    // 定時任務完成自動切換
    window.setInterval("next()",1500);

</script>

定時任務功能, 鼠標移入停止切換, 移除繼續切換

var main = document.getElementsByClassName("main")[0];
// 定時任務完成自動切換
var no;
function start(){
    no = window.setInterval("next()",1500);
}
start();
main.onmouseover = function(){
    clearInterval(no);
}
main.onmouseout = function(){
    start()
}

使用按鈕控制 表格的添加

在這裏插入圖片描述

分析步驟

// 1- 獲取到用戶在輸入框中輸入的內容
// 2- 填充到表格分步
// 2-1 創建 4個td 對象, 把文本添加到td對象中
// 2-2 創建tr對象 , 把 td 添加到 tr 中
// 2-3 把tr 對象 添加到 table 中

案例準備

<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <style>
        div{
            width: 400px;
            margin: 0 auto;
            text-align: center;
            background-color: skyblue;
        }
        div>table{
            width: 100%;
            border-collapse: collapse;
        }
        table tr>td,table tr>th{
            border:1px solid black;
        }
    </style>
</head>
<body>
    <!-- 學員統計 -->
    <!--table>((tr>th*4)+(tr>td*4))-->
    <div class="main">
        <table>
            <caption>學員統計</caption>
            <tr>
                <th>學號</th>
                <th>姓名</th>
                <th>年齡</th>
                <th>操作</th>
            </tr>
            <tr>
                <td>10086</td>
                <td>畢吉倫</td>
                <td>25</td>
                <td><button>刪除</button></td>
            </tr>
        </table>

        <hr>
        <br>
        學號: <input type="text" name="sid"> <br><br>
        姓名: <input type="text" name="sname"> <br><br>
        年齡: <input type="text" name="sage"> <br><br>
        <button id="btn"> 提交 </button>
    </div>
</body>
</html>

JS 代碼實現

<script>

    var btn = document.getElementById("btn");
    btn.onclick = btn_add;
    
    function btn_add() {
        // 1- 獲取到用戶在輸入框中輸入的內容
        var sid = document.getElementsByName("sid")[0];
        var sname = document.getElementsByName("sname")[0];
        var sage = document.getElementsByName("sage")[0];

        // 2- 填充到表格分步
        // 2-1 創建 4個td 對象, 把文本添加到td對象中
        var td1 = document.createElement("td");
        var td2 = document.createElement("td");
        var td3 = document.createElement("td");
        var td4 = document.createElement("td");
        td1.innerText = sid.value;
        td2.innerText = sname.value;
        td3.innerText = sage.value;

        // 把刪除按鈕創建出來添加到第四個 td 中
        var but = document.createElement("button");
        but.innerText = "刪除";
        // 給刪除按鈕添加事件, 點擊事件, 移除當前行
        // 誰有權利移除一行 (父級標籤可以移除子集標籤)
        // 通過but 找到當前行對象
        but.onclick = function(){
            // but > td > tr
            var tr = this.parentNode.parentNode;
            // tr > table , 通過table 刪除 tr
            tr.parentNode.removeChild(tr);
        }
        td4.appendChild(but);
        // 2-2 創建tr對象 , 把 td 添加到 tr 中
        var tr = document.createElement("tr");
        tr.appendChild(td1);
        tr.appendChild(td2);
        tr.appendChild(td3);
        tr.appendChild(td4);
        // 2-3 把tr 對象 添加到 table 中
        var table = document.getElementsByTagName("table")[0];
        table.appendChild(tr);
    }
</script>

二級聯動案例

實例圖片

在這裏插入圖片描述

環境準備

<body>
    省份: <select id="province"></select> &nbsp;&nbsp;&nbsp;&nbsp; 城市 : <select id="city"></select>
</body>
<script>
    // 創建省份數組
    var province = ["請選擇", "北京", "上海", "天津", "重慶", "山東", "河南", "湖北", "湖南", "廣東", "河北", "山西", "遼寧", "吉林", "內蒙古", "黑龍江", "江蘇", "浙江", "安微", "福建", "江西", "四川", "貴州", "雲南", "陝西", "甘肅", "青海", "廣西", "西藏", "寧夏", "新疆", "海南", "香港", "澳門", "臺灣"];
    var city = [[],
        ["", "東城", "西城", "海淀", "朝陽", "豐臺", "石景山", "通州", "順義", "房山", "大興", "昌平", "懷柔", "平谷", "門頭溝", "密雲", "延慶"],
        ["", "黃浦", "浦東", "徐匯", "長寧", "靜安", "普陀", "閘北", "虹口", "楊浦", "閔行", "寶山", "嘉定", "金山", "松江", "青浦", "奉賢", "崇明"],
        ["", "和平", "河西", "南開", "河東", "河北", "紅橋", "東麗", "津南", "西青", "北辰", "濱海新區"],
        ["", "萬州", "黔江", "涪陵", "渝中", "大渡口", "江北", "沙坪壩", "九龍陂", "南岸", "北碚", "渝北", "巴南", "長區", "江津", "合川", "永川", "南川", "綦江", "大足", "銅梁"],
        ["", "濟南", "青島", "淄博", "棗莊", "東營", "煙臺", "濰坊", "濟寧", "泰安", "威海", "日照", "濱州", "德州", "聊城", "臨沂", "菏澤", "萊蕪"],
        ["", "鄭州", "開封", "洛陽", "平頂山", "安陽", "鶴壁", "新鄉", "焦作", "濮陽", "許昌", "漯河", "三門峽", "商丘", "周口", "駐馬店", "南陽", "信陽", "濟源"],
        ["", "武漢", "黃石", "十堰", "荊州", "宜昌", "襄陽", "鄂州", "荊門", "黃岡", "孝感", "咸寧", "仙桃", "潛江", "恩施", "神農架", "天門", "隨州"],
        ["", "長沙", "株洲", "湘潭", "衡陽", "邵陽", "岳陽", "常德", "張家界", "益陽", "婁底", "郴州", "永州", "懷化", "湘西"],
        ["", "廣州", "深圳", "珠海", "汕頭", "佛山", "東莞", "中山", "潮州", "惠州", "湛江", "肇慶", "江門", "茂名", "韶關", "揭陽", "雲浮", "梅州", "汕尾", "河源", "陽江", "清遠"],
        ["", "石家莊", "保定", "滄州", "衡水", "邢臺", "邯鄲", "張家口", "廊坊", "唐山", "秦皇島", "承德"],
        ["", "太原", "大同", "陽泉", "長治", "晉城", "朔州", "晉中", "運城", "忻州", "臨汾", "呂梁"],
        ["", "瀋陽", "大連", "鞍山", "撫順", "本溪", "丹東", "錦州", "營口", "阜新", "遼陽", "盤錦", "鐵嶺", "朝陽", "葫蘆島"],
        ["", "長春", "吉林", "四平", "遼源", "通化", "白山", "白城", "松原", "延邊", "長白山", "梅河口", "公主嶺"],
        ["", "呼和浩特", "包頭", "烏海", "赤峯", "通遼", "鄂爾多斯", "呼倫貝爾", "巴彥淖爾", "烏蘭察布", "興安盟", "錫林郭勒", "阿拉善"],
        ["", "哈爾濱", "齊齊哈爾", "雞西", "鶴崗", "雙鴨山", "大慶", "伊春", "佳木斯", "七臺河", "牡丹江", "黑河", "綏化", "大興安嶺"],
        ["", "南京", "無錫", "徐州", "常州", "蘇州", "南通", "連雲港", "淮安", "鹽城", "揚州", "鎮江", "秦州", "宿州"],
        ["", "杭州", "寧波", "溫州", "紹興", "湖州", "嘉興", "金華", "衢州", "舟山", "台州", "麗水"],
        ["", "合肥", "蕪湖", "蚌埠", "馬鞍山", "宿州", "安慶", "淮南", "銅陵", "黃山", "宣城", "池州", "滁州", "淮北", "阜陽", "六安", "毫州"],
        ["", "福州", "廈門", "漳州", "泉州", "三明", "莆田", "南平", "龍巖", "寧德", "平潭"],
        ["", "南昌", "九江", "上饒", "撫州", "宜春", "吉安", "贛州", "景德鎮", "萍鄉", "新餘", "鷹潭"],
        ["", "成都", "綿陽", "自貢", "攀枝花", "瀘州", "德陽", "廣元", "遂寧", "內江", "樂山", "資陽", "宜賓", "南充", "達州", "雅安", "阿壩", "甘孜", "涼山", "廣安", "巴中", "眉山"],
        ["", "貴陽", "六盤水", "遵義", "銅仁", "黔西", "畢節", "安順", "黔東", "黔南"],
        ["", "昆明", "曲靖", "玉溪", "保山", "昭通", "麗江", "普洱", "臨滄", "德宏", "怒江", "迪慶", "大理", "楚雄", "紅河", "文山", "西雙版納"],
        ["", "西安", "寶雞", "咸陽", "渭南", "銅川", "治中", "安康", "商洛", "榆林", "延安", "漢中", "楊陵"],
        ["", "蘭州", "嘉峪關", "金昌", "白銀", "天水", "酒泉", "張掖", "武威", "定西", "隴南", "平涼", "慶陽", "臨夏", "甘南"],
        ["", "西寧", "海東", "海北", "黃南", "海南", "果洛", "玉樹", "海西"],
        ["", "南寧", "柳州", "桂林", "梧州", "北海", "防城港", "欽州", "貴港", "玉林", "百色", "賀州", "河池", "來賓", "崇左"],
        ["", "拉薩", "昌都", "日喀則", "山南", "那曲", "阿里", "林芝"], ["", "銀川", "石嘴山", "吳忠市", "固原市", "中衛"],
        ["", "烏魯木齊", "克拉瑪依", "吐魯番", "哈密", "昌吉", "博爾塔", "巴音郭楞", "阿克蘇", "克孜勒蘇柯爾克", "喀什", "和田", "伊犁", "塔城", "阿勒泰", "石河子", "阿拉爾", "圖木舒克", "五家渠", "北屯", "鐵門關", "雙河市"],
        ["", "海口", "三亞", "三沙"],
        ["", "中西區", "灣仔區", "東區", "南區", "油尖旺", "深水埗", "九龍城", "黃大仙", "觀塘", "葵青", "荃灣", "屯門", "元朗", "北區", "大埔", "沙田", "西貢", "離島"],
        ["", "花地瑪堂", "聖安多尼堂", "大堂", "望德堂", "風順堂", "嘉模堂", "聖方濟各堂"], ["", "臺北", "新北", "桃園", "臺中", "臺南", "高雄", "基隆", "新竹", "嘉義"]
    ];
    
</script>

步驟分析

// 1- 頁面加載之後需要把省份數組中的所有數據填充到 省份下拉菜單中
// 2- 給省份下拉菜單添加 切換事件
// 3- 獲取到用戶選擇的是哪個省
// 4- 找到該省所對應的所有城市
// 5- 把所有城市添加到對應的城市 下拉菜單中

JS 代碼實現

// 1- 頁面加載之後需要把省份數組中的所有數據填充到 省份下拉菜單中
    // 獲取省份對象
    var pro = document.getElementById("province");
    var ct = document.getElementById("city");
    function provinceinit(){
        // 遍歷數組
        for(let i = 0 ; i < province.length ; i++){
            // 數組中每一個值 都對應一個 option
            var option = document.createElement("option");
            option.innerText = province[i];
            // 不要求獲取 省份名稱, 只需要獲取該省份所在的下標, 和城市的下標一一對應
            option.setAttribute("value",i);
            // 把每一項 都添加到 省份下拉菜單中
            pro.appendChild(option);
        }
    }
    provinceinit();
// 2- 給省份下拉菜單添加 切換事件
    pro.onchange = function(){
        // 每一次事件切換的時候, 城市下拉菜單內容都需要重置
        ct.innerHTML = "";
        // 3- 獲取到用戶選擇的是哪個省
        // 4- 找到該省所對應的所有城市
        var cityArr = city[pro.value];
        console.log(cityArr);
        // 5- 把所有城市添加到對應的城市 下拉菜單中
        for(let i in cityArr){
            // 每循環一次, 需要創建一個option 對象
            let option = document.createElement("option");
            option.innerText = cityArr[i];
            ct.appendChild(option);
        }
    }
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章