前端三剑客——javascript-BOM-DOM-http协议-异步

   大纲:

  1.BOM(浏览器对象模型)

       window对象

       location对象

       本地存储

  2.DOM(文档对象模型)

      元素操作(直接获取/间接获取)

      事件操作

         --静态绑定事件

         --动态绑定事件(事件监听器)

  3.js异步

      Promise

      Async/await

  4.HTTP协议

      URL地址解释

      HTTP协议概述

      常见HTTP请求方法

      请求与响应流程

      请求与响应的结构

      常见的响应状态码

      

 

 

BOM(浏览器对象模型)

  window  当前网页创建的超全局对象

//window
//浏览器窗口显示内容区域的高宽
console.log(innerWidth);
console.log(innerHeight);
//浏览器窗口的整体高宽
console.log(outerHeight);
console.log(outerHeight);

  location  地址栏对象

//location      地址栏对象
/**
 * location.assign(url) :   跳转
 * location.reload()    :   刷新
 */
//location      地址栏对象
/**
 * location.assign(url) :   跳转
 * location.reload()    :   刷新
 */

//location.assign(url)      跳转到指定url地址
location.assign('https://www.cnblogs.com/guohan222/p/19185633');

//location.reload()         刷新
setInterval(function () {
    location.reload();
},2000)

  本地存储  

//本地存储
/**
 * 根据  域名/IP:端口  不同对数据进行分开存储在浏览器中   同一域名不同端口存储的数据也不同
 * localStorage:    永久存储
 * sessionStorage:   会话存储(关闭浏览器后数据清除)
 *
 *
 * localStorage和sessionStorage方法一样
 * 增:
 * localStorage.setItem(‘属性’,‘值’)
 * localStorage.属性 = 值
 *
 * 删:
 * localStorage.removeItem('属性')    指定删除
 * localStorage.clear()              全部删除
 *
 * 改:
 * localStorage,属性 =  值
 *
 * 查:
 * localStorage.getItem('属性')
 * localStorage.属性
 */
//本地存储
/**
 * 根据  域名/IP:端口  不同对数据进行分开存储在浏览器中   同一域名不同端口存储的数据也不同
 * localStorage:    永久存储
 * sessionStorage:   会话存储(关闭浏览器后数据清除)
 */

//localStorage      永久存储

//添加数据到本地存储中
localStorage.setItem('name', 'guohan');
localStorage.age = 22;

//在本地存储中删除数据
//指定删除
localStorage.removeItem('name');
//全部删除
localStorage.clear();

//修改本地存储中的数据
localStorage.name = 'gh';

//获取本地存储中的数据
console.log(localStorage.getItem('name'));
console.log(localStorage.age);

 

DOM(文档对象模型)

  元素操作(直接获取/间接获取)

//DOM文档对象模型
/**
 * 元素的获取
 *              直接获取
 * 通过css样式选择器获取单一元素:                          document.querySelector('选择器')
 * 通过css样式选择器获取多个元素(数组):                    document.querySelectorAll('选择器')
 * 通过id属性值获取单一元素:                              document.getElementById('id属性值')
 * 通过标签获取多个元素(数组):                           document.getElementsTagName('标签')
 * 通过class属性值获取多个元素(数组):                    document.getElementsByClassName('class属性值')
 *
 *              间接获取
 * 获取此元素的子元素:                                   .children
 * 获取此元素的第一个/最后一个子元素:                       .firstElementChild / .lastElementChild
 * 获取子元素的父级元素:                                  .parentElement
 * 获取元素的下一个/上一个兄弟元素:                         .nextElementSibling / .previousElementSibling
 *
 */
方法演示
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <style>
        /*类选择器*/
        .f1 {
            background-color: #0a53be;
        }

        /*id选择器*/
        #f2 {
            background-color: #3f51b5;
        }
    </style>
</head>
<body>
<ul>
    <li class="f1">1</li>
    <li id="f2"><a href="">点我</a></li>
    <li>3</li>
    <li>4</li>
    <li class="f1">5</li>
