11.26 JS基础9

  • 再谈Ajax

什么是ajax?

1.服务端接口提供一个请求地址,暴露出来给我们的客户端访问。

2.在客户端使用ajax技术来发送请求给服务器

注意:不是所有的接口都可以通过ajax直接调用的,有些接口有特定方法,例如baiduAI(人脸识别等)的java代码来调用。

 

服务端接口可以是别人写好的,放在网络上公开出来的,如:

https://gitee.com/safflower_club/free_api_interface

也可以自己写的。如果有掌握后端接口的编码的技术: node,java,PHP,等等。

 

练习:在控制台上获取新闻信息

<script>
    //1创建一个对象
    let xhr = new XMLHttpRequest();

    //2.设置要连接的服务器url 方法
    //从服务器接口拿数据,"GET"
    //https://api.apiopen.top/getTencentNews
    xhr.open("GET", "https://api.apiopen.top/getTencentNews", true);

    //发送请求
    xhr.send();

    xhr.onreadystatechange = function () {

        if (xhr.readyState == 4 && xhr.status == 200) {

            let response = JSON.parse(xhr.responseText);

            console.log(response.data);
            //遍历response.data
            let array = response.data;
            for (let i = 0; i < array.length; i++) {

                console.log(array[i].title);
                console.log(array[i].intro);
                console.log("**********************");

            }
        }
    }
</script>

解析:将图片数据显示在网页上,注意美观。 https://api.apiopen.top/getImages

<body>
<div id="pic"></div>
<script>
    let xhr = new XMLHttpRequest();
    xhr.open("GET", "https://api.apiopen.top/getImages", true);
    xhr.send();
    xhr.onreadystatechange = function () {
        if (xhr.readyState == 4 && xhr.status == 200) {
            let response = xhr.responseText;
            let data = JSON.parse(response);
            console.log(data.result);
            let arr = data.result;
            for (let i = 0; i < arr.length; i++) {//值得注意的是可以在后面做字符串拼接图片的标签内容
                document.getElementById("pic").innerHTML += "<img alt='查无此图' width:'300px' height='500px' src=" + arr[i].img + ">";
                console.log(arr[i].img);
            }
        }
    }
</script>
</body>

注意:要想将获取的图片显示在页面上,而不只是显示网址或者单张图片,要将图片的标签<img src="">同循环遍历出的图片网址做字符串拼接

 

什么是JSON?

  • JSON 指的是 JavaScript 对象表示法(JavaScript Object Notation)
  • JSON 是轻量级的文本数据交换格式
  • JSON 独立于语言,JSON使用JavaScript语法来描述数据对象,但是JSON仍然独立于语言和平台。JSON 解析器和JSON库支持许多不同的编程语言。
  • JSON 具有自我描述性,更易理解。

 

JSON的语法规则

  • JSON 语法是 JavaScript 对象表示法语法的子集。
  • 数据在名称/值对中(键值对中{key:value})
  • 数据由逗号分隔

  • 大括号保存对象 如:{
        "code": 200,
        "message": "success",
        "result": [{
            "name": "Lisa",
            "age": 18
        }, {
            "name": "John",
            "age": 19
        }, {
            "name": "Tom",
            "age": 20
        }]
    }

  • 中括号保存数组 如:[{"name":"Lisa","age":18},{"name":"John","age":19},{"name":"Tom","age":20}]

关于JSON格式是否正确,可在 https://www.bejson.com/ 验证。

 

JSON的值

JSON 值可以是:

  • 数字(整数或浮点数)
  • 字符串(在双引号中)
  • 逻辑值(true 或 false)
  • 数组(在中括号中)
  • 对象(在大括号中)
  • null

 

JSON文件

  • JSON文件类型是"json"
  • JSON 文本的 MIME 类型是 "application/json"

 

将JSON文本转换为JavaScript对象

JSON最常见的用法之一,是从web服务器上读取JSON数据(作为文件或作为 HttpRequest),将JSON数据转换为JavaScript对象,然后在网页中使用该数据。

转换的方法:

可以使用eval也可以使用 JSON.parse 将字符串文本转化为JS对象。

我们也可以将JSON数据放在本机的一个JSON文件中,通过ajax来请求访问。

但是我们有时也会发现json文件中文乱码了,这时我们需要打开json文件,找右下角,调整编码格式为utf-8。

