JS筆記

一.JS簡介

1.什么是JS

JS全稱為JavaScript, 是一門運行在瀏覽器的, 動態(tài)類型的, 弱類型的(數(shù)據(jù)類型), 基于對象的直譯者(就是不用編譯)角本語言;

2.JS的組成

  • ECMAScript: JS的基本語法規(guī)范
  • BOM: Browser Object Model, 瀏覽器對象模型, 提供了與瀏覽器交互的一些函數(shù);
  • DOM: Document Object Model, 文檔對象模型, 提供操作網(wǎng)頁面的一些方法;

3.JS的作用

  • JS代碼可以操作瀏覽器: 進行網(wǎng)址跳, 歷史記錄切換, 瀏覽器彈窗等;
  • JS代碼可以操作網(wǎng)頁: 操作HTML的標簽, 標簽的屬性, 樣式, 文本等等;

JS是在瀏覽器內(nèi)存中運行時操作, 并不會修改網(wǎng)頁源碼, 所在刷新頁面后網(wǎng)頁會還原;

4.JS與java的對比

對比 Java JS
運行環(huán)境 JVM虛擬機 JS引擎,是瀏覽器的一部分
是否跨平臺運行 跨平臺 跨平臺
語言類型 強類型語言 弱類型,動態(tài)類型語言
是否需要編譯 需要編譯,是編譯型語言 不需要編譯,是解釋型語言
是否區(qū)分大小寫 區(qū)分大小寫 區(qū)分大小寫

5.JS的引入方式

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>JS學習</title>
    <!-- 第二種方式 -->
    <script src="../js/demo.js"></script>
</head>
<body>
<!--
    JS 的引入方式有兩種:
        1. 內(nèi)部腳本 (就是在當前html文檔內(nèi)部編寫 script 標簽,在這個標簽里編寫JS代碼)
        2. 外部腳本 (當前項目中編寫一個JS文件,存放到JS文件夾中,需要使用時,再將該文件引入)
-->
<!-- 第一種方式 -->
<script>
    alert("你想做什么呢?");
</script>
</body>
</html>

二.ECMAScript

1.JS中的變量與數(shù)據(jù)類型

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>JS學習</title>
</head>
<body>
<script>
    /*
         java中的變量聲明: 變量類型 變量 = 變量值;
         js是一門弱類型的語言: 在js里面不需要去指定類型,同一個變量可以接收不同類型的數(shù)據(jù)
            var 變量名 = 變量值;
            let 變量名 = 變量值; ecmaScript6之后,一般都使用 let 關鍵字

         js中的數(shù)據(jù)類型:
            1. 基本數(shù)據(jù)類型: number(所有的數(shù)值), string(字符串), undefined(未定義), boolean
                null: 對象類型,已經(jīng)知道了數(shù)據(jù)類型,但對象為空;
?               undefined:未定義的類型,并不知道是什么數(shù)據(jù)類型;
            2. 引用數(shù)據(jù)類型: object

         獲取某個變量的類型的關鍵字是 typeof

         string 轉(zhuǎn) number parseInt() 或者 parseFloat()
         number 轉(zhuǎn) string toString()
         number 或者 string 轉(zhuǎn) boolean
            1. 0為 false 非0為 true
            2. 空字符串為 false 非空字符串為 true
    */
    //string 轉(zhuǎn) number
    let test2 = "100";
    let test3 = parseInt(test2);
    console.log(typeof (test3));
    let test4 = "101.00";
    let test5 = parseFloat(test4);
    console.log(typeof (test5));

    // number 轉(zhuǎn) string
    let test6 = 120;
    let number = test6.toString();
    console.log(typeof (number));

    // number 或者 string 轉(zhuǎn) boolean
    let test7 = null;
    let b1 = new Boolean(test7);
    console.log(b1);
    let test8 = "test";
    let b2 = new Boolean(test8);
    console.log(b2);
</script>
</body>
</html>

2.運算符

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>JS學習</title>
</head>
<body>
<script>
    /*
        JS中的運算符與Java中的運算符基本相同, 不同的是js中 == ===,!= !==;
            == 比較值  != 相反
            === 即比較值又比較數(shù)據(jù)類型  !== 相反
    */
    let i = 3.14
    let str = "3.14"
    console.log(i == str);
    console.log(i === str);
