Ajax

141 阅读4分钟

引入 axios.js:cdn.jsdelivr.net/npm/axios/d…
原来的 ajax.frontend.itheima.net:3006/XXX/XXXX
都替换成 ajax-base-api-t.itheima.net/XXX/XXXX
新接口文档:www.showdoc.com.cn/18347617346…
art-template的安装:aui.github.io/art-templat…
URL 编码的知识,请参考如下博客: blog.csdn.net/Lxd_0111/ar…
HTTP协议请求头字段的描述,可以查看 MDN 官方文档:developer.mozilla.org/zh-CN/docs/…
HTTP协议更多响应头字段的描述,可以查看 MDN 官方文档:developer.mozilla.org/zh-CN/docs/…
完整的 HTTP 响应状态码,可以参考 MDN 官方文档 developer.mozilla.org/zh-CN/docs/…

image.png

image.png

image.png

一、

1.客户端与服务器

image.png

image.png

image.png

image.png

2.URL地址

image.png

image.png

image.png

3.分析网页的打开过程

image.png

image.png

image.png

image.png

4.服务器对外提供了哪些资源

image.png

image.png

image.png

image.png

image.png

image.png

5.了解Ajax

image.png

image.png

image.png

image.png

image.png

image.png

image.png

6.jQuery中的Ajax

image.png

image.png

image.png

image.png

image.png

image.png

image.png

image.png

image.png

image.png

image.png

image.png

image.png

7.接口

image.png

image.png

image.png

image.png

image.png

image.png

image.png

image.png

image.png

image.png

image.png

image.png

8.案例-图书管理

image.png

image.png

trim():去除字符串两端的空格

image.png

image.png

image.png

image.png

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <link rel="stylesheet" href="./lib/bootstrap.css">
    <script src="./lib/jquery.js"></script>
</head>

<body style="padding: 15px;">
    <!-- 图书管理pannel面板 -->
    <!-- bs3-pannel:primary -->
    <div class="panel panel-primary">
        <div class="panel-heading">
            <h3 class="panel-title">添加新图书</h3>
        </div>
        <!-- 把文本框横着放:添加类名form-inline -->
        <div class="panel-body form-inline">
            <!-- bs3-input:addon:text -->
            <div class="input-group">
                <div class="input-group-addon">书名</div>
                <input type="text" class="form-control" id="iptBookname" placeholder="请输入书名">
            </div>
            <div class="input-group">
                <div class="input-group-addon">作者</div>
                <input type="text" class="form-control" id="iptAuthor" placeholder="请输入作者">
            </div>
            <div class="input-group">
                <div class="input-group-addon">出版社</div>
                <input type="text" class="form-control" id="iptPublisher" placeholder="请输入出版社">
            </div>
            <button id="btnAdd" class="btn btn-primary">添加</button>

        </div>
    </div>


    <!-- 图书管理表格 -->
    <!-- bs3-table:bordered -->
    <table class="table table-bordered table-hover">
        <thead>
            <tr>
                <th>Id</th>
                <th>书名</th>
                <th>作者</th>
                <th>出版社</th>
                <th>操作</th>
            </tr>
        </thead>
        <tbody id="tb">

        </tbody>
    </table>


    <script>
        $(function () {
            // 业务一、获取图书列表数据
            function getBookList() {
                // 1.发起ajax请求
                $.get('https://ajax-base-api-t.itheima.net/api/getbooks/', function (res) {
                    // console.log(res)
                    // 2.获取列表数据书否成功
                    if (res.status !== 200) return alert('获取数据失败!')
                    // 3.渲染页面结构
                    var rows = []
                    // 4.拼接字符串
                    $.each(res.data, function (i, item) {
                        // 拼接字符串'+item.id+' 
                        // 防止a跳转 href="javascript:;
                        rows.push('<tr><td>' + item.id + '</td><td>' + item.bookname + '</td><td>' + item.author + '</td><td>' + item.publisher + '</td><td><a href="javascript:;" class="del" data-id = "' + item.id + '">删除</a></td></tr>')
                    })
                    // 5.渲染表格结构
                    // join('') 数组元素无缝拼接
                    $('#tb').empty().append(rows.join(''))
                })
            }
            getBookList()

            // 业务二、 删除按钮 删除本条数据
            // 通过代理的方式为动态添加的元素绑定事件
            $("tbody").on("click", ".del", function () {
                var id = $(this).attr("data-id")
                // console.log(id)
                // {id:id} 指定获取的元素
                $.get("https://ajax-base-api-t.itheima.net/api/delbook", { id: id }, function (res) {
                    if (res.status !== 200) return alert("删除失败")
                    getBookList()
                })
            })

            // 业务三、 添加图书
            $("#btnAdd").on("click", function () {
                // alert("ok")
                var bookname = $("#iptBookname").val().trim()
                var author = $("#iptAuthor").val().trim()
                var publisher = $("#iptPublisher").val().trim()
                if (bookname == '' || author == '' || publisher == '') {
                    alert("请输入完整信息")
                } else {
                    // alert("ok")
                    // 添加图书
                    $.post("https://ajax-base-api-t.itheima.net/api/addbook",{bookname:bookname,author:author,publisher:publisher},function(res){
                        getBookList()
                        $("#iptBookname").val("")
                        $("#iptAuthor").val("")
                        $("#iptPublisher").val("")
                    })
                }
            })

        })
    </script>