样例:

<script>
    //1创建一个对象
    let xhr = new XMLHttpRequest();

    //2.设置要连接的服务器url 方法
    //从服务器接口拿数据,"GET"

    //直接请求文件
    xhr.open("GET", "star.json", true);

    //发送请求
    xhr.send();

    xhr.onreadystatechange = function () {

        if (xhr.readyState == 4 && xhr.status == 200) {

            let response = JSON.parse(xhr.responseText);

            console.log(response.results);
            //遍历response.data
            let array = response.results;
            for (let i = 0; i < array.length; i++) {

                console.log(array[i].name);
                console.log(array[i].img);
                console.log("**********************");

            }
        }
    }
</script>

如何改变服务器端口,从而让人访问到我们的JSON文件?

在该选项打钩(意味着容许接受外部连接),然后把内置服务器端口改为四位数,如下图。

从而达到这种效果。

 

  • jQuery中的ajax

定义和用法

ajax() 方法通过 HTTP 请求加载远程数据。

该方法是 jQuery 底层 AJAX 实现。简单易用的高层实现见 $.get, $.post 等。$.ajax() 返回其创建的 XMLHttpRequest 对象。大多数情况下你无需直接操作该函数,除非你需要操作不常用的选项,以获得更多的灵活性。

最简单的情况下,$.ajax() 可以不带任何参数直接使用

注意:所有的选项都可以通过 $.ajaxSetup() 函数来全局设置。

语法

jQuery.ajax([settings])

参数

描述

settings

可选。用于配置 Ajax 请求的键值对集合

可以通过 $.ajaxSetup() 设置任何选项的默认值。

 

参数名 类型 用法及注意事项
url String 默认值: 当前页地址。发送请求的地址。
type String 默认值: "GET")。请求方式 ("POST" 或 "GET"), 默认为 "GET"。注意:其它 HTTP 请求方法,如 PUT 和 DELETE 也可以使用,但仅部分浏览器支持。
async Boolean

默认值: true。默认设置下,所有请求均为异步请求。如果需要发送同步请求,请将此选项设置为 false。

注意,同步请求将锁住浏览器,用户其它操作必须等待请求完成才可以执行

dataType String

预期服务器返回的数据类型。如果不指定,jQuery 将自动根据 HTTP 包 MIME 信息来智能判断,比如 XML MIME 类型就被识别为 XML。在 1.4 中,JSON 就会生成一个 JavaScript 对象,而 script 则会执行这个脚本。随后服务器端返回的数据会根据这个值解析后,传递给回调函数。可用值:

  • "xml": 返回 XML 文档,可用 jQuery 处理。
  • "html": 返回纯文本 HTML 信息;包含的 script 标签会在插入 dom 时执行。
  • "script": 返回纯文本 JavaScript 代码。不会自动缓存结果。除非设置了 "cache" 参数。注意:在远程请求时(不在同一个域下),所有 POST 请求都将转为 GET 请求。(因为将使用 DOM 的 script标签来加载)
  • "json": 返回 JSON 数据
  • "jsonp": JSONP 格式。使用 JSONP 形式调用函数时,如 "myurl?callback=?" jQuery 将自动替换 ? 为正确的函数名,以执行回调函数。
  • "text": 返回纯文本字符串
success Function

请求成功后的回调函数。

参数:由服务器返回,并根据 dataType 参数进行处理后的数据;描述状态的字符串。

这是一个 Ajax 事件。

参考代码

<head lang="en">
    <meta charset="UTF-8">
    <title></title>
    <!--1 百度cdn在线的jquery-->
    <script src="http://libs.baidu.com/jquery/2.0.0/jquery.js"></script>
</head>
<body>

<button onclick="funajax()">ajax</button>
<!--jquery,别人封装好的js,如果要使用外部js-->
<script>
    function funajax() {
        $.ajax({
            //Ajax 请求的键值对集合
            url: "https://api.apiopen.top/getTencentNews",
            type: "GET",
            async: true,
            dataType: "json",
            success: function (res) {
                //res 从服务器返回的数据
                console.log(res);

                let array = res.data;
                for (let i = 0; i < array.length; i++) {

                    console.log(array[i].title);
                    console.log(array[i].intro);
                    console.log("**********************");

                }
            }

        });

    }