</script>
</body>
</html>

3.邏緝語句

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>JS學習</title>
</head>
<body>
<script>
    /* 使用js輸出9x9乘法表 */
    // 外循環(huán)控制行數(shù)
    document.write("<table border='0px' cellspacing='0' cellpadding='4px'")
    for (let i = 1; i <= 9; i++) {
        // 內(nèi)循環(huán)控制列數(shù)
        document.write("<tr align='center'>")
        for (let j = 1; j <= i; j++) {
            document.write("<td>")
            document.write(j + "x" + i + "=" + j * i);
            document.write("</td>")
        }
        document.write("</tr>")
    }
    document.write("</talbe>")
    // if語句與java相同
    // switch語句與java相同
</script>
</body>
</html>

4.函數(shù)

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>JS學習</title>
</head>
<body>
<script>
    /*
        1.js的函數(shù)分為兩種
            普通函數(shù)方式
                function 函數(shù)名(參數(shù)...){}
            匿名函數(shù)
                事件名 = function(參數(shù)...){}

        2.js的函數(shù)是沒有重載的,同名的函數(shù)會覆蓋前面的 (帶參數(shù)的函數(shù),基本都有點類似java中的可變函數(shù))
        3.函數(shù)聲明時的參數(shù)個數(shù)和函數(shù)調(diào)用時傳入的參數(shù)個數(shù),可以不一樣;
     */
    function add(a, b, c) {
        console.log("arguments數(shù)組中的數(shù)據(jù):" + arguments.length);
        console.log(a + "," + b + "," + c);
        return a + b + c;
    }
    let add1 = add(1,2,3);
    console.log(add1);
    document.write(add1);
    
    let add2 = add(1,2);// 第三個參數(shù)不傳,控制臺打印出的是 undefined;
    console.log(add2);
    document.write(add2);
    
    let add3 = add(1,2,3,4);// 傳入的超過的參數(shù),沒有被處理,結(jié)果與傳入前三個參數(shù)一樣;
    console.log(add3);
    document.write(add3);
</script>
</body>
</html>

5事件

5.1兩種綁定方式

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>JS學習</title>
</head>
<body>
<!--
    綁定事件的兩種方式:
        1. 靜態(tài)綁定, 就是直接在標簽上進行綁定
        2. 動太綁定, (匿名函數(shù)方式)使用js代碼進行事件的綁定
-->
<input type="button" value="靜態(tài)綁定按扭" onclick="staticButton(value)">
<input type="button" value="動態(tài)綁定按扭" id="btn">
<script>
    // 靜態(tài)綁定函數(shù)
    function staticButton(a) {
        alert("你想干嘛呢?")
    }

    // 動態(tài)綁定函數(shù)
    let elementById = document.getElementById("btn");
    elementById.onclick = function () {
        alert("你又想干嘛呢?")
    }
</script>
</body>
</html>

5.2常見的事件

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>JS學習</title>
</head>
<body>
<script>
    /*
        Js中常用的點擊事件
            1. 點擊事件 onclick
            2. 焦點事件 onfocus(獲得焦瞇), onblur(失去焦點)
            3. 頁面加載完畢的事件 onload
            4. 內(nèi)容改變事件, 通常是給下拉框綁定 onchange
            5. 鼠標相關的事件 onmouseover(移入), onmouseout(移出)
            6. 鍵盤相關的事件 onkeydown(按下), onkeyup(抬起)
     */
    // 當瀏覽器加載完畢之后, 再執(zhí)行之個事件里面的代碼, 也就是布局類的標簽代可以不用寫在<script>標簽上面
    window.onload = function () {
        let textID = document.getElementById("text");
        // 給元素綁定事件
        textID.onfocus = function () {
            console.log("獲取到了焦點");
        }
        textID.onblur = function () {
            console.log("失去了焦點");
        }

        let selID = document.getElementById("sel");
        selID.onchange = function () {
            console.log(selID.value);
        }
    }
</script>
<input type="text" id="text">
<select id="sel">
    <option>小魚人</option>
    <option>敵法師</option>
    <option>小娜迦</option>
    <option>大娜迦</option>
    <option>小黑</option>
    <option>幻影刺客</option>
</select>
</body>
</html>

6.內(nèi)置對象