</ul>
<script>
//直接获取
        //获取单一元素

        //通过css样式选择器获取
    var l1 = document.querySelector('.f1');
    //后代选择器
    var l2 = document.querySelector('#f2 a');
    console.log(l1);
    console.log(l2);
    //修改元素样式
    l1.style.backgroundColor = 'red';
    //通过id获取
    var l21 = document.getElementById('f2');
    console.log(l21);
    //直接获取body元素
    var body = document.body
    console.log(body);

    //获取多个元素(以数组形式展示)
    //通过css样式选择器获取
    var set = document.querySelectorAll('.f1')
    console.log(set)
    //通过元素的标签类型获取
    var tag = document.getElementsByTagName('li')[4]
    console.log(tag)
    //通过元素的class属性值获取
    var cls = document.getElementsByClassName('f1')
    console.log(cls)


    //间接获取
        //获取ul标签下的子元素
        var ul = document.getElementsByTagName('ul')[0];
        console.log(ul.children);

        //获取ul标签下的第一个子元素
        var firstLi = ul.firstElementChild
        console.log(firstLi);

        //获取ul标签下的最后一个子元素
        var lastLi = ul.lastElementChild
        console.log(lastLi);

        //最后一个子元素的上一个兄弟元素
        var siblingLi = lastLi.previousElementSibling;
        console.log(siblingLi);

        //第一个子元素的下一个兄弟元素
        var nextLi = firstLi.nextElementSibling;
        console.log(nextLi);

        //li标签的父级元素
        var parent = nextLi.parentElement;
        console.log(parent);
</script>
</body>
</html>

  事件操作

(给HTML元素静态的绑定事件)

基于本地存储实现任务列表
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <style>
        body {
            margin: 0;
        }

        .todolist {
            width: 750px;
            margin: 40px auto;
            box-shadow: 5px 5px 20px #aaa;
        }

        .todolist .add {
            text-align: center;
            padding: 20px 0;
        }

        .todolist .playlist {
            width: 500px;
            margin: 0 auto;
        }

        .playlist span {
            float: left;
        }

        .playlist button {
            height: 23.33px;
            float: right;
            margin-left: 10px;

        }

        input[name="content"] {
            height: 20px;
            width: 250px;
        }
    </style>
</head>
<body>
<div class="todolist">
    <div class="add">
        <input type="text" name="content" value="">
        <button class="btn" style="height: 26px">添加</button>
    </div>
    <div class="playlist">
        <ol class="tell"></ol>
        <div style="clear:both"></div>
    </div>
</div>
<script>
    var ipt = document.querySelector('input[name="content"]');
    var btn = document.querySelector('.btn');
    var tell = document.querySelector('.tell');
    var data = [];

    //基于本地存储获取之前数据
    if (localStorage.work) {
        data = JSON.parse(localStorage.work);
        show();
    }

    //展示数据
    function show() {
        //页面展示
        let tellContent = "";
        for (let i = 0; i < data.length; i++) {
            content = data[i];
            tellContent += `
                <li>
                <span>${content}</span>
                <button onclick="delet(${i})">删除</button>
                <button onclick="displacement(['↓',${i}])">↓</button>
                <button onclick="displacement(['↑',${i}])">↑</button>
                </li>`;
        }
        tell.innerHTML = tellContent;

        //本地存储
        localStorage.setItem('work', JSON.stringify(data));
    }

    //添加数据
    btn.onclick = () => {
        data.push(ipt.value);
        show();
        ipt.value = "";
    }

    //删除数据
    function delet(index) {
        data.splice(index, 1);
        show();
    }

    //移动任务
    function displacement([param, index]) {
        if (param === "↑") {
            if (index === 0) {
                return;
            }
            let num = data[index - 1];
            data[index - 1] = data[index];
            data[index] = num;
            show();
        } else if (param === "↓") {
            if (index === data.length - 1) {
                return;
            }
            let num = data[index + 1];
            data[index + 1] = data[index];
            data[index] = num;
            show();
        }
    }

</script>

</body>
</html>

(给HTML元素动态的绑定事件)事件监听器    .

//事件监听器     .addEventListener()
/**
 * 给DOM元素动态绑定事件,响应交互的方法
 * 格式
 * Element.addEventListener('eventType',handlerFunction(e){})
 *
 * eventType:   事件类型如click(简而言之代替了onclick)
 * handlerFunction:     事件处理函数
 * e:       即event事件
 *
 * 相较于直接写静态事件绑定好处
 * 1.js代码不存在于HTML标签里
 * 2.同一个按钮添加多个事件(比如点击事件和键盘事件)
 * 3.可临时禁用某个按钮功能        Element.removeEventListener('eventType',handlerFunction(e){})
 *
 */