</script>
</body>

从外部引入第三方的在线js文件。

 

练习

模拟豆瓣,解析json文件。

{
  "code": 200,
  "msg": "请求成功",
  "data": {
    "total": 250,
    "limit": 25,
    "page": 0,
    "subject": [
      {
        "id": "1292052",
        "img": "https://img2.doubanio.com/view/photo/s_ratio_poster/public/p480747492.jpg",
        "name": "肖申克的救赎",
        "director": "弗兰克·德拉邦特 Frank Darabont   ",
        "star": "9.7",
        "quote": "希望让人自由。"
      },
      {
        "id": "1291546",
        "img": "https://img3.doubanio.com/view/photo/s_ratio_poster/public/p2561716440.jpg",
        "name": "霸王别姬",
        "director": "陈凯歌 Kaige Chen   ",
        "star": "9.6",
        "quote": "风华绝代。"
      },
      {
        "id": "1292720",
        "img": "https://img2.doubanio.com/view/photo/s_ratio_poster/public/p2372307693.jpg",
        "name": "阿甘正传",
        "director": "罗伯特·泽米吉斯 Robert Zemeckis   ",
        "star": "9.5",
        "quote": "一部美国近现代史。"
      },
      {
        "id": "1295644",
        "img": "https://img3.doubanio.com/view/photo/s_ratio_poster/public/p511118051.jpg",
        "name": "这个杀手不太冷",
        "director": "吕克·贝松 Luc Besson   ",
        "star": "9.4",
        "quote": "怪蜀黍和小萝莉不得不说的故事。"
      },
      {
        "id": "1292722",
        "img": "https://img9.doubanio.com/view/photo/s_ratio_poster/public/p457760035.jpg",
        "name": "泰坦尼克号",
        "director": "詹姆斯·卡梅隆 James Cameron   ",
        "star": "9.4",
        "quote": "失去的才是永恒的。"
      },
      {
        "id": "1292063",
        "img": "https://img2.doubanio.com/view/photo/s_ratio_poster/public/p2578474613.jpg",
        "name": "美丽人生",
        "director": "罗伯托·贝尼尼 Roberto Benigni   ",
        "star": "9.5",
        "quote": "最美的谎言。"
      },
      {
        "id": "1291561",
        "img": "https://img1.doubanio.com/view/photo/s_ratio_poster/public/p2557573348.jpg",
        "name": "千与千寻",
        "director": "宫崎骏 Hayao Miyazaki   ",
        "star": "9.4",
        "quote": "最好的宫崎骏,最好的久石让。"
      },
      {
        "id": "1295124",
        "img": "https://img2.doubanio.com/view/photo/s_ratio_poster/public/p492406163.jpg",
        "name": "辛德勒的名单",
        "director": "史蒂文·斯皮尔伯格 Steven Spielberg   ",
        "star": "9.5",
        "quote": "拯救一个人,就是拯救整个世界。"
      },
      {
        "id": "3541415",
        "img": "https://img2.doubanio.com/view/photo/s_ratio_poster/public/p2616355133.jpg",
        "name": "盗梦空间",
        "director": "克里斯托弗·诺兰 Christopher Nolan   ",
        "star": "9.3",
        "quote": "诺兰给了我们一场无法盗取的梦。"
      },
      {
        "id": "3011091",
        "img": "https://img1.doubanio.com/view/photo/s_ratio_poster/public/p524964039.jpg",
        "name": "忠犬八公的故事",
        "director": "莱塞·霍尔斯道姆 Lasse Hallström   ",
        "star": "9.4",
        "quote": "永远都不能忘记你所爱的人。"
      },
      {
        "id": "1292001",
        "img": "https://img9.doubanio.com/view/photo/s_ratio_poster/public/p2574551676.jpg",
        "name": "海上钢琴师",
        "director": "朱塞佩·托纳多雷 Giuseppe Tornatore   ",
        "star": "9.3",
        "quote": "每个人都要走一条自己坚定了的路,就算是粉身碎骨。"
      },
      {
        "id": "1889243",
        "img": "https://img1.doubanio.com/view/photo/s_ratio_poster/public/p2614988097.jpg",
        "name": "星际穿越",
        "director": "克里斯托弗·诺兰 Christopher Nolan   ",
        "star": "9.3",
        "quote": "爱是一种力量,让我们超越时空感知它的存在。"
      },
      {
        "id": "1292064",
        "img": "https://img2.doubanio.com/view/photo/s_ratio_poster/public/p479682972.jpg",
        "name": "楚门的世界",
        "director": "彼得·威尔 Peter Weir   ",
        "star": "9.3",
        "quote": "如果再也不能见到你,祝你早安,午安,晚安。"
      },
      {
        "id": "3793023",
        "img": "https://img3.doubanio.com/view/photo/s_ratio_poster/public/p579729551.jpg",
        "name": "三傻大闹宝莱坞",
        "director": "拉库马·希拉尼 Rajkumar Hirani   ",
        "star": "9.2",
        "quote": "英俊版憨豆,高情商版谢耳朵。"
      },
      {
        "id": "2131459",
        "img": "https://img3.doubanio.com/view/photo/s_ratio_poster/public/p1461851991.jpg",
        "name": "机器人总动员",
        "director": "安德鲁·斯坦顿 Andrew Stanton   ",
        "star": "9.3",
        "quote": "小瓦力,大人生。"
      },
      {
        "id": "1291549",
        "img": "https://img3.doubanio.com/view/photo/s_ratio_poster/public/p1910824951.jpg",
        "name": "放牛班的春天",
        "director": "克里斯托夫·巴拉蒂 Christophe Barratier   ",
        "star": "9.3",
        "quote": "天籁一般的童声,是最接近上帝的存在。"
      },
      {
        "id": "1292213",
        "img": "https://img9.doubanio.com/view/photo/s_ratio_poster/public/p2455050536.jpg",
        "name": "大话西游之大圣娶亲",
        "director": "刘镇伟 Jeffrey Lau   ",
        "star": "9.2",
        "quote": "一生所爱。"
      },
      {
        "id": "5912992",
        "img": "https://img9.doubanio.com/view/photo/s_ratio_poster/public/p1363250216.jpg",
        "name": "熔炉",
        "director": "黄东赫 Dong-hyuk Hwang   ",
        "star": "9.3",
        "quote": "我们一路奋战不是为了改变世界,而是为了不让世界改变我们。"
      },
      {
        "id": "25662329",
        "img": "https://img1.doubanio.com/view/photo/s_ratio_poster/public/p2614500649.jpg",
        "name": "疯狂动物城",
        "director": "拜伦·霍华德 Byron Howard / 瑞奇·摩尔 Rich Moore   ",
        "star": "9.2",
        "quote": "迪士尼给我们营造的乌托邦就是这样,永远善良勇敢,永远出乎意料。"
      },
      {
        "id": "1307914",
        "img": "https://img2.doubanio.com/view/photo/s_ratio_poster/public/p2564556863.jpg",
        "name": "无间道",
        "director": "刘伟强 / 麦兆辉   ",
        "star": "9.2",
        "quote": "香港电影史上永不过时的杰作。"
      },
      {
        "id": "1291841",
        "img": "https://img9.doubanio.com/view/photo/s_ratio_poster/public/p616779645.jpg",
        "name": "教父",
        "director": "弗朗西斯·福特·科波拉 Francis Ford Coppola   ",
        "star": "9.3",
        "quote": "千万不要记恨你的对手,这样会让你失去理智。"
      },
      {
        "id": "1291560",
        "img": "https://img9.doubanio.com/view/photo/s_ratio_poster/public/p2540924496.jpg",
        "name": "龙猫",
        "director": "宫崎骏 Hayao Miyazaki   ",
        "star": "9.2",
        "quote": "人人心中都有个龙猫,童年就永远不会消失。"
      },
      {
        "id": "1849031",
        "img": "https://img9.doubanio.com/view/photo/s_ratio_poster/public/p2614359276.jpg",
        "name": "当幸福来敲门",
        "director": "加布里尔·穆奇诺 Gabriele Muccino   ",
        "star": "9.1",
        "quote": "平民励志片。"
      },
      {
        "id": "3319755",
        "img": "https://img1.doubanio.com/view/photo/s_ratio_poster/public/p501177648.jpg",
        "name": "怦然心动",
        "director": "罗伯·莱纳 Rob Reiner   ",
        "star": "9.1",
        "quote": "真正的幸福是来自内心深处。"
      },
      {
        "id": "6786002",
        "img": "https://img9.doubanio.com/view/photo/s_ratio_poster/public/p1454261925.jpg",
        "name": "触不可及",
        "director": "奥利维·那卡什 Olivier Nakache / 艾力克·托兰达 Eric Toledano   ",
        "star": "9.2",
        "quote": "满满温情的高雅喜剧。"
      }
    ]
  }
}

