AJAX

题目1: ajax 是什么?有什么作用?

Ajax是Asynchronous JavaScript and XML的缩写,这一技术能够向服务器请求额外的数据而无需卸载整个页面,会带来良好的用户体验。传统的HTTP请求流程大概是这样的,

  • 浏览器向服务器发送请求
  • 服务器根据浏览器传来数据生成response
  • 服务器把response返回给浏览器
  • 浏览器刷新整个页面显示最新数据
  • 这个过程是同步的,顺序执行

AJAX 在浏览器与 Web 服务器之间使用异步数据传输(HTTP 请求)从服务器获取数据

这里的异步是指脱离当前浏览器页面的请求、加载等单独执行,这意味着可以在不重新加载整个网页的情况下,通过JavaScript发送请求、接受服务器传来的数据,然后操作DOM将新数据对网页的某部分进行更新,使用Ajax最直观的感受是向服务器获取新数据不需要刷新页面等待了。

ajax的优点:

  1. 最大的一点是页面无刷新,用户的体验非常好。
  2. 使用异步方式与服务器通信,具有更加迅速的响应能力。。
  3. 可以把以前一些服务器负担的工作转嫁到客户端,利用客户端闲置的能力来处理,减轻服务器和带宽的负担,节约空间和宽带租用成本。并且减轻服务器的负担,ajax的原则是“按需取数据”,可以最大程度的减少冗余请求,和响应对服务器造成的负担。
  4. 基于标准化的并被广泛支持的技术,不需要下载插件或者小程序。
  5. ajax可使因特网应用程序更小、更快,更友好。

ajax的缺点:

  1. ajax不支持浏览器back按钮。
  2. 安全问题 AJAX暴露了与服务器交互的细节。
  3. 对搜索引擎的支持比较弱。
  4. 破坏了程序的异常机制。
  5. 不容易调试。

Ajax和XMLHttpRequest的关系:我们使用XMLHttpRequest对象来发送一个Ajax请求。

题目2:前后端开发联调需要注意哪些事情?后端接口完成前如何 mock 数据?

前后端在进行开发前,需要协作商定数据和接口的各项细节,后端负责提供数据,前端负责展示数据(根据数据负责页面的开发)。

  • 前后端开发联调注意事项
  1. URL:接口名称
  2. 发送请求的参数和格式(get/post)
  3. 数据响应的数据格式(数组/对象)
  4. 根据前后端约定,整理接口文档
  • 如何 mock 数据
  1. 搭建 web 服务器
  2. 根据接口文档仿造假数据
  3. 关联前后端文件,开启 web 服务器
  4. 验证前端页面功能及显示是否正确

题目3:点击按钮,使用 ajax 获取数据,如何在数据到来之前防止重复点击?

初始的时候上锁,请求开始的时候解锁,请求结束的时候继续上锁

//添加一个状态锁 初始为true,上锁为true,解锁为false
var lock=true
btn.addEventListener("click",function(){
//状态为false时,直接返回不继续执行函数
  if(!lock){
    return
  }
  let xhr=new XMLHttpRequest()
  xhr.onreadystatechange=function(){
    if(xhr.readyState===4)
    // readystate为4时 ,此次请求结束,上锁,因为这一步是异步的,先执行lock=false,待到readystate为4时,数据已经到来,此时就可以设置lock=true,继续请求数据了
        lock=true
    }
  }

  xhr.open("GET",url)
  xhr.send()
  //解锁,这时候请求开始
  lock=false
}
)

题目4:实现加载更多的功能,效果范例352,后端在本地使用server-mock来模拟数据

前端:
<!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>
        ul,li{
            margin: 0;
            padding: 0;
        }
        #ct li{
            list-style: none;
            border: 1px solid #ccc;
            padding: 10px;
            margin-top: 10px;
            cursor: pointer;
        }
        #load-more{
            display: block;
            margin: 10px auto;
            text-align: center;
            cursor: pointer;
        }
        #load-more img{
            width: 40px;
            height: 40px;
        }
        .btn{
            display: inline-block;
            height: 40px;
            line-height: 40px;
            width: 80px;
            border: 1px solid #e27272;
            border-radius: 3px;
            text-align: center;
            text-decoration: none;
            color: #e27272;
        }
        .btn:hover{
            background-color: red;;
            color: #fff;
        }
    </style>
