美文网首页吃饭用的前端
Ajax响应数据格式

Ajax响应数据格式

作者: CNLISIYIII | 来源:发表于2019-05-21 20:24 被阅读0次

(一)同步和异步

xhr.open()方法第三个参数要求传入的是一个 布尔值,其作用就是设置此次请求是否采用异步方式执行,默认为 true异步,修改为false为同步。

异步代码举栗:

console.log('before ajax')
var xhr = new XMLHttpRequest()
// 默认第三个参数为 true 意味着采用异步方式执行
xhr.open('GET', '/time', true)
xhr.send(null)
xhr.onreadystatechange = function () {
  if (this.readyState === 4) {
    // 这里的代码最后执行
    console.log('request done')
  }
}
console.log('after ajax')
//输出结果:
//before ajax
//after ajax
//request done

如果采用同步方式执行,则代码会卡死在 xhr.send() 这一步:
同步代码举栗:

console.log('before ajax')
var xhr = new XMLHttpRequest()
// 同步方式
xhr.open('GET', '/time', false)
// // 同步方式 执行需要 先注册事件再调用 send,否则 readystatechange 无法触发
   xhr.onreadystatechange = function () {
     if (this.readyState === 4) {
       // 会按代码执行顺序执行这行代码
       console.log('request done')
     }
   }
xhr.send(null)
// 因为 send 方法执行完成 响应已经下载完成
console.log(xhr.responseText)
console.log('after ajax')
//输出结果:
//before ajax
//request done
//1558437144572
//after ajax

(二)XMLHttpRequest API

1.属性

  • readyState xhr的状态 4 响应体(服务器返回的数据)接收完毕
  • status 获取状态码
  • responseText 获取响应体,文本格式
  • responseXML 获取响应体,xml格式
  • onreadystatechange 事件,当xhr.readyState属性发生改变触发
  • onload 事件,响应接收完毕

2.方法

  • open(method, url, async) 设置请求的方式,请求的路径, 同步/异步
  • send(requsetBody) 发送请求(体)
  • setRequestHeader(key, value) 设置请求头
  • getResponseHeader(key) 获取响应头

(三)响应数据格式

1.JSON

JSON的本质是字符串。

  • JSON 中属性名称必须用双引号包裹
  • JSON 中表述字符串(值)必须使用双引号
  • JSON 中不能有单行或多行注释
  • JSON 没有 undefined 这个值
  • 一个完整的JSON,不能有其他内容掺杂
    数据类型:null,number,boolean,string,object,array

2.数据转换

JSON转JS:JS = JSON.parse(JSON)
JS转JSON:JSON = JSON.stringify(JS);

代码举栗:

    // JS数据和JSON数据相互转换
        // 先定义一些JS数据
        var js_b = true;
        var js_o = {name: 'zs', age: 20, sex: 'M'};
        var js_a = ['red', 'green', 'blue'];

        console.log(js_b);
        console.log(js_o);
        console.log(js_a);

        // 1. JS数据转换成JSON格式
        var json_b = JSON.stringify(js_b);
        var json_o = JSON.stringify(js_o);
        var json_a = JSON.stringify(js_a);

        console.log(json_b);
        console.log(json_o);
        console.log(json_a);

        // 2. 把JSON数据转换成JS数据
        console.log(JSON.parse(json_b));
        console.log(JSON.parse(json_o));
        console.log(JSON.parse(json_a));

(四)模版引擎

数据结构简单的时候可以使用模版引擎。实际上就是一个API。

使用步骤:

  • 准备一个存放数据的盒子(不是必须的,使用body也可以)
  • 引入template-web.js文件
  • 定义模板(具体语法可以去官网查看),一定要指定script的id和type属性
  • 调用template函数,为模板分配数据,template函数有两个参数一个返回值
    1)参数1:模板的id
    2)参数2:分配的数据,必须是一个JS对象的形式
    3)一个返回值:是数据和模板标签组合好的结果
  • 将 “拼接” 好的结果放到准备好的盒子中(不是必须的,console出来也可以看结果)

定义模板时的script标签一定好指定idtype
tempalte函数语法:var html = template(模板id, Object);

代码举栗:

    <!-- 1. 定义一个模板,要指定script的id和type属性 -->
    <script id="moban" type="text/html">
        <h1>{{title}}</h1>
        <ul>
            <li>
                <p>{{chenghu}}</p>
                <p>{{liuyan}}</p>
            </li>
        </ul>
    </script>
    

    <script src="./assets/template-web.js"></script>

    <script>
        // 调用template函数
        // 两个参数,一个返回值
        // 参数1:模板的id
        // 参数2:要显示的数据,必须是JS对象的形式
        // 返回值:数据和模板拼接好的结果
        var html = template('moban', {
            title: '留言板123',
            chenghu: '张三',
            liuyan: 'hahahahahaha哈哈哈'
        });
        console.log(html);
        document.body.innerHTML = html;
    </script>

留言板案例

html代码:

<body>
    <div class="area">
        <img src="img/tip.png">
        <input type="text" id="userName" placeholder="输入用户名...">
        <span id="msg"> </span>
        <textarea maxlength="200" placeholder="说点儿什么叭。。。"></textarea>
        <p>
            <span>字数:</span>
            <span id="words">0</span>/
            <span>200</span>
            <button class="sub">发布</button>
        </p>
    </div>
    <ul>
        <!-- 
    <li>
         <div class='topDiv'>
             <img src="" alt="">
             <span>用户名</span>
             <p>时间</p>
         </div>
         <div class='bottomDiv'>内容</div>
     </li>
     -->
    </ul>
    <div class="top">⬆️<br>回到顶部</div>
    <script src="lib/jquery-1.12.4.js"></script>
    <script src="js/index.js"></script>
    <script id="model" type="text/html">
        <li>
            <div class='topDiv'>
                <img src="img/03.png">
                <span>{{name}}</span>
                <p>发布于:{{time}}</p>
            </div>
            <div class='bottomDiv'>{{content}}</div>
        </li>
    </script>
    <script src='js/template-web.js'></script>
</body>

index.js代码:

var userText = document.querySelector('textarea');
var name;
var content;
var isOk = 0;
userText.oninput = function () {
    $('#words').text(this.value.length);
    content = userText.value;
}
document.getElementById('userName').onblur = function () {
    var xhr = new XMLHttpRequest();
    name = this.value;
    xhr.open('POST', '/checkUser');
    xhr.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
    xhr.send('username=' + name);
    xhr.onload = function () {
        var result = this.responseText;
        // console.log(result);
        if (result === 'true') {
            document.getElementById('msg').innerText = '啊呀这个名字被用过啦!';
            $('#msg').css('color', 'red');
            isOk = 0;
        }
        else if (result === 'false') {
            document.getElementById('msg').innerText = 'congratulations! 这个名字可以用!';
            $('#msg').css('color', 'green');
            isOk = 1;
        }
        if (name === '') {
            document.getElementById('msg').innerText = '让我知道我喜欢的你叫什么名字好嘛~';
            $('#msg').css('color', 'gold');
        }

    }
}
function resetAll() {
    document.getElementById('userName').value = '';
    userText.value = '';
    $('#words').text('0');
    document.getElementById('msg').innerText = ' ';
    name = '';
    content = '';
}
// var oldLi = $('ul').children[0];
// var newLi = $('ul').children('li');
$('.sub').click(function () {
    var xhrClick = new XMLHttpRequest();
    var lisHtml = template('model', {
        name: name,
        time: new Date().toLocaleString(),
        content: content,
    });
    if (name == '' || content == '') {
        resetAll();
        alert('难道你就这么不愿意留言说爱我吗!');
    }
    else {
        if (isOk) {
            xhrClick.open('POST', '/addMsg');
            xhrClick.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
            xhrClick.send('name' + name + '&content' + content);
            xhrClick.onreadystatechange = function () {
                if (this.readyState === 4) {
                    if (this.responseText) {
                        $('ul').append(lisHtml);
                        // $('ul').insertBefore(newLi,oldLi);
                    }
                }
            }
        }
        else {
            alert('换个名字试试叭!');
        }
    }
    resetAll();
})
var liTop = $('ul').offset().top;
console.log(liTop);
$(window).scroll(function() {
    if($(window).scrollTop() >= liTop) {
        $('.top').css('display','block');
    }
    else {
        $('.top').css('display','none');
    }
})
$('.top').click(function() {
    $('html,body').animate({scrollTop:0},'linear');
})

相关文章

  • ajax中的xml和json

    ajax中的xml 1.请求的数据格式-XML 2.响应的数据格式-XML ajax中的json 一、json 1...

  • AJAX

    传统使用AJAX的方式 jQuery使用Ajax的方式 Ajax响应的数据格式 将list集合数据转换成xml数据...

  • H5-12.29Ajax与jquery、xml、json

    四、Ajax的XML 1.请求的数据格式-XML 2.响应的数据格式-XML 五、json JSON - java...

  • Ajax响应数据格式

    (一)同步和异步 xhr.open()方法第三个参数要求传入的是一个 布尔值,其作用就是设置此次请求是否采用异步方...

  • 原生JS写AJAX

    AJAX MDN_AJAX 手写AJAX的主要四个步骤:1.创建XMLHttpReauest2.处理响应(指定响应...

  • ajax与jsonp、jsonp

    轮播图 json 数据格式 ajax与jsonp ajax是获取数据的 get请求 post请求 url:"js/...

  • zepto.min.js的ajax使用小案例

    1、接口数据格式 2、zepto.min.js ajax请求 (1)引入zepto.min.js (2)ajax请...

  • jQuery+Ajax

    Ajax Ajax-HTTP请求 XMLHttpRequest发送请求 XMLHttpRequest取得响应 JS...

  • 2017.10.31

    ajax原理 ajax的核心 GET 情况下 创建ajax链接 打开链接 发送请求 接收响应 ajax状态码: 0...

  • JavaScript笔记(2):JavaScript的基本知识

    AJAX AJAX的全称是Asynchronous JavaScript and XML,就是异步响应网络的请求,...

网友评论

    本文标题:Ajax响应数据格式

    本文链接:https://www.haomeiwen.com/subject/rhfszqtx.html