期间遇到问题。。图片无法成功显示,网页报403错误,数据拒绝我们的访问,解决方法如下。

<head lang="en">
    <meta charset="UTF-8" name="referrer" content="never">
    <!--由此可绕过防盗链,但有一个问题: history.back..可能会有问题-->
    <title></title>
    <style>
        .divmovie {
            width: 300px;
            height: 500px;
            float: left;
            margin-left: 30px;
            margin-top: 10px;
            text-align: center;
            font-family: kaiti;
            font-size: 12px;
            font-weight: bolder;
            background-color: lightblue;
        }

        img {
            width: 270px;
            height: 400px;
            border: 1px dotted gray;
            margin: 5px 0px 0px 0px;
        }

        .name {
            font-size: 16px;
            color: blue;
            margin-top: 0px;
            margin-bottom: 0px;
        }
    </style>
    <!--1 百度cdn在线的jquery-->
    <script src="http://libs.baidu.com/jquery/2.0.0/jquery.js"></script>
</head>
<body>
<button onclick="funajax()">查看电影详情</button>
<div id="movie">

</div>
<script>
    function funajax() {
        document.getElementById("movie").innerHTML = "";
        $.ajax({
            //Ajax 请求的键值对集合
            //url: "https://api.apiopen.top/getTencentNews",
            url: "top250.json",
            type: "GET",
            async: true,
            dataType: "json",
            success: function (res) {

                console.log(res);
                let array = res.data.subject;
                for (let i = 0; i < array.length; i++) {
                    console.log(array[i].img);
                    console.log(array[i].name);
                    console.log(array[i].director);
                    console.log(array[i].star);
                    console.log(array[i].quote);
                    console.log("**********************");

                    $("#movie").append("<div class='divmovie'>" +
                            "<img src='" + array[i].img + "'>" + "<br/><br/><div class='name'>" + array[i].name + "</div><br/>" + array[i].director + "<br/>" + array[i].quote + "</div>");
                }
            }
        });
    }