</head>
<body>
    <ul id="ct">
    </ul>
    <a class="btn" id="load-more" href="#">加载更多</a>
    <script>
        var btn =  document.querySelector('#load-more')
        var ct = document.querySelector('#ct')

        var pageIndex= 0//当前要加载的数据的序号
        var len = 5// 每次加载多少个数据
        var isDataArrive = true//状态锁,用于判断是否在加载数据

        btn.addEventListener('click',function(e){
            e.preventDefault()
            // 防止点击多次
            if(!isDataArrive){return;}
            
            loadData(function(news){
                renderPage(news)

                pageIndex = pageIndex + 5
                isDataArrive = true
            })

            isDataArrive =false
        })

        function loadData(callback){
            ajax({
                type: 'get',
                url: '/loadMore',
                // md,果然是这里错了...
                data: {
                    index: pageIndex,
                    length: len
                },
                onSuccess: callback,
                onError: function(){
                    console.log('error')
                }
            })
        }

        function renderPage(news){
            var fragment = document.createDocumentFragment()
            for(var i=0;i<news.length;i++){
                var node = document.createElement('li')
                node.innerText = news[i]
                fragment.appendChild(node)
            }
            ct.appendChild(fragment)
        }

        function ajax(options){
            var xhr = new XMLHttpRequest()
            xhr.onreadystatechange = function(){
                if(xhr.readyState === 4){
                    if(xhr.status === 200 || xhr.status == 304){
                        var results = JSON.parse(xhr.responseText)
                        options.onSuccess(results)//这里把数据传给了renderPage
                    }else{
                        options.onError()
                    }
                }
            }
            var query = '?'
            for(key in options.data){
                query += key + '=' +options.data[key] + '&'
                // ? = ? + index=0
                // ? = ? + index=0 + &length=5
            }
            query = query.substr(0,query.length-1)
            xhr.open(options.type,options.url+query,true)
            xhr.send()
        }

        /* 
        1. GET
        2. /loadMore
        3.   {
            index: 3,
            length: 5
        }
        4. ['news1', 'news2'... 'news5']

        {
        status: '1',
        data: [],
        errorMsg: 'x'
        }
        */


        // var btn =  document.querySelector('#load-more')
        // var ct = document.querySelector('#ct')
        // var pageIndex = 0;
        // var lock = true;

        // btn.addEventListener('click',function(e){
        //     e.preventDefault()
        //     if(!lock){//当lock为true即是xhr发送完的时候才可以继续发送请求,没发送完就不能继续发送请求
        //         return;
        //     }
        //     var xhr = new XMLHttpRequest()
        //     xhr.onreadystatechange = function(){
        //         if(xhr.readyState === 4){
        //             if(xhr.status ===200 || xhr.status === 304){
        //                 var results = JSON.parse(xhr.responseText)
        //                 var fragment = document.createDocumentFragment()
        //                 for(var i=0;i<results.length;i++){
        //                     var node = document.createElement('li')
        //                     node.innerText = results[i]
        //                     fragment.appendChild(node)
        //                 }
        //                 ct.appendChild(fragment)
        //                 pageIndex = pageIndex + 5
        //             }else{
        //                 console.log('出错了')
        //             }
        //             lock = true
        //         }
        //     }
        //     xhr.open('get','/loadMore?index=' + pageIndex + '&length=5',true)
        //     xhr.send()
        //     lock = false
        // })
    </script>
</body>
</html>
服务端:

app.get('/loadMore', function(req, res) {

    var curIdx = req.query.index
    var len = req.query.length
    var data = []

    for(var i = 0; i < len; i++) {
        data.push('新闻' + (parseInt(curIdx) + i))
    }

    res.send(data);
});



最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 202,009评论 5 474
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 84,808评论 2 378
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 148,891评论 0 335
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,283评论 1 272
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,285评论 5 363
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,409评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,809评论 3 393
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,487评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,680评论 1 295
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,499评论 2 318
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,548评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,268评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,815评论 3 304
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,872评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,102评论 1 258
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,683评论 2 348
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,253评论 2 341

推荐阅读更多精彩内容

  • AJAX 原生js操作ajax 1.创建XMLHttpRequest对象 var xhr = new XMLHtt...
    碧玉含香阅读 3,166评论 0 7
  • 浏览器与服务器之间,采用HTTP协议通信。用户在浏览器地址栏键入一个网址,或者通过网页表单向服务器提交内容,这时浏...
    徐国军_plus阅读 359评论 0 4
  • 大家好,我是IT修真院深圳分院第3期的学员,一枚正直纯洁善良的前端程序员,今天给大家分享一下,修真院官网前端工程师...
    大大头大阅读 7,500评论 1 72
  • 本文先简要介绍前端开发中的浏览器同源政策;然后在跨域问题中,具体介绍跨域ajax请求的应用场景与实现方案。 什么是...
    AlienZHOU阅读 9,324评论 4 19
  • 仰望星空 寻找 那一颗属于自己的星星 北斗 像巨人的大手 托起了天空 长夜 让漂泊的星光 在梦中游走 璀璨的银河 ...
    桂花上酸菜阅读 225评论 5 10