</body>

</html>

9.案例-聊天机器人

实现页面滚动: resetui()
$(function(){
// 初始化右侧滚动条
// 这个方法定义在scroll.js中
resetui()
})

image.png

image.png

image.png

image.png

image.png

image.png

image.png

image.png

$(function () {
    // 初始化右侧滚动条
    // 这个方法定义在scroll.js中
    // 让页面滚动
    resetui()

    // 1.用户点击发送消息
    $("#btnSend").on('click', function () {
        var text = $("#ipt").val().trim()
        if (text.length <= 0) {
            return $("#ipt").val('')
        }
        // 用户输入内容不为空,渲染到聊天页面中
        // <></>  这种标签不能换行
        $("#talk_list").append('<li class="right_word"><img src="img/person02.png" /> <span>' + text + '</span></li>')
        // 清空输入框
        $("#ipt").val('')
        // 重新调用滚动条
        resetui()
        // 调用ajax请求 聊天机器人回复的内容
        getMsg(text)
    })

    // 2.获取聊天机器人回复的内容 封装到函数中
    function getMsg(text) {
        // ajax请求
        $.ajax({
            method: 'GET',
            url: 'https://ajax-base-api-t.itheima.net/api/robot',
            data: {
                spoken: text
            },
            success: function (res) {
                // console.log(res)
                // 判断是否获取成功
                if (res.message === 'success') {
                    // 把获取的机器人回复的消息渲染到聊天窗口中
                    var msg = res.data.info.text
                    $("#talk_list").append('<li class="left_word"><img src="img/person01.png" /><span>' + msg + '</span></li>')
                    // 滚动页面
                    resetui()
                    // 调用getVoice() 函数,把聊天机器人的文字内容转换成语音播放
                    getVoice(msg)
                }
            }

        })
    }

    // 3.把聊天机器人的文字内容转换成语音播放
    function getVoice(text) {
        $.ajax({
            method: 'GET',
            url: 'https://ajax-base-api-t.itheima.net/api/synthesize',
            data: {
                text: text
            },
            success: function (res) {
                console.log(res)
                // 如果请求成功,则res.voiceUrl是服务器返回的音频URL地址
                if (res.status === 200) {
                    var voiceUrl = res.voiceUrl
                    $("#voice").attr('src', voiceUrl)

                }
            }
        })
    }

    // 4.使用回车键发送消息
    // 给文本输入框绑定 键盘弹起keyup 事件
    $("#ipt").on('keyup', function (e) {
        // console.log(e.keyCode)
        // e.keyCode ASII码是13 
        if (e.keyCode === 13) {
            // 调用发送键的点击事件
            $("#btnSend").click()
        }

    })

})

二、form表单与模版引擎

image.png

image.png

image.png

2.1 form表单的基本使用

image.png

image.png

image.png

image.png

image.png

image.png

image.png

image.png

image.png

image.png

image.png

image.png

2.2 通过Ajax提交表单数据

image.png

image.png

image.png

image.png

image.png

2.3 案例-评论列表

image.png

清空表单文本框所有数据
获取表单,将jquery表单转换成dom元素($("#formAddCmt")[0]),再使用dom元素重置的方法(reset()) 清空表单所有数据

        $("#formAddCmt")[0].reset()
          

image.png

image.png

image.png