6.1正則對象

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>JS學習</title>
</head>
<body>
<script>
    // js中的正則表達式, 與java中的大同小異
    let reg1 = /[a-z]{3}/; // 模糊匹配: 只要你的字符串中出現(xiàn)了三個小寫字母都可以
    let reg2 = /^[a-z]{3}$/; // 精確匹配: 三個小寫的字母
    let b = reg2.test("abc");
    console.log(b);

    // 手機號碼: 以1開頭, 第二位是 3,4,5,6,7,8,9 的11位數(shù)字
    let regPhoneNum = /^1[3456789]\d{9}/;
    let b1 = regPhoneNum.test("13026627164");
    console.log(b1);
</script>
</body>
</html>

常見js正則表達示規(guī)則, 與java基本相同, 可能就是轉(zhuǎn)義方式不一樣

符號 作用
\d 數(shù)字
\D 非數(shù)字
\w 單詞:a-zA-Z0-9_
\W 非單詞
. 通配符,匹配任意字符
{n} 匹配n次
{n,} 大于或等于n次
{n,m} 在n次和m次之間
+ 1~n次
* 0~n次
? 0~1次
^ 匹配開頭
$ 匹配結(jié)尾
[a-zA-Z] 英文字母
[a-zA-Z0-9] 英文字母和數(shù)字
[xyz] 字符集合, 匹配所包含的任意一個字符

6.2數(shù)組對象

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>JS學習</title>
</head>
<body>
<script>
    /*
        js中數(shù)組的特點:
            1. 數(shù)組的長度是可變的
            2. 數(shù)組中的元素類型可以是任意類型
     */
    let arr = [1,2,3,4,"a","b"]
    /*for (var i = 0; i < arr.length; i++) {
        //獲取數(shù)組中的每一個元素
        var arrElement = arr[i];
        console.log(arrElement)
    }*/
    arr[6] = true;
    arr[7] = "你好世界"

    //js的數(shù)組里面常用的一些方法:
    //1. concat(),將多個數(shù)組合并成一個數(shù)組
    let strList = ["hello","jay","aoBaMa"]

    // let newArr = arr.concat(strList);
    // for (let i = 0; i < newArr.length; i++) {
    //     let newArrElement = newArr[i];
    //     console.log(newArrElement)
    // }

    //2. join()方法,將數(shù)組中的每一個元素,通過分隔符進行拼接字符串
    let str = arr.join(",");
    console.log(str)

    //3. reverse()方法,反轉(zhuǎn)數(shù)組
    let newArr = arr.reverse();
    for (let i = 0; i < newArr.length; i++) {
        let newArrElement = newArr[i];
        console.log(newArrElement)
    }
</script>
</body>
</html>

6.3日期對象

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>JS學習</title>
</head>
<body>
<script>
    //創(chuàng)建當前時間的date
    let date = new Date();
    console.log(date);

    //創(chuàng)建指定年月日的date,注意:月是從0-11
    let date01 = new Date(2020, 6, 11)
    console.log(date01);

    //創(chuàng)建指定年月日時分秒的date
    let date02 = new Date(2020, 6, 11, 23, 11, 50)
    console.log(date02);

    //創(chuàng)建指定時間戳的date,什么是時間戳:格林威治時間從1970年1月1日0時0分0秒到現(xiàn)在的毫秒數(shù)
    //獲取某個時間的時間戳
    let date03 = date.getTime();

    //通過時間戳創(chuàng)建date
    let date04 = new Date(date03 + 60 * 60 * 1000);
    console.log(date04);

    //需求:計算到十一放假還有多少天
    let date5 = new Date(2020,9,1);
    let date6 = new Date(2020,6,9);
    console.log((date5.getTime()-date6.getTime())/1000/60/60/24);

</script>
</body>
</html>

三.BOM (window對象)

JS中的window代表整個瀏覽器, 但是通常window對象可以省略;