//案例:   Form表单提交
/**
 * 表单提交围绕三大场景
 * 1.表单提交    form.submit()
 * 2.重置       form.reset()
 * 3.事件监听    form.addEventListener('eventType',handlerFunction(e){})
 *
 * e.preventDefault():      阻止浏览器对表单的自动提交防止跳过非法检测
 * e.target:                指向触发此事件的HTML中的元素
 */
基于本地存储实现任务列表优化版.
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <style>
        body {
            margin: 0;
        }

        .todolist {
            width: 750px;
            margin: 40px auto;
            box-shadow: 5px 5px 20px #aaa;
        }

        .todolist .add {
            text-align: center;
            padding: 20px 0;
        }

        .todolist .playlist {
            width: 500px;
            margin: 0 auto;
        }

        .playlist span {
            float: left;
        }

        .playlist button {
            height: 23.33px;
            float: right;
            margin-left: 10px;

        }

        input[name="content"] {
            height: 20px;
            width: 250px;
        }
    </style>
</head>
<body>
<div class="todolist">
    <div class="add">
        <input type="text" name="content" value="">
        <button class="btn" style="height: 26px">添加</button>
    </div>
    <div class="playlist">
        <ol class="tell"></ol>
        <div style="clear:both"></div>
    </div>
</div>
<script>
    var ipt = document.querySelector('input[name="content"]');
    var btn = document.querySelector('.btn');
    var tell = document.querySelector('.tell');
    var data = [];

    //基于本地存储获取之前数据
    if (localStorage.work) {
        data = JSON.parse(localStorage.work);
        show();
    }

    //展示数据(优化)
    function show() {
        //页面展示
        tell.innerHTML = '';
        data.forEach((content, index) => {
            //创建li标签
            const li = document.createElement("li");
            //创建span标签并填充数据,添加到li标签里
            const span = document.createElement("span");
            span.innerText = content;
            li.appendChild(span);
            //创建删除按钮并板顶一个事件监听器取代之前的onclick,添加到li标签里
            const deleterBtn = document.createElement("button");
            deleterBtn.innerText = "删除";
            deleterBtn.addEventListener("click", function () {
                delet(index);
            })
            li.appendChild(deleterBtn);
            //创建上移按钮并板顶一个事件监听器取代之前的onclick,添加到li标签里
            const upBtn = document.createElement("button");
            upBtn.innerText = "↑";
            upBtn.addEventListener("click", function () {
                displacement([upBtn.innerText, index]);
            })
            li.appendChild(upBtn);
            //创建下移按钮并板顶一个事件监听器取代之前的onclick,添加到li标签里
            const downBtn = document.createElement("button");
            downBtn.innerText = "↓";
            downBtn.addEventListener("click", function () {
                displacement([upBtn.innerText, index]);
            })
            li.appendChild(downBtn);
            tell.appendChild(li);
        })
        //本地存储
        localStorage.setItem('work', JSON.stringify(data));
    }

    //添加数据
    btn.addEventListener("click", () => {
        data.push(ipt.value);
        show();
        ipt.value = "";
    });

    //删除数据
    function delet(index) {
        data.splice(index, 1);
        show();
    }

    //移动任务
    function displacement([param, index]) {
        if (param === "↑") {
            if (index === 0) {
                return;
            }
            let num = data[index - 1];
            data[index - 1] = data[index];
            data[index] = num;
            show();
        } else if (param === "↓") {
            if (index === data.length - 1) {
                return;
            }
            let num = data[index + 1];
            data[index + 1] = data[index];
            data[index] = num;
            show();
        }
    }

</script>

</body>
</html>

 

js异步操作

  Promise  Javascript中用于处理异步操作的操作对象

image

//js异步解决方案1:Promise   :   代表异步操作最终的结果以及结果值的对象,简单来说是js中用于处理异步操作的对象
/**
 * promise三种状态
 * pending
 * fulfilled
 * rejected
 *
 * 异步格式:
 * var promise = new Promise(function(resolve,reject){
 *     if(异步操作成功){
 *         resolve(value);
 *     }else{
 *         reject(error);
 *     }
 * })
 *
 * //.then()和.catch() :  promise状态发生改变触发
 * promise.then(res=>console.log(res)).catch(err=>console.log(err));
 *
 * //Promise.all([]) :
 * 将多个Promise实例包装成一个Promise实例
 * 所有都成功时:返回一个结果数组
 * 只要有一个失败时:返回最先被reject状态的值
 *
 * //Promise.race([]):
 * 将多个Promise实例包装成一个Promise实例
 * 不管状态是否是成功还是失败,哪个结果获得的快就返回哪个结果
 * @type {Promise<unknown>}
 */