// 业务一、获取评论列表 函数
function getCommentList() {
    $.ajax({
        method: 'get',
        url: 'https://ajax-base-api-t.itheima.net/api/cmtlist',
        // 没有参数 可以省略data
        data: {},
        success: function (res) {
            // console.log(res)
            // 判断数据是否请求成功
            if (res.status !== 200) {
                return alert('请求数据失败!')
            }
            // console.log('请求数据成功')

            // 业务二、渲染ui结构:循环从服务器请求的数据,渲染到评论列表中
            // 存储渲染的数据
            var rows = []
            $.each(res.data, function (i, item) {
                var str = '<li class="list-group-item"><span class="badge" style="background-color: orange;">评论时间:' + item.time + '</span><span class="badge" style="background-color: skyblue;">评论人:' + item.username + '</span> ' + item.content + ' </li>'
                rows.push(str)
            })
            // 再把rows渲染到页面中
            // 先清空li,再追加
            $("#cmt-list").empty().append(rows)
        }
    })
}
// 记得调用函数
getCommentList()

// 业务三、评论面板中表单改造:给服务器提交数据
// 不要忘了入口函数
$(function () {
    $("#formAddCmt").submit(function (e) {
        // 阻止表单默认提交行为
        e.preventDefault()
        // 获取表单所有数据
        var data = $(this).serialize()
        // console.log(data)
        // 给服务器提交获取的用户输入的数据
        $.post('https://ajax-base-api-t.itheima.net/api/addcmt',data,function(res){
            if(res.status !== 201){
                return alert('发送数据失败')
            }
            // 将发送后的数据 服务器数据重新渲染
            getCommentList()
            // 清空表单文本框所有数据
            // 获取表单,将jquery表单转换成dom元素($("#formAddCmt")[0]),再使用dom元素重置的方法(reset()) 清空表单所有数据
            $("#formAddCmt")[0].reset()
        })
    })

})

2.4 模板引擎的基本概念

image.png

image.png

image.png

image.png

2.5 art-template模板引擎

image.png

image.png

image.png

image.png

image.png

image.png

image.png

image.png

image.png

image.png

image.png

image.png

image.png

image.png

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <!-- 1.导入art-template -->
    <script src="./lib/template-web.js"></script>
    <script src="./lib/jquery.js"></script>
</head>

<body>
    <div id="container"></div>
    <!-- 3.定义模板
    模板必须定义到script中,用html解析 -->
    <!-- <script type="text/javascript">  //type="text/javascript"解析的是js,如果不写这个属性,script默认解析js -->
    <script type="text/html" id="tpl-user">
        <!-- "{{}} 是占位符,“art-template”函数渲染的数据自动解析到{{}}里面 
         template把  数据data里面的name渲染到{{}}里面  -->

    <h1>{{name}}---------{{age}}</h1>

    <!-- art-template 标准语法:原文输出 -->
    {{@ text}}

    <!-- art-template 标准语法:判断输出 -->
    <div>
        {{if flag === 0}}
        flag的值是0
        {{else if flag === 1}}
        flag的值是1
        {{/if}}
    </div>

    <!-- art-template 标准语法:循环输出 -->
    <ul>
        {{each hobby}}
        <li>循环索引是:{{$index}},循环项是:{{$value}}</li>
        {{/each}}
    </ul>

    <!-- art-template 标准语法:过滤器 -->
    <!-- <h3>{{regTime}}</h3> //"2023-06-07T04:17:56.693Z" -->
    <h3>{{regTime | dateFormat}}</h3>
    <!-- 过滤输出结果: 2023-6-7 -->
    </script>

    <script>
        // 定义需要过滤时间数据的过滤器
        // date是形参,接收regTime
        template.defaults.imports.dateFormat = function (date) {
            var y = date.getFullYear()
            // 月份需要+1,因为从0开始
            var m = date.getMonth() + 1
            var d = date.getDate()
            return y + '-' + m + '-' + d
        }

        // 2.定义需要渲染的数据
        var data = {
            name: 'zs',
            age: 18,
            text: '<h3>测试原文输出</h3>',
            flag: 1,
            hobby: ['吃饭', '睡觉', '打代码'],
            regTime: new Date()
        }

        // 4.调用template函数 template('模板id(不加#)',数据)
        var htmlStr = template('tpl-user', data)
        console.log(htmlStr)  // 结果:<h1>zs</h1>

        // 5.渲染HTML结构
        $("#container").html(htmlStr)
    </script>
</body>

</html>

image.png

image.png

