昨日内容回顾

  1. 事件流:
  2. 1.事件捕获 从最外层到最内层
  3. 2.事件目标阶段
  4. 3.事件冒泡 从最内层到最外层
  5. 每个事件都会事件对象 event
  6. 属性和方法
  7. 属性: event.target 目标节点(冒泡机制)
  8. event.currentTarget == this
  9. event.data
  10. 方法: 阻止默认事件 event.preventDefault()
  11. 阻止冒泡事件 event.stopPropagation()
  12. return false;即阻止了默认事件又阻止了冒泡
  13. 位置信息:
  14. width()
  15. height()
  16. offset().top 相对与文档
  17. offset().left
  18. position().top
  19. position().left 相对与被定位的父辈元素
  20. innerWidth() 不包含border
  21. outerWidth() 包含border 默认是false 如果是true 包含margin
  22. scrollLeft() 页面被卷走的水平方向的宽度
  23. scrollTop() 页面被卷走的垂直的高度
  24. one(事件类型,fn) 一次性事件
  25. 事件委托(重点)
  26. 1.为多个元素绑定相同的事件,为了提高页面性能
  27. 2.为未来创建的元素添加事件
  28. $('div').on(事件类型,选择器字符,fn)

jQuery 的 ajax

什么是 ajax

AJAX = 异步的 javascript 和 XML(Asynchronous Javascript and XML)

简言之,在不重载整个网页的情况下,AJAX 通过后台加载数据,并在网页上进行显示。

通过 jQuery AJAX 方法,您能够使用 HTTP Get 和 HTTP Post 从远程服务器上请求文本、HTML、XML 或 JSON - 同时您能够把这些外部数据直接载入网页的被选元素中。

jQuery 的 load()方法

jQuery load()方法是简单但强大的 AJAX 方法。

load()方法从服务器加载数据,并把返回的数据放入被选元素中。

ps:该方法使用不多,了解即可

语法:

  1. $("selector").load(url,data,callback);

第一种情况

  1. $('#btn').click(function(){
  2. //只传一个url,表示在id为#new-projects的元素里加载index.html
  3. $('#new-projects').load('./index.html');
  4. })

第二种情况

  1. $('#btn').click(function(){
  2. //只传一个url,导入的index.html文件含有多个传递参数,类似于:index/html?name='张三'
  3. $('#new-projects').load('./index.html',{"name":'张三',"age":12});
  4. })

第三种情况

  1. //加载文件之后,会有个回调函数,表示加载成功的函数
  2. $('#new-projects').load('./index.html',{"name":'张三',"age":12},function(){
  3. });

jquery 的 getJSON 方法

jQuery 的 AJAX 中使用 getJSON()方法异步加载 JSON 格式数据。获取服务器中的数据,并对数据进行解析,显示到页面中

语法:

  1. $.getJSON(url,[data],[callback])

参数解释:

url 参数:为请求加载 json 格式文件的服务器地址 可选项 data 参数:为请求时发送的数据 callback 参数:为数据请求成功后执行的函数 javascript $.getJSON("./data/getJSON.json", function (data) { var str = "";//初始化保存内容变量 $.each(data, function(index,ele) { $('ul').append("<li>"+ele.name+"</li>") }); }) ## jquery 的$.get()方法 $.get() 方法通过 HTTP GET 请求从服务器上请求数据 语法: javascript $.get(URL,callback); url 参数:规定你请求的路径,是必需参数 callback 参数:为数据请求成功后执行的函数 javascript $.get('./data/getJSON.json',function(data,status){ console.log(status); //success 200状态码 ok的意思 }) ## jquery 的 post()方法 与 get()方法相比,post()方法多用于以 POST 方式向服务器发送数据,服务器接收到数据之后,进行处理,并将处理结果返回页面 语法: javascript $.post(URL,data,callback); url 参数:规定你请求的路径,是必需参数,可选的 data 参数是连同请求发送的数据 可选的 callback 参数:为数据请求成功后执行的函数 javascript $.post('/index',{name:'张三'},function(data,status){ console.log(status); }) ## jquery 的$.ajax()方法(重要) query 的$.ajax()方法 是做 ajax 技术经常使用的一个方法。 它的参数很多,总会有一些初学者记不住,在这里,演示几个经常使用的参数。后面讲 django 课程部分会详细讲 ajax 技术的原理。大家先把每个参数做个笔记。 参数如下: 1.url: 要求为 String 类型的参数,(默认为当前页地址)发送请求的地址。 2.type: 要求为 String 类型的参数,请求方式(post 或 get)默认为 get。注意其他 http 请求方法,例如 put 和 delete 也可以使用,但仅部分浏览器支持。 3.timeout: 要求为 Number 类型的参数,设置请求超时时间(毫秒)。此设置将覆盖$.ajaxSetup()方法的全局设置。 4.async: 要求为 Boolean 类型的参数,默认设置为 true,所有请求均为异步请求。如果需要发送同步请求,请将此选项设置为 false。注意,同步请求将锁住浏览器,用户其他操作必须等待请求完成才可以执行。 5.cache: 要求为 Boolean 类型的参数,默认为 true(当 dataType 为 script 时,默认为 false),设置为 false 将不会从浏览器缓存中加载请求信息。 6.data: 要求为 Object 或 String 类型的参数,发送到服务器的数据。如果已经不是字符串,将自动转换为字符串格式。get 请求中将附加在 url 后。防止这种自动转换,可以查看 processData 选项。对象必须为 key/value 格式,例如{foo1:”bar1”,foo2:”bar2”}转换为&foo1=bar1&foo2=bar2。如果是数组,JQuery 将自动为不同值对应同一个名称。例如{foo:[“bar1”,”bar2”]}转换为&foo=bar1&foo=bar2。 7.dataType: 要求为 String 类型的参数,预期服务器返回的数据类型。如果不指定,JQuery 将自动根据 http 包 mime 信息返回 responseXML 或 responseText,并作为回调函数参数传递。可用的类型如下: xml:返回 XML 文档,可用 JQuery 处理。 html:返回纯文本 HTML 信息;包含的 script 标签会在插入 DOM 时执行。 script:返回纯文本 JavaScript 代码。不会自动缓存结果。除非设置了 cache 参数。注意在远程请求时(不在同一个域下),所有 post 请求都将转为 get 请求。 json:返回 JSON 数据。 jsonp:JSONP 格式。使用 SONP 形式调用函数时,例如 myurl?callback=?,JQuery 将自动替换后一个“?”为正确的函数名,以执行回调函数。 text:返回纯文本字符串。

8.beforeSend: 要求为 Function 类型的参数,发送请求前可以修改 XMLHttpRequest 对象的函数,例如添加自定义 HTTP 头。在 beforeSend 中如果返回 false 可以取消本次 ajax 请求。XMLHttpRequest 对象是惟一的参数。function(XMLHttpRequest){ this; //调用本次 ajax 请求时传递的 options 参数 }

9.complete:要求为 Function 类型的参数,请求完成后调用的回调函数(请求成功或失败时均调用)。参数:XMLHttpRequest 对象和一个描述成功请求类型的字符串。function(XMLHttpRequest, textStatus){ this; //调用本次 ajax 请求时传递的 options 参数 }

10.success:

要求为 Function 类型的参数,请求成功后调用的回调函数,有两个参数。

(1)由服务器返回,并根据 dataType 参数进行处理后的数据。

(2)描述状态的字符串。function(data, textStatus){ //data 可能是 xmlDoc、jsonObj、html、text 等等

11.error: 要求为 Function 类型的参数,请求失败时被调用的函数。该函数有 3 个参数,即 XMLHttpRequest 对象、错误信息、捕获的错误对象(可选)。ajax 事件函数如下:function(XMLHttpRequest, textStatus, errorThrown){ //通常情况下 textStatus 和 errorThrown 只有其中一个包含信息 this; //调用本次 ajax 请求时传递的 options 参数 }

12.contentType: 要求为 String 类型的参数,当发送信息至服务器时,内容编码类型默认为”application/x-www-form-urlencoded”。该默认值适合大多数应用场合。

13.dataFilter: 要求为 Function 类型的参数,给 Ajax 返回的原始数据进行预处理的函数。提供 data 和 type 两个参数。data 是 Ajax 返回的原始数据,type 是调用 jQuery.ajax 时提供的 dataType 参数。函数返回的值将由 jQuery 进一步处理。function(data, type){ //返回处理后的数据 return data; }

14.dataFilter: 要求为 Function 类型的参数,给 Ajax 返回的原始数据进行预处理的函数。提供 data 和 type 两个参数。data 是 Ajax 返回的原始数据,type 是调用 jQuery.ajax 时提供的 dataType 参数。函数返回的值将由 jQuery 进一步处理。function(data, type){ //返回处理后的数据 return data; }

15.global: 要求为 Boolean 类型的参数,默认为 true。表示是否触发全局 ajax 事件。设置为 false 将不会触发全局 ajax 事件,ajaxStart 或 ajaxStop 可用于控制各种 ajax 事件。

16.ifModified: 要求为 Boolean 类型的参数,默认为 false。仅在服务器数据改变时获取新数据。服务器数据改变判断的依据是 Last-Modified 头信息。默认值是 false,即忽略头信息。

17.jsonp: 要求为 String 类型的参数,在一个 jsonp 请求中重写回调函数的名字。该值用来替代在”callback=?”这种 GET 或 POST 请求中 URL 参数里的”callback”部分,例如{jsonp:’onJsonPLoad’}会导致将”onJsonPLoad=?”传给服务器。

18.username: 要求为 String 类型的参数,用于响应 HTTP 访问认证请求的用户名。

19.password: 要求为 String 类型的参数,用于响应 HTTP 访问认证请求的密码。

20.processData: 要求为 Boolean 类型的参数,默认为 true。默认情况下,发送的数据将被转换为对象(从技术角度来讲并非字符串)以配合默认内容类型”application/x-www-form-urlencoded”。如果要发送 DOM 树信息或者其他不希望转换的信息,请设置为 false。

21.scriptCharset: 要求为 String 类型的参数,只有当请求时 dataType 为”jsonp”或者”script”,并且 type 是 GET 时才会用于强制修改字符集(charset)。通常在本地和远程的内容编码不同时使用

get 方式

  1. //get()方式
  2. $.ajax({
  3. url:'./data/index.txt',
  4. type:'get',
  5. dataType:'text',
  6. success:function(data){
  7. $('p').html(data);
  8. },
  9. error:function(error){
  10. console.log(error)
  11. }

登录和风天气官网

https://www.heweather.com

注册免费账户,登录控制台,就有一个 key

  1. ![](https://cdn.nlark.com/yuque/0/2020/png/1484428/1599789614327-ff0d86ee-e4af-4d05-a8c1-6c8ed1e35d09.png)

点击上面的文档,点击 3-10 天

  1. ![](https://cdn.nlark.com/yuque/0/2020/png/1484428/1599789614411-adb90fbf-e5b1-45c3-8e01-8ac8e771fe84.png)

这个是请求 url

  1. ![](https://cdn.nlark.com/yuque/0/2020/png/1484428/1599789614531-8b399807-8726-404f-913c-de28423a8f16.png)

选择第二种

  1. ![](https://cdn.nlark.com/yuque/0/2020/png/1484428/1599789614476-a32e1e57-a2ee-49d3-a74f-615bcb19b60f.png)

比如查询北京的天气,新建一个空白网页,在地址栏输入以下地址,最后面是你的 key

https://free-api.heweather.com/s6/weather/now?location=beijing&key=你的key

网页效果如下:

  1. ![](https://cdn.nlark.com/yuque/0/2020/png/1484428/1599789614333-acf3576b-18c8-4ab5-ab85-0d2240dd6a48.png)

复制 json 信息,使用 json 格式化工具,查看 json 数据

百度搜索 json 在线格式化

  1. ![](https://cdn.nlark.com/yuque/0/2020/png/1484428/1599789614440-7b378516-dd73-481e-9a2b-39352e86e6e7.png)

查看接口说明

  1. ![](https://cdn.nlark.com/yuque/0/2020/png/1484428/1599789614398-47afcc21-0ced-48c7-ae81-78ed630712c9.png)

主要看这个

  1. ![](https://cdn.nlark.com/yuque/0/2020/png/1484428/1599789614449-2772a124-4df8-4b11-b547-49c554eec985.png)

cond_code 是对应的图标编码

查看天气状况和图标,100 对应的就是晴天。下载完整的图片文件,里面的 100.png 就是晴天的图标

  1. ![](https://cdn.nlark.com/yuque/0/2020/png/1484428/1599789614511-f6c0d3fe-c0ab-4504-bf32-ff923f847475.png)

百度首页,登录之后,获取天气,也是通过 api 获取来展示的

  1. ![](https://cdn.nlark.com/yuque/0/2020/png/1484428/1599789614476-935c16bd-dbd4-42ab-b2ab-ee3f2db87a56.png)

举例:

  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <title>Title</title>
  6. </head>
  7. <body>
  8. <button>获取天气</button>
  9. <script type="text/javascript" src="js/jquery-3.3.1.min.js"></script>
  10. <script type="text/javascript">
  11. $.ajax({
  12. url:'https://free-api.heweather.com/s6/weather/forecast',
  13. data: {
  14. location: 'beijing',
  15. key: '你的key',
  16. },
  17. type:'get',
  18. success:function (data) {
  19. console.log(data);
  20. }
  21. })
  22. </script>
  23. </body>
  24. </html>

查看 console

    ![](https://cdn.nlark.com/yuque/0/2020/png/1484428/1599789614394-c6d2e1a6-be6e-44dc-a241-f229dfa30d7a.png)      

更改代码

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<button>获取天气</button>
<script type="text/javascript" src="js/jquery-3.3.1.min.js"></script>
<script type="text/javascript">
    $.ajax({
        url:'https://free-api.heweather.com/s6/weather/now',
        data: {
            location: 'beijing',
            key: '你的key',
        },
        type:'get',
        success:function (data) {
            // console.log(data);
            var cond = data.HeWeather6[0].now.cond_txt;  //实况天气状况代码
            console.log(cond);
            var cond_code_src = `./cond_icon_heweather/${data.HeWeather6[0].now.cond_code}.png`;  //天气状况代码图标
            console.log(cond_code_src)
            $('body').append(`<p>${cond}</p>`);  //追加文字
            $('body').append(`<img src="${cond_code_src}">`); //追加天气图片
        }
    })
</script>
</body>
</html>

访问网页,点击获取天气,效果如下:

    ![](https://cdn.nlark.com/yuque/0/2020/png/1484428/1599789614403-19b3f060-7db3-40b0-a239-d6e0f596a868.png)      

天气每隔一个小时,会变化一次。所以页面需要刷新数据,刷新有 2 种:

全局刷新:整个网页刷新,有多少资源,比如图片,视频,等等,全部重新加载一遍。

局部刷新:举个某个 div 刷新,不影响全局。

一般推荐使用局部刷新,全局刷新,太耗资源了,完全没必要。

全局刷新

//间隔1小时
setInterval(function () {
    window.reload(); //全局刷新
},1000*60*60)

局部刷新,注意,此代码等待 1 小时才能执行。将 10006060 改成 1000,表示每秒执行。

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<button>获取天气</button>
<p></p>
<img src="" alt="">
<script type="text/javascript" src="js/jquery-3.3.1.min.js"></script>
<script type="text/javascript">
    function init(){
        $.ajax({
            url:'https://free-api.heweather.com/s6/weather/now',
            data: {
                location: 'beijing',
                key: '你的key',
            },
            type:'get',
            success:function (data) {
                // console.log(data);
                var cond = data.HeWeather6[0].now.cond_txt;  //实况天气状况代码
                console.log(cond);
                var cond_code_src = `./cond_icon_heweather/${data.HeWeather6[0].now.cond_code}.png`;  //天气状况代码图标
                console.log(cond_code_src)
                $('body p').text(cond);  //修改文字
                $('body img').attr('src',cond_code_src);  //修改天气图片
            }
        })
    }
    //间隔1小时,进行局部刷新
    setInterval(init,1000*60*60);


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

post 方式(重点)

//post()方式
$.ajax({
   url:'/index',
   type:'post',
   data:{name:'张三',age:12},
   success:function(data){
      $('p').html(data);
   },
   error:function(error){
      console.log(error)
}

ps:

注意:以上所有操作,请在服务器上运行此代码,如果没有服务器,可以在本地搭建本地服务器。

举例:

新建文件 flask_demo.py,它是用来做服务端的,内容如下:

#! /usr/bin/env python
# -*- coding: utf-8 -*-
# Date: 2018/6/5


import json


from flask import Flask
from flask import request
from flask import Response




app = Flask(__name__)  # 创建Flask的实例


# 路由
@app.route("/")  # 创建Flask的实例
# 函数
def index():
    print('aaa')
    return "首页"




@app.route("/course")
def courses():


    return "course"




@app.route("/create", methods=["post", ])  # 设置请求方式为post
def create():
    print(request.get_data())


    with open("user.json", "r", encoding="utf-8") as f:  #打开json文件,必须为utf-8,否则乱码
        data = f.read()


    response = Response(json.dumps(data))  #反序列化


    response.headers["Access-Control-Allow-Origin"] = "*"  # 解决跨域问题,这里表示允许所有请求


    return response  # 响应请求




if __name__ == '__main__':
    app.run(host="localhost", port=8889, )  # 监听本机的8889端口

新建文件 user.json,它是服务端存放的用户数据,内容如下:

{"username":"高圆圆","password":"123"}

新建文件 demo.html,它是用来做表单提交的,内容如下:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<div>
    <label>用户名:</label><input type="text" name="username"/>
    <label>密码:</label><input type="password" name="password"/>
    <input type="button" name="submit" value="提交">
</div>
<script type="text/javascript" src="js/jquery-3.3.1.min.js"></script>
<script type="text/javascript">
    $(function () {
        $('input[type=button]').click(function(){
            var user = $('input[name=username]').val();  //获取输入的用户名
            var pwd = $('input[name=password]').val();  //获取输入的密码
            $.ajax({
                url:'http://localhost:9999/create',  //服务器请求地址
                data: {
                    username: user,
                    password: pwd,
                },
                type:'post',  //请求方式为post
                dataType:'json',  //数据类型为json
                success:function (data) {
                    console.log(data); //打印服务器响应信息
                }
            })
        })
    })


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

访问网页,输入数据,点击提交,效果如下:

    ![](https://cdn.nlark.com/yuque/0/2020/png/1484428/1599789614503-7cd923dc-7d33-44ef-b5e5-0923a1a107aa.png)      

今日作业

百度左上角的,查询 3 天天气。

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <style>
        * {
            padding: 0;
            /*margin: 0;*/
        }


        a {
            text-decoration: none;
        }


        ul {
            list-style: none;
        }


        button {
            float: left;
        }


        .everyday-item {
            float: left;
            overflow: hidden;
        }


        .everyday-item ul li {
            float: left;
        }


        p {
            text-align: center;
            white-space: nowrap;
            overflow: hidden;
            text-overflow: ellipsis;
            color: #666;
            font-size: 12px;
        }


        .everyday-title {
            height: 34px;
            line-height: 34px;
            width: 100%;
        }


        .everyday-icon {
            width: 48px;
            height: 48px;
            border: none;
            margin-left: 30px;
        }
    </style>
</head>
<body>
<button>获取天气</button>
<br/><br/>
<div class="everyday-item">
    <ul>
        <!--<li>-->
        <!--<a href="#">-->
        <!--<p class="everyday-title">今天(周二)</p>-->
        <!--<img class="everyday-icon" src="cond_icon_heweather/100.png">-->
        <!--<p>34℃</p>-->
        <!--<p>多云</p>-->
        <!--<p>西南风3-4级</p>-->
        <!--</a>-->
        <!--</li>-->
    </ul>


</div>
<script type="text/javascript" src="../ajax/js/jquery-3.3.1.min.js"></script>
<script type="text/javascript">
    var mydate = new Date();  //当前日期
    var myddy = mydate.getDay();//获取存储当前日期
    // console.log(myddy);
    // var weekday = ["星期日", "星期一", "星期二", "星期三", "星期四", "星期五", "星期六"];
    var weekday = ["周日", "周一", "周二", "周三", "周四", "周五", "周六"];
    // document.write("今天是:" + weekday[myddy]);
    // var day1 = new Date();
    tomorrow = myddy + 1;  //明天
    acquired = myddy + 2;  //后天
    // alert(weekday[mingtian]);
    three_days = [`今天(${weekday[myddy]})`,`明天(${weekday[tomorrow]})`,`后天(${weekday[acquired]})`];
    // for (var i = 0; i < three_days.length; i++) {
    //     console.log(three_days[i]);
    // }
    $(function () {
        //获取天气方法
        function get_weather(){
            $.ajax({
                url: 'https://free-api.heweather.com/s6/weather/forecast',
                data: {
                    location: 'beijing',
                    key: '你的key',
                },
                type: 'get',
                success: function (data) {
                    // console.log(data);
                    var many_days = data.HeWeather6[0].daily_forecast;
                    // console.log(many_days);
                    for (var i = 0; i < many_days.length; i++) {
                        // console.log(111);
                        console.log(many_days[i]);
                        var date = many_days[i]['date'];
                        var icon = many_days[i]['cond_code_d'];
                        var tmp = many_days[i]['tmp_max'];
                        var cond_txt = many_days[i]['cond_txt_d'];
                        var wind_dir = many_days[i]['wind_dir'];
                        var wind_sc = many_days[i]['wind_sc'];
                        // console.log(date, icon, tmp, cond_txt, wind_dir);


                        var cond_code_src = `./cond_icon_heweather/${icon}.png`;  //天气状况代码图标
                        // console.log(cond_code_src)
                        $('.everyday-item ul').append(
                            `<li>
                        <a href="#">
                            <p class="everyday-title">${three_days[i]}</p>
                            <img class="everyday-icon" src="${cond_code_src}">
                            <p>${tmp}℃</p>
                            <p>${cond_txt}</p>
                            <p>${wind_dir}${wind_sc}级</p>
                        </a>
                    </li>`);
                    }
                }
            })
        }
        //绑定点击事件
        $('button').eq(0).click(function () {
            //执行获取天气方法
            get_weather();
        })
    })


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

访问网页,点击获取天气,效果如下:

    ![](https://cdn.nlark.com/yuque/0/2020/png/1484428/1599789614431-f487b7c0-e7e6-49d7-90b2-e2b2a547adb5.png)