</script>
</body>

老师之前发的相关参考代码(不完整的)

<head lang="en">
    <meta charset="UTF-8">
    <title></title>

    <style>
        .divmovie{width:260px; height:400px; float:left; border: 1px solid blue;margin-left: 30px;margin-top: 20px}
    </style>
    <!--1 百度cdn在线的jquery-->
    <script src="http://libs.baidu.com/jquery/2.0.0/jquery.js"></script>
</head>
<body>

<button onclick="funajax()">ajax</button>
<!--jquery,别人封装好的js,如果要使用外部js-->

<div id="movie">

</div>
<script>
    function funajax(){
    $.ajax({
        //Ajax 请求的键值对集合
        //url: "https://api.apiopen.top/getTencentNews",
        url:"top250.json",
        type: "GET",
        async: true,
        dataType: "json",
        success: function(res){
            //res 从服务器返回的数据
            console.log(res);

            let array = res.data.subject;
            for(let i=0;i<array.length; i++){

                console.log(array[i].name);
                console.log(array[i].star);
                console.log(array[i].img);
                console.log("**********************");

                $("#movie").append("<div class='divmovie'><h4>"+array[i].name+"</h4><p><img src='"+array[i].img+"'></p></div>")

            }
        }

    });

    }


</script>
</body>
$("#movie").append("<div class='divmovie'><h4>"+array[i].name+"</h4><p><img src='"+array[i].img+"'></p></div>")

感想:不得不说,今天学的难度又比昨天高了。。不过大部分还是懂的,就是像上面那种的jQuery ajax里字符串拼接还不够熟练,需要多练习。

(Ps:下课看下基金,又是大概率跑赢大盘的一天,不错)

18:18:54 2021-11-26

posted on 2021-11-26 18:18  heyiyang1312  阅读(9)  评论(0)    收藏  举报

导航