$(function () {
    // 5.给时间补0函数
    function padZero(n) {
        return n < 10 ? '0' + n : n
    }

    // 4.定义时间过滤器
    template.defaults.imports.dataFormat = function (newdate) {
        var dt = new Date(newdate)

        var y = dt.getFullYear()
        var m = padZero(dt.getMonth())
        var d = padZero(dt.getDate())

        var hh = padZero(dt.getHours())
        var mm = padZero(dt.getMinutes())
        var ss = padZero(dt.getSeconds())

        return y + '-' + m + '-' + d + ' ' + hh + ':' + mm + ':' + ss

    }

    // 1.获取新闻列表的函数
    function getNewsList() {
        // 发起ajax请求
        $.get('https://ajax-base-api-t.itheima.net/api/news', function (res) {
            if (res.status !== 200) {
                return alert('获取新闻数据列表失败!')
            }
            // console.log(res.data)

            // 3.编译模版
            // 3.1 把body里面的新闻项剪切到script标签中

            // 3.2 填充template标准语法渲染新闻数据
            // 把res里data里tags字符串数据转换成数组字符串,再循环渲染到script标签中
            for (var i = 0; i < res.data.length; i++) {
                res.data[i].tags = res.data[i].tags.split(',') // tags:(3) ['三大运营商', '中国移动', '5G商用']
            }
            console.log(res)
            // 值是res,不是res.data
            var htmlStr = template('tpl-news', res)
            // 渲染到新闻列表中
            $("#news-list").html(htmlStr)
        })
    }

    getNewsList()

    // 2.html页面中定义template模版
})

2.6 模板引擎实现原理

image.png

image.png

image.png

image.png

image.png

image.png

image.png

image.png

image.png

image.png

image.png

image.png

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <!-- <script src="./lib/template-web.js"></script> -->
    <!-- 调用自己封装的模板引擎template -->
    <script src="./js/template.js"></script>
</head>

<body>
    <div id="user"></div>
    <!-- 1.创建模板 -->
    <script type="text/html" id="tpl-user">
        <div>姓名:{{name}}</div>
        <div>年龄:{{ age}}</div>
        <div>性别:{{gender }}</div>
        <div>住址:{{ address }}</div>
     </script>

    <!-- 预调用模板引擎 -->
    <script>
        // 2.创建数据
        var data = {
            name: '张三',
            age: 20,
            gender: '男',
            address: '北京市密云区'
        }

        // 3.封装自己的模板引擎template 在js文件中 

        // 4.调用模板引擎:template
        var htmlStr = template('tpl-user', data)

        // 5.渲染到html中
        document.getElementById("user").innerHTML = htmlStr
    </script>
</body>

</html>

// 封装自己的模板引擎template
    function template(id,data){
        var str = document.getElementById(id).innerHTML
        var pattern = /{{\s*([a-zA-Z]+)\s*}}/

        var patternResult = null
        while(patternResult=pattern.exec(str)){
            str = str.replace(patternResult[0],data[patternResult[1]])
        }
        return str
    }

三、Ajax加强

image.png

image.png

image.png

3.1 XMLHttpRequest的基本使用

image.png

image.png

image.png

image.png

image.png

image.png

image.png

image.png

image.png

image.png

image.png

image.png

image.png

3.2 数据交换格式

image.png

image.png

image.png

image.png

image.png

image.png

image.png

image.png

image.png

image.png

image.png

image.png

image.png

3.3 封装自己的Ajax函数

image.png

image.png

image.png

image.png

image.png

image.png

// 1.把 data 对象,转化成查询字符串的格式 提交给服务器
function resolveData(data) {
    var arr = []
    // 循环对象上的每一个属性 k
    for (let k in data) {
        // 每一个属性值加到arr数组中
        arr.push(k + '=' + data[k])
    }
    // arr里面的值用&拼接
    return arr.join('&')
}
// 参数传递是个对象
// var result = resolveData({uname:'zs',age:18})
// console.log(result)