1.三種彈窗

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>window對象</title>
</head>
<body>
    <!--
        一、三種彈框
        1. alter()警告框,只能點確定,不點確定頁面就沒法繼續(xù)運行
        2. confirm()確認框,可以點擊確定或者取消,通常用于詢問是否要執(zhí)行某個操作
           這個方法的返回值是boolean類型,如果點擊確定則為true,否則為false
        3. prompt()輸入框,彈出一個可以讓用戶進行輸入的框,這個方法有返回值,返回值
           就是輸入的內(nèi)容,如果點擊取消則返回null
    -->
    <script>
        //1. 警告框
        //window.alert("hello")

        //2. 確認框
        /*let flag = confirm("你確定要刪除嗎?");
        console.log(flag)*/

        //3. 輸入框
        let age = prompt("請輸入你的年齡");

        if (parseInt(age) >= 18) {
            alert("可以訪問")
        } else {
            alert("請大一點了再訪問")
        }
    </script>
</body>
</html>

2.兩種定時方式

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>JS學習</title>
</head>
<body>
<script>
/*
    定時器的話就是隔一段時間執(zhí)行一個任務
        1. setTimeout(), 只執(zhí)行一次,也就相當于是一個延時器
        2. setInterval(), 這個是循環(huán)執(zhí)行的, 也就是真的定時器
            第一個參數(shù)是要執(zhí)行的匿名函數(shù)
            第二個參數(shù)是間隔時間
            該方法的返回值是這個定時器id
 */
    let id = 0;
    // window 對象可省略
    let times = window.setInterval(function () {
        id++;
        if (id>=5){
            // 清除定時器,需要指定清除的是哪一個定時器,也就是 setInterval 函數(shù)的返回值;
            window.clearInterval(times);
        }
        console.log("活是不想活了,死又怕疼,就這么著吧!")
    },3000);
</script>
</body>
</html>

3.history

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>location對象</title>
</head>
<body>
   <script>
    // 瀏覽器的后退功能
    // history.back();
    window.history.go(-1);
    // 瀏覽器的前進功能
    // history.forward();
    // window.history.go(1);
</script>
</body>
</html>

4.location

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>location對象</title>
</head>
<body>
    <script>
        //location對象其實就代表瀏覽器的地址欄
        //location對象的href屬性,就表示地址欄中的地址
        //let href = location.href; //獲取地址欄的地址,用的不多
        //console.log(href)

        //設置地址欄的地址,訪問改地址: 使用js代碼訪問某個地址
        window.location.
    </script>
</body>
</html>

四.DOM (document對象)

1.操作標簽

方法 描述 返回值
document.getElementById(id) 根據(jù)id獲取標簽 Element對象
document.getElementsByName(name) 根據(jù)標簽name獲取一批標簽 Element類數(shù)組
document.getElementsByTagName(tagName) 根據(jù)標簽名稱獲取一批標簽 Element類數(shù)組
document.getElementsByClassName(className) 根據(jù)類名獲取一批標簽 Element類數(shù)組
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>JS學習</title>
</head>
<body>
    <div id="d1" name="n1">hello div1</div>
    <div class="c1">hello div2</div>
    <span class="c1">hello span1</span>
    <span name="n1">hello span2</span>
    <script>
        // 1.document.getElementById(id) 示例
        let elementById = document.getElementById("d1");
        console.log(elementById);

        // 2.document.getElementsByName(id) 示例
        let elementsByName = document.getElementsByName("n1");
        // for (let elementsByNameKey in elementsByName) {
        //     console.log(elementsByNameKey)
        // }
        for (let elementsByNameElement of elementsByName) {
            console.log(elementsByNameElement);
        }

        // 3.document.getElementsByTagName(id)
        // 4.document.getElementsByClassName(id)
    </script>
</body>
</html>

2.操作標簽體

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>JS學習</title>
</head>
    <div id="city"><h2>北京</h2></div>
    <input type="button" value="改變城市1" placeholder="BJ" onclick="getCity(placeholder) "/>
    <br>
    <br>
    <input type="button" value="改變城市2" placeholder="SZ" onclick="changeCity(placeholder)"/>
<script>
    function getCity(a) {
        let elementById = document.getElementById("city");
        // innerText只能設置純文件
        elementById.innerText = a;
    }

    function changeCity(b) {
        // innerHTML是設標簽里面的所以內(nèi)容,包括子標簽
        let elementById = document.getElementById("city");
        elementById.innerHTML = "<h2>" + b + "</h2>";
    }
</script>
</body>
</html>