//基本格式与promise。then()和,catch()
var promise = new Promise(function(resolve,reject){
    // resolve('ab');
    reject('aa');
});
//promise状态发生改变就会触发
promise.then(res=>{
    console.log(res);
}).catch(err=>{
    console.log(err);
})




//Promise.all([])
let promise1 = new Promise(function (resolve, reject) {
    resolve('success1');
})
let promise2 = new Promise(function (resolve, reject) {
    resolve('success2');
})
let promise3 = new Promise(function (resolve, reject) {
    reject('bad');
})

Promise.all([promise1, promise2]).then(res=>console.log(res)).catch(error=>console.error)                   //(2) ['success1', 'success2']

Promise.all([promise1, promise2,promise3]).then(res=>console.log(res)).catch(err=>console.log(err));        //bad



//Promise.race([])
let promise1 = new Promise(function (resolve, reject) {
    setTimeout(function () {
        resolve('success1');
    }, 1000);
})
let promise2 = new Promise(function (resolve, reject) {
    setTimeout(function () {
        resolve('success2');
    }, 2000);
})
let promise3 = new Promise(function (resolve, reject) {
    setTimeout(function () {
        reject('success3');
    }, 200);
})

Promise.race([promise1, promise2]).then(res => console.log(res)).catch(err => console.log(err));
Promise.race([promise1,promise2, promise3]).then(res => console.log(res)).catch(err => console.log(err));

//success3
//success1

  Async/await  Javascript中用于处理异步操作的操作对象    本质上还是Promise    await相当于.then()

//js异步解决方案2: Async/await    :本质上还是Promise
/**
 * 格式:
 * async function f1(){
 *     return ???;
 *     等同于:
 *            // return Promise.resolve('abc');
 *           // return new Promise((resolve,reject)=>resolve('abc'))
 * }
 *
 *
 * // async 函数的核心作用就是自动将函数返回值包装成 Promise—— 如果函数本身已经返回 Promise,再加 async 就是 “多此一举”,完全没必要。
 * 例如:
 *     function f1(){
 *         return new Promise((resolve,reject)=>{
 *             setTimeout(()=>{resolve('111')},2000)
 *         })
 *     }
 *
 *
 * //遇到await会阻塞后面代码等执行完成后再执行后面代码
 *      如果结果状态是reject则后面代码不执行      得加try{}catch(e){}才能接收到reject状态并执行catch里面的代码
 *
 *
 * @returns {Promise<unknown>}
 */
//初识async
async function f1(){
    return 'abc';

      // 本质上是自动包装成Promise对象:
      // async 函数的核心作用就是自动将函数返回值包装成 Promise—— 如果函数本身已经返回 Promise,再加 async 就是 “多此一举”,完全没必要。
      // return Promise.resolve('abc');
      // return new Promise((resolve,reject)=>{resolve('abc')})

}
console.log(f1());     // Promise{<fulfilled>: 'abc'}




//与await结合  且结果状态是resolve
function f1(){
    return new Promise((resolve,reject)=>{
        setTimeout(()=>{resolve('111')},2000)
    })
}

async function f2(){
    return '222'
}

async function f3(){
    let a1 = await f1();
    let a2 = await f2();
    let a3 = '333';
    console.log(a1);
    console.log(a2);
    console.log(a3);
}
f3()


//与await结合  且结果状态是reject则后面代码不执行      得加try{}catch(e){}才能接收到reject状态并执行catch里面的代码
function f1() {
    return new Promise((resolve,reject) => {
        setTimeout(() => {
            reject('111')
        }, 2000)
    })
}

async function f2() {
    return '222'
}

async function f3() {
    try {
        let a1 = await f1();
        let a2 = await f2();
        let a3 = '333';
        console.log(a1);
        console.log(a2);
        console.log(a3);
    } catch (e) {
        console.log(e);
    }
}

f3()

 

HTTP协议

  URL地址解释

image

image

  HTTP协议概述

image

image

  常见HTTP请求方法

image

  请求与响应流程

image

  请求与响应的结构

image

 

  常见的响应状态码

image

image

image

 

posted @ 2025-11-09 21:34  guohan  阅读(4)  评论(0)    收藏  举报