jQuery笔记之 Ajax回调地狱

本次演示回调地狱:
模拟电影网站,判断用户是否为该网址的vip用户(最高权限为vip)
如果vpi就展示出vip电影,点击相应的电影显示出该电影的详细介绍
------------------------------------------------------------------
先来看一下成品图:
先搭建好HTML+CSS结构,代码如下:
 1     <style>
 2         *{
 3             padding: 0px;
 4             margin:0px;
 5         }
 6         .tpl{
 7             display: none;
 8         }
 9         .wrapper{
10             overflow: hidden;
11             border:2px solid black;
12             width:600px;
13             margin:100px auto 0px;
14         }
15         .movieSection{
16             float:left;
17             width:180px;
18             height:180px;
19             padding:10px;
20         }
21         .movieSection img{
22             width:100%;
23             height:150px;
24             cursor:pointer;
25         }
26         .movieSection h3{
27             height:30px;
28         }
29     </style>
30 </head>
31 <body>
32     <div class="wrapper">
33         <div class="tpl">
34             <img src="">
35             <h3 class="movieName"></h3>
36         </div>
37     </div>

 

第一次发送网络请求获取数据,验证是否为vip用户。
root是最高权限,表示为vip用户。
 
如果是vip用户,就返回出vip电影资源
我们现在已经获取到数据了,接下来我们把获取到的数据给可视化出来
发送网络请求获取数据,请求成功然后渲染页面
虽然现在我们已经成功获取了数据,但是我们还没有让服务器知道我们需要的是哪部电影,所以要给服务器发送被点击电影的ID,因为ID是只有一个的。
 
接下来我们再来做一个当点击后,展示出该电影的详情介绍
 
 
 
然后把获取到的数据可视化出来
最后附上完整代码:
 
<!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>
    <style>
        * {
            padding: 0px;
            margin: 0px;
        }

        .tpl {
            display: none;
        }

        .wrapper {
            overflow: hidden;
            border: 2px solid black;
            width: 600px;
            margin: 100px auto 0px;
        }

        .movieSection {
            float: left;
            width: 180px;
            height: 180px;
            padding: 10px;
        }

        .movieSection img {
            width: 100%;
            height: 150px;
            cursor: pointer;
        }

        .movieSection h3 {
            height: 30px;
        }
    </style>
</head>

<body>
    <div class="wrapper">
        <div class="tpl">
            <img></img>
            <h3 class="movieName"></h3>
        </div>
    </div>
    <script src="../jq/jquery-3.3.1/jquery-3.3.1.js"></script>
    <script>

        //模拟电影网站,判断用户是否为该网址的vip用户(最高权限为vip)
        //如果vpi就展示出vip电影,点击相应的电影显示出该电影的详细介绍


        //发送网络请求
        $.ajax({
            url: 'https://easy-mock.com/mock/5c09f40d3c098813c612cce6/movie/power', //向此服务器请求
            type: 'POST',   //获取数据类型
            data: {   //假设传入了账号密码,已经验证成功了。为了演示我们就不写input框来输入了
                username: 'ypx',
                password: '123'
            },
            success: function (res) {  //请求成功后执行的函数
                if (res.data.power == 'root') {  //判断该用户是否为最高vip,如果是就返回出vip电影资源
                    //vip 网络地址发送请求  
                    $.ajax({
                        url: 'https://easy-mock.com/mock/5c09f40d3c098813c612cce6/movie/movieList',
                        //正常开发中,数据不应该在这拿,
                        //应该在请求返回来的res中获取数据的,我们现在为了演示就在这里获取第二次数据了

                        type: 'GET',
                        success: function (res) {
                            var data = res.data; //声明一个变量为获取到的数据
                            var $Wrapper = $('.wrapper'); //获取wrapper准备存放数据
                            $.each(data, function (index, ele) { //循环所有数据里面的东西
                                //ele.name 数据里面的电影名称  ele.poster  数据里面的海报地址

                                var $MovieSection = $('.tpl').clone().removeClass('tpl').addClass('movieSection');
                                //把HTML结构的模板给克隆过来存放数据,再把模板的类名换成要放数据结构的类名

                                $MovieSection.data({ id: ele.id }).on('click', function () {//给获取数据加上id,添加点击事件
                                    $.ajax({
                                        url: 'https://easy-mock.com/mock/5c09f40d3c098813c612cce6/movie/movieInfo',
                                        type: 'GET',
                                        data: {
                                            movieId: $(this).data('id') //点击谁this就指向谁
                                        },
                                        success: function (res) {
                                            var data = res.data;
                                            var direct = data.direct;
                                            var gut = data.gut;
                                            var mainActor = data.mainActor;
                                            var screenWriter = data.screenwriter;

                                            var htmlStr = '<div class="mask">\
                                                  <p>导演: ' + direct + '</p>\
                                                  <p>剧情: ' + gut + '</p>\
                                                  <p>主演: ' + mainActor.reduce(function (prev, curv) {
                                                prev += curv + ' ';
                                                return prev;
                                            }, '') + '</p>\
                                                 <p>编剧: ' + screenWriter.reduce(function (prev, curv) {
                                                prev += curv + ' ';
                                                return prev;
                                            }, '') + '</p>\
                                              </div>'


                                            $(htmlStr)       //把数据结构加到body里面
                                                .appendTo('body');


                                        }
                                    });
                                })
                                    .children()  //获取克隆后的模板结构下面的所有子元素
                                    .eq(0)     //选中元素中的第一个
                                    .attr('src', ele.poster) //给属性加上数据中的海报
                                    .next() //给下一个兄弟元素
                                    .text(ele.name); //给文本加上数据中的电影名称
                                $Wrapper.append($MovieSection);//把MouseEvent填充到wrapper标签下面
                            });
                        }
                    })
                } else {
                    //不是vip


                }
            }
        });
    </script>
</body>
</html>

 

回调地狱不好的地方:可复用性不强。阅读性差也代表可维护性差。扩展性也差。解决方法请移步下一篇文章,jQuery笔记之工具方法—Ajax 优化回调地狱
回调地狱不好的地方:可复用性不强。阅读性差也代表可维护性差。扩展性也差。解决方法请移步下一篇文章,jQuery笔记之工具方法—Ajax 优化回调地狱
回调地狱不好的地方:可复用性不强。阅读性差也代表可维护性差。扩展性也差。解决方法请移步下一篇文章,jQuery笔记之工具方法—Ajax 优化回调地狱
 
posted @ 2019-06-01 01:11  杨培贤  阅读(760)  评论(0编辑  收藏  举报