任务24-ajax

问答

1. ajax 是什么?有什么作用?

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

  • 浏览器向服务器发送请求
  • 服务器根据浏览器传来数据生成response
  • 服务器把response返回给浏览器
  • 浏览器刷新整个页面显示最新数据

这个过程是同步的,顺序执行

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

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

2. 前后端开发联调需要注意哪些事情?后端接口完成前如何 mock 数据?(npm install -g server-mock)

前后端联调是一种 真实业务数据本地mock数据之间来回切换以达到前后端分离架构下的不同开发速度时数据交换的一种方式方法
** 需要注意的事情有:**

  • 约定前后端联调的时间。
  • 约定双方需要传输的数据和接口,在接口文档中确定好参数的名称、格式等。
  • 约定请求和响应的格式和内容。

什么是mock数据:就是html发送一个ajax的请求。这个请求到哪里去,然后后端如何去响应这个请求。后端去获取数据,并且定义接口;前端编写页面,并且和后端进行交互。
mock数据的方法有:

  • 使用server-mock或mock.js (http://mockjs.com/ )搭建模拟服务器,进行模拟测试(优点是不需要熟练掌握后台PHP语言,采用熟悉的js语法);
    步骤:
  1. 安装node.js,呼出cmd命令
  2. 选取一个文件夹,使用npm install -g server -mock进行全局安装
  3. 输入mock start可以启动一个web 服务器,他的根目录就是你选取的文件夹,启动完成之后,web服务器就可以展示了
  4. 浏览器输入localhost:8080就是你选取的文件夹
  5. 使用mock init会自动的在文件夹下生成3个文件
  6. 当html使用url对接口进行请求,会被router.js里相同的接口接受比如
app.get("/loadMore",function(req,res){
//接受名为loadMore的php的参数
res.send({status:0,//向html发出正确的回参
               msg:"hello 饥人谷"//回参中的值
              })
})
  • 使用XAMPP等工具,编写PHP文件来进行测试。

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

方法一:
使用button的disabled属性,配合setTimeout 0,使在数据到来之前按钮都不能被点击

el.addEventListener("click",function(){  
this.disabled=true; 
ajax(); 
setTimeout(this.disabled=false,0);
});

方法二:
可设置标记变量flag,初始时设置flag为true.在用户点击提交按钮后,判断flag是否为true,如果是则发送ajax请求,并把flag设置为false。 等服务端给出响应后再把flag设置为true;

 var ready = true;
    $('.add-more').on('click', function(){
        ...
        if(!ready){
            return;
        }
        ready = false;
        $.ajax({
            ...
            complete: function(){
                ready = true;
            }
        });
    });

代码题

1. 封装一个 ajax 函数,能通过如下方式调用

function ajax(opts){
    // todo ...
}
document.querySelector('#btn').addEventListener('click', function(){
    ajax({
        url: 'getData.php',   //接口地址
        type: 'get',               // 类型, post 或者 get,
        data: {
            username: 'xiaoming',
            password: 'abcd1234'
        },
        success: function(ret){
            console.log(ret);       // {status: 0}
        },
        error: function(){
           console.log('出错了')
        }
    })
});

  • 先写出未封装的普通的Ajax代码:
<!-- 需求是,在输入框输入用户名,点击按钮,打包请求后发给后台,后台响应对应的性别和年龄 -->
<input type="text" name="username" id="username" placeholder="请输入用户名">
<button id="btn">获取信息</button>
<dl id="ct">
<!-- 后台获取数据后浏览器进行操作,添加html -->  
</dl>
<script type="text/javascript">
    document.querySelector('#btn').addEventListener('click',function(){
        var xmlhttp = new XMLHttpRequest();
        var username = document.querySelector('#username').value;
        var url = 'ajax_simple.php'+'?username='+username;
        
        //GET方式
        // xmlhttp.open('GET',url,true);
        // xmlhttp.send();

        //POST方式:
        xmlhttp.open('POST','ajax_simple.php',true);
        xmlhttp.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
        xmlhttp.send("username="+username);

        xmlhttp.onreadystatechange = function(){
            if(xmlhttp.readyState==4 && xmlhttp.status==200){
                var userInfo = JSON.parse(xmlhttp.responseText);
                dealwith(userInfo);
            }
        }
    });
    function dealwith(userInfo){
        var str = '<dt>性别:</dt>';
        str += '<dd>'+userInfo.sex+'</dd>';
        str += '<dt>年龄:</dt>';
        str += '<dd>'+userInfo.age+'</dd>';
        document.querySelector('#ct').innerHTML = str;
    }
</script>

php代码:

<?php
    $username = $_POST['username'];
    //$username = $_GET['username'];
    if($username === 'kevin'){
        $ret = array('sex'=>'男','age'=>23);
    }elseif ($username === 'david') {
        $ret = array('sex'=>'男', 'age'=>30);
    }else{
        $ret = array('sex'=>'女','age'=>18);
    }
    echo json_encode($ret);
    ?>

在本地虚拟主机上运行如下:

  • 代码封装后:
function dealwith(userInfo){
        var str = '<dt>性别:</dt>';
        str += '<dd>'+userInfo.sex+'</dd>';
        str += '<dt>年龄:</dt>';
        str += '<dd>'+userInfo.age+'</dd>';
        document.querySelector('#ct').innerHTML = str;
    }
    function ajax(opts){
        var xmlhttp = new XMLHttpRequest();
        var dataStr = '';
        for( var key in opts.data){
            dataStr += key + '=' + opts.data[key]+'&'
        }
        dataStr = dataStr.substr(0,dataStr.length-1);

        if(opts.type.toLowerCase()==='post'){
            xmlhttp.open(opts.type,opts.url,true);
            xmlhttp.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
            xmlhttp.send(dataStr);
        }

        if(opts.type.toLowerCase() === 'get'){
            xmlhttp.open(opts.type,opts.url+'?'+dataStr,true);
            xmlhttp.send();
        }

        xmlhttp.onreadystatechange = function(){
            if(xmlhttp.readyState ==4 && xmlhttp.status == 200){
                var json = JSON.parse(xmlhttp.responseText);
                opts.success(json);
            }
            if(xmlhttp.readyState == 4 && xmlhttp.status == 404){
                opts.error();
            }
        };
    }

    document.querySelector('#btn').addEventListener('click',function(){
        ajax({
            url:'ajax_simple.php',
            type:'post',
            data:{
                username:document.querySelector('#username').value,
                password:document.querySelector('#password')
            },
            success:function(jsonData){
                dealwith(jsonData);
            },
      error:function(){
        console.log('出错了')
      }
        });
    });

2. 实现加载更多的功能

3. 实现注册表单验证功能

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

推荐阅读更多精彩内容

  • 1.ajax 是什么?有什么作用? AJAX = Asynchronous JavaScript and XML(...
    GarenWang阅读 393评论 0 1
  • 1. ajax 是什么?有什么作用? AJAX全称是 Asynchronous JavaScript and XM...
    小木子2016阅读 440评论 0 0
  • 问答 1.ajax 是什么?有什么作用? AJAX = Asynchronous JavaScript and X...
    鸿鹄飞天阅读 249评论 0 0
  • 1: ajax 是什么?有什么作用? ajax全称是Asynchrous JavaScript XML的缩写。 作...
    LINPENGISTHEONE阅读 183评论 0 0
  • ajax 是什么?有什么作用? ajax是Asynchronous JavaScript + XML的简写。是一项...
    coolheadedY阅读 196评论 0 0