// 2.封装自己的Ajax函数
// 函数的封装
// options是用户传递过来的对象
function itheima(options) {
    var xhr = new XMLHttpRequest
    // 把用户传递过来的参数对象 转换为 查询字符串
    var qs = resolveData(options.data)

    // 3.判断请求类型
    if (options.method.toUpperCase() === 'GET') {
        // 发起GET请求
        // 传递数据
        xhr.open(options.method, options.url + '?' + qs)
        xhr.send()
    } else if (options.method.toUpperCase() === 'POST') {
        // 发起POST请求
        xhr.open(options.method, options.url)
        xhr.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded')
        // 传递数据
        xhr.send(qs)

    }

// 3.监听请求状态改变的事件
    xhr.onreadystatechange = function () {
        if (xhr.readyState === 4 && xhr.status === 200) {
            var result = JSON.parse(xhr.responseText)
            options.success(result)
        }
    }
}

3.4 XMLHttpRequest Level2的新特性

image.png

image.png

image.png

image.png

image.png

image.png

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>

<body>
    <form id="form1">
        <!-- "/":绝对闭合 -->
        <!-- autocomplete="off":防止自动填充 -->
        <input type="text" name="uname" autocomplete="off" />
        <input type="password" name="upwd" />
        <button type="submit">提交</button>
    </form>
    <script>
        // 1.使用DOM获取表单
        var form = document.querySelector('#form1')
        // 绑定提交事件
        form.addEventListener('submit', function (e) {
            // 阻止默认提交行为
            e.preventDefault()

            // 2.创建一个formdata对象 获取表单数据
            var fd = new FormData(form)

            // 3.创建xhr对象
            var xhr = new XMLHttpRequest()
            xhr.open('POST', 'https://ajax-base-api-t.itheima.net/api/formdata')
            xhr.send(fd)

            xhr.onreadystatechange = function () {
                if (xhr.readyState === 4 && xhr.status === 200) {
                    console.log(JSON.parse(xhr.responseText))
                }
            }
        })
    </script>
</body>

</html>

image.png

image.png

image.png

image.png

image.png

image.png

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>

<body>
    <!-- 一、定义UI结构 -->
    <!-- 1.文件选择框 -->
    <input type="file" id="file1">
    <!-- 2.按钮 -->
    <button id="btnUplode">上传文件</button>
    <br>
    <!-- 3.上传到服务器的图片 -->
    <img src="" alt="" id="img" width="800">

    <script>
        // 二、验证是否选择了文件
        // 1.获取文件上传按钮
        var btn = document.querySelector('#btnUplode')
        // 2.给按钮绑定点击事件处理函数
        btn.addEventListener('click', function () {
            // 3.获取用户上传的文件列表
            var files = document.querySelector('#file1').files //file的属性files 返回个文件数组
            // 判断用户是否上传了文件
            if (files.length <= 0) {
                return alert('请上传文件')
            }
            // console.log('用户上传了文件')

            // 三、向FormData中追加文件
            // 4.将用户选择的文件 追加到FormData中 重点是fd数据
            var fd = new FormData()
            fd.append('adatar', files[0])

            // 四、使用xhr发起上传文件请求
            // 5.创建xhr对象,上传文件请求 把用户上传的文件上传到服务器
            var xhr = new XMLHttpRequest()
            xhr.open('POST','https://ajax-base-api-t.itheima.net/api/upload/avatar')
            xhr.send(fd)

            // 五、监听onreadystatechange事件
            // 6.服务器监听事件
            xhr.onreadystatechange = function(){
                if(xhr.readyState===4 && xhr.status===200){
                    // 服务器响应成功 
                    // 把服务器响应的数据转换成对象
                    var data = JSON.parse(xhr.responseText) 
                    // {message: '上传文件成功!', status: 200, url: '/uploads/1686797022566_71f70e0e575740d7a201cc9d60f71452.png'}
                    // console.log(data)
                    if(data.status===200){
                        // 服务器返回数据成功
                        // 填充img的src属性
                        document.querySelector('#img').src = 'https://ajax-base-api-t.itheima.net'+data.url

                    }else{
                        // 服务器返回数据失败 
                        console.log(data.message)
                    }
                }
            }
        })
    </script>
</body>

</html>

image.png

image.png

image.png

image.png

image.png

image.png

image.png

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <!-- 引入bootstrap -->
    <link rel="stylesheet" href="./lib/bootstrap.css">
    <!-- 导入jQuery -->
    <script src="./lib/jquery.js"></script>
</head>