3.操作標簽的屬性

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>JS學習</title>
</head>
<input id="password" type="password">
<input type="button" value="顯示密碼" onmousedown="showPassword()" onmouseup="unShowPassword()">
<script>
    //需求:按住顯示密碼按鈕的時候,就顯示密碼框中的密碼; 按鍵松開的時候,就隱藏密碼
    let elementById = document.getElementById("password");
    function showPassword() {
        // 操作其 type 屬性
        elementById.setAttribute("type","text");
    }
    function unShowPassword() {
        // 操作其 type 屬性
        elementById.setAttribute("type","password");
    }
</script>
</body>
</html>

五.JS案例

1.表單提交案例

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>JS學習</title>
</head>
<table>
    <tr>
        <td align="left">請輸入帳戶</td>
        <td><input type="text" name="name" onfocus="tips()" onblur="checkName(this.value)"></input>
            <span style="color: red;size: A5" id="username">請輸入4-16個字符,以字母開頭</span>
        </td>
    </tr>
    <tr>
        <td align="left">請輸入電話號碼</td>
        <td><input type="text" name="pv" onfocus="phoneTips()" onblur="checkPhone(this.value)"></input>
            <span style="color: red;size: A5" id="phone">請輸入電話號碼,以1開頭,第2位為3579</span>
        </td>
    </tr>
</table>

<script>
    // 表單校驗賬號密碼
    function tips() {
        console.log("tips這里走了嗎?")
        // input 只能設置 value 不能使用 innerHtml 來設置值
        document.getElementById("username").innerHTML = "請輸入4-16個字符,以字母開頭";
    }

    function checkName(value) {
        console.log("checkName這里走了嗎?")
        let regStr = /^[a-z]\w{3,15}$/;
        let b = regStr.test(value);
        if (b) {
            document.getElementById("username").innerHTML = "帳戶設置ok";
        } else {
            document.getElementById("username").innerHTML = "請輸入4-16個字符,以字母開頭";
        }
    }

    function phoneTips() {
        console.log("phoneTips這里走了嗎?")
        document.getElementById("phone").innerHTML = "請輸入電話號碼,以1開頭,第2位為3579"
    }

    function checkPhone(value) {
        console.log("checkPhone這里走了嗎?")
        let regStr = /^[1][3579]\d{9}$/;
        // let regStr = /^[1][3579][1-9]{9}$/;
        let b = regStr.test(value);
        if (b) {
            document.getElementById("phone").innerHTML = "電話號碼設置ok"
        } else {
            document.getElementById("phone").innerHTML = "請輸入電話號碼,以1開頭,第2位為3579"
        }
    }
</script>
</body>
</html>

2.輪播圖案例

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>JS學習</title>
</head>
<div>
    <img src="../img/banner_1.jpg" id="banner" width="500px">
</div>
<script>
    let banners = ["../img/banner_1.jpg", "../img/banner_2.jpg", "../img/banner_3.jpg"];
    let num = 0;
    setInterval(function () {
        if (num >= 3) {
            num = 0;
        }
        document.getElementById("banner").setAttribute("src", banners[num]);
        num++;
    }, 2000);
</script>
</body>
</html>

3.省市二級聯(lián)動案例

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>JS學習</title>
</head>
<select id="province">
    <option value="0">請選擇省份</option>
    <option value="1">廣東省</option>
    <option value="2">湖北省</option>
    <option value="3">湖南省</option>
</select>
<select id="city">
    <option>請選擇城市</option>
</select>
<script>
    let city = [
        [],
        ["廣州", "深圳", "佛山"],
        ["武漢", "荊州", "襄陽"],
        ["長沙", "常德", "鳳凰"]
    ];
    // 獲取顯示省份的元素
    let provinceElement = document.getElementById("province");
    // 獲取顯示市的元素
    let citySelect = document.getElementById("city");

    provinceElement.onchange = function () {
        // 獲取省對應下的市級列表
        let value = provinceElement.value;
        let cityNames = city[value];

        // 遍歷添加之前,先清除城市下拉框中的所有option
        citySelect.innerHTML = "<option>請選擇城市</option>"
        for (let cityName  of cityNames) {
            let optionElement = document.createElement("option");
            optionElement.innerHTML = cityName;
            citySelect.appendChild(optionElement);
        }
    };
</script>
</body>
</html>
?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

友情鏈接更多精彩內(nèi)容