<body>
    <!-- 一、定义UI结构 -->
    <!-- 1.文件选择框 -->
    <input type="file" id="file1">
    <!-- 2.按钮 -->
    <button id="btnUplode">上传文件</button>

    <!-- bootstrap的进度条样式 -->
    <div class="progress" style="margin: 10px; width: 500px;">
        <div class="progress-bar progress-bar-striped active" style="width: 0%" id="prevent">
            0%
        </div>
    </div>
    <br>
    <!-- 3.上传到服务器的图片 -->
    <img src="" alt="" id="img" width="800">

    <script>
        // 二、验证是否选择了文件
        // 1.获取文件上传按钮
        var btn = document.querySelector('#btnUplode')
        // 2.给按钮绑定点击事件处理函数
        btn.addEventListener('click', function () {
            // 3.获取用户上传的文件列表
            var files = document.querySelector('#file1').files //file的属性files 返回个文件数组
            // 判断用户是否上传了文件
            if (files.length <= 0) {
                return alert('请上传文件')
            }
            // console.log('用户上传了文件')

            // 三、向FormData中追加文件
            // 4.将用户选择的文件 追加到FormData中 重点是fd数据
            var fd = new FormData()
            fd.append('adatar', files[0])

            // 5.创建xhr对象,上传文件请求 把用户上传的文件上传到服务器
            var xhr = new XMLHttpRequest()
            // 6.查看文件上传进度
            xhr.upload.onprogress = function (e) {
                // 判断上传成功,再输出进度
                if (e.lengthComputable) {
                    var result = Math.ceil((e.loaded / e.total) * 100)
                    // console.log(result)
                    // 动态上传进度
                    $('#prevent').attr('style','width:'+result+'%').html(result+'%')
                }
            }
            // 7.监听文件上传完毕 修改进度条样式
            $('#prevent').removeClass().addClass('progress-bar progress-bar-success')

            // 四、使用xhr发起上传文件请求
            xhr.open('POST', 'https://ajax-base-api-t.itheima.net/api/upload/avatar')
            xhr.send(fd)

            // 五、监听onreadystatechange事件
            // 6.服务器监听事件
            xhr.onreadystatechange = function () {
                if (xhr.readyState === 4 && xhr.status === 200) {
                    // 服务器响应成功 
                    // 把服务器响应的数据转换成对象
                    var data = JSON.parse(xhr.responseText)
                    // {message: '上传文件成功!', status: 200, url: '/uploads/1686797022566_71f70e0e575740d7a201cc9d60f71452.png'}
                    // console.log(data)
                    if (data.status === 200) {
                        // 服务器返回数据成功
                        // 填充img的src属性
                        document.querySelector('#img').src = 'https://ajax-base-api-t.itheima.net' + data.url

                    } else {
                        // 服务器返回数据失败 
                        console.log(data.message)
                    }
                }
            }
        })
    </script>
</body>

</html>

3.5 jQuery高级用法

image.png

image.png

image.png

image.png

image.png

image.png

3.6 axios

image.png

image.png

image.png

image.png

image.png

image.png

image.png

四、跨域与JSONP

image.png

image.png

image.png

4.1 了解同源策略和跨域

image.png

image.png

image.png

image.png

image.png

image.png

4.2 JSONP

image.png

image.png

image.png

image.png

image.png

image.png

image.png

image.png

4.3 案例-淘宝搜索

image.png

image.png

image.png

image.png

image.png

image.png

image.png

image.png

image.png

image.png

image.png

image.png

image.png

image.png

<!DOCTYPE html>
<html lang="en">

<head>
  <meta charset="UTF-8" />
  <meta name="viewport" content="width=device-width, initial-scale=1.0" />
  <meta http-equiv="X-UA-Compatible" content="ie=edge" />
  <title>Document</title>
  <!-- 导入页面的基本样式 -->
  <link rel="stylesheet" href="./css/search.css" />
  <!-- 导入 jQuery -->
  <script src="./lib/jquery.js"></script>
  <!-- 导入模板引擎 -->
  <script src="./lib/template-web.js"></script>
</head>

<body>
  <div class="container">
    <!-- Logo -->
    <img src="./images/taobao_logo.png" alt="" class="logo" />

    <div class="box">
      <!-- tab 栏 -->
      <div class="tabs">
        <div class="tab-active">宝贝</div>
        <div>店铺</div>
      </div>
      <!-- 搜索区域(搜索框和搜索按钮) -->
      <div class="search-box">
        <input id="ipt" type="text" class="ipt" placeholder="请输入要搜索的内容" /><button class="btnSearch">
          搜索
        </button>
      </div>

      <!-- 搜索建议列表 -->
      <div id="suggest-list"></div>
    </div>
  </div>

  <!-- 模板结构 -->
  <script type="text/html" id="tpl-suggestList">
    <!-- 循环 搜索建议列表 的每一项 -->
    {{each result}}
  <!-- 搜索建议项 -->
  <!-- 每一项数据的第一个值 -->
  <div class="suggest-item">{{$value[0]}}</div>
  {{/each}}
  </script>

  <script>

    $(function () {
      // 二、输入框防抖

      // 2.1 定义延时器的id
      var timer = null

      // 三、搜索列表数据缓存
      // 3.1定义全局缓存对象
      var cacheObj = {}

      // 2.2 通过延时器实现防抖
      function debounceSearch(kw) {
        timer = setTimeout(function () {
          // 获取搜索列表
          getSuggestList(kw)
        }, 500)
      }


      // 1.给搜索框监听 keyup事件
      $('#ipt').on('keyup', function () {

        // 2.3 清空timer
        clearTimeout(timer)
        var keywords = $(this).val().trim()
        if (keywords.length <= 0) {
          // 搜索框为空时,搜索建议列表清空 并隐藏
          return $('#suggest-list').empty().hide()
        }

        // 3.4 先判断缓存中是否有数据
        if (cacheObj[keywords]) {
          // 把搜索列表渲染进去
          return renderSuggestList(cacheObj[keywords])
        }


        // 2.使用jquery发起jsonp请求 获取搜索建议列表
        // console.log(keywords)
        // getSuggestList(keywords)
        // 2.4 重新定时
        debounceSearch(keywords)
      })

      // 2.搜索建议列表 封装函数
      function getSuggestList(kw) {
        $.ajax({
          // q是用户输入的关键字
          url: 'https://suggest.taobao.com/sug?q=' + kw,
          dataType: 'jsonp',
          success: function (res) {
            // console.log(res);
            // 3.渲染模板引擎的UI结构
            renderSuggestList(res)
          }
        })
      }
      // 3.渲染模板引擎的UI结构
      function renderSuggestList(res) {
        if (res.result.length <= 0) {
          // 清空搜索建议列表 并隐藏
          $('#suggest-list').empty().hide()
        }
        // 否则获取模板结构的数据,渲染到搜索建议列表 并显示
        var htmlStr = template('tpl-suggestList', res)
        $('#suggest-list').html(htmlStr).show()

        // 3.2 获取用户输入的内容,当做键
        var k = $('#ipt').val().trim()
        // 3.3需要将数据作为值,进行缓存
        cacheObj[k] = res
      }
    })
  </script>
</body>

</html>

4.4 案例-防抖和节流

image.png

image.png

image.png

image.png

image.png

image.png

image.png

image.png

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <script src="./lib/jquery.js"></script>
    <style>
        html,
        body {
            margin: 0;
            padding: 0;
            /* 超出部分隐藏 */
            overflow: hidden;
        }

        #angle {
            position: absolute;

        }
    </style>
</head>

<body>
    <img src="./angel.gif" alt="" id="angle">

    <script>
        // 1.获取图片
        var angle = $('#angle')
        // 二、使用节流阀优化效果 节省资源
        // 2.1 定义节流阀
        var timer = null
        // 2.给页面绑定鼠标移动事件
        $(document).on('mousemove', function (e) {
            // 2.4 判断节流阀是否为空
            if (timer) {
                return
            }
            // 2.2 开启节流阀
            timer = setTimeout(function () {
                // 3.获取鼠标横纵坐标,设置给图片样式
                // console.log(e.pageX)
                // console.log(e.pageY)
                $(angle).css('top', e.pageY + 'px').css('left', e.pageX + 'px')
                console.log(123);
            }, 16)
            // 2.3 重置节流阀
            timer = null
        })
    </script>
</body>

</html>

image.png

五、HTTP协议

image.png

image.png

image.png

5.1 HTTP协议简介

image.png

image.png

image.png

image.png

image.png

image.png

image.png

image.png

image.png

5.2 HTTP请求消息

image.png

image.png

image.png

image.png

image.png

image.png

image.png

image.png

image.png

image.png

image.png

5.3 HTTP响应消息

image.png

image.png

image.png

image.png

image.png

image.png

image.png

image.png

image.png

5.4 HTTP请求方法

image.png

image.png

image.png

5.5 HTTP响应状态代码

image.png

image.png

状态码1不常用

image.png

image.png

image.png

image.png

image.png