Ajax笔记

85 阅读7分钟

什么是Ajax?

  • AJAX(Asynchronous Javascript And XML)翻译成中文就是“异步Javascript和XML”。即使用Javascript语言与服务器进行异步交互,传输的数据为XML(当然,传输的数据不只是XML)。

  • AJAX还有一个最大的特点就是,当服务器响应时,不用刷新整个浏览器页面,而是可以局部刷新。这一特点给用户的感受是在不知不觉中完成请求和响应过程。
  • 传输的数据可以是text纯文本,但是更常用的是xml,现在我们最经常使用就是json

ajax的特点

优点

  • 可以无需刷新页面与服务器端进行通信
  • 允许你根据用户时间来更新部分页面内容

缺点

  • 没有浏览历史,不能回退
  • 存在跨域问题
  • SEO(搜索引擎优化)不太友好

二. jquary中的ajax

$.get()//从服务器获取数据

$.post()//给服务器提交数据

$.ajax()//即可获取也可提交

2.1 $.get()函数语法

$.get(url,[data],[callback])

参数名参数类型说明
urlstring要请求的资源地址
dataobject要求资源期间要携带的参数
callbackfunction请求成功时的回调函数

2.2 $.post()函数语法

$.post(url,[data],[callback])

2.3 $.ajax()函数语法

$.ajax({
   type: '',//请求的方式,GET或 POST
   url: '',//请求的url地址
   data: {},//请求要求带的数据
   success: function (res) { }//请求成功后的回调函数
     })
     ```
# 三、接口

# 四、form表单与模板引擎

## 4.1 form标签的属性

| 属性      | 值                                                                | 描述                                                  |
| ------- | ---------------------------------------------------------------- | --------------------------------------------------- |
| action  | URL                                                              | 规定当提交表单时向何处发送表单数据。(当提交表单后,页面会立即跳转到action属性指定的url地址) |
| method  | get(默认) post                                                     | 规定用于发送表单数据的 HTTP 方法。                                |
| enctype | application/x-www-form-urlencoded multipart/form-data text/plain | 规定在向服务器发送表单数据之前如何对其进行编码。(适用于 method="post" 的情况)     |
| target  | _blank _self(默认) _parent _top framename                          | 规定在何处打开 action URL                                  |

### target属性

-   _blank:在新窗口打开
-   _self(默认):在同一窗口中打开
-   _parent:在父框架集打开
-   _top:在整个窗口中打开
-   framename:在指定的框架中打开

### method属性

-   get(默认):地址栏会显示数据
-   post:地址栏不会显示数据,适合大量的,复杂的,或是文件上传的数据

### enctype

-   application/x-www-form-urlencoded(默认):表示在发送数据之前编码所有的字符
-   multipart/form-data:不对字符编码,在使用包含**文件上传**控件的表单时,必须使用该值
-   text/plain:空格转换为“+”,但不对特殊字符编码

## 4.2 表单的同步提交

**使用表单同步提交会有两个缺点:**

1.  页面会发生跳转
1.  页面之前的状态和数据会丢失

**解决方案:表单只负责采集数据,ajax负责将数据提交到服务器**

$('#f1').on('submit', function () { alert('监听到了表单的提交事件') })

## 4.3 阻止表单的默认提交行为

当监听到表单的提交事件以后,可以调用事件对象event.preventDefault()函数,来阻止表单的提交和页面的跳转:
e.preventDefault()

$('#f1').on('submit', function (e) { e.preventDefault() })


## 4.4 快速获取表单中的数据

**`serialize()函数`**

可以一次性获取到表单中所有的数据
<form action="/login" id="f1">
    <input type="text" name="user_name">
    <input type="password" name="password">
    <button type="submit">提交</button>
</form>
<script>
    $(function () {
        $('#f1').on('submit', function (e) {
            e.preventDefault();
            $(this).serialize()//注意表单一定要有name属性,且不能重名
        //调用的结果:user_name=123&password=123
        })
    })
</script>

## 4.5 模板引擎

![image.png](https://p1-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/a116584ce66f40fe89a74921bf1329b6~tplv-k3u1fbpfcp-watermark.image?)

模板引擎,顾名思义,它可以根据程序员指定的模板结构和数据,自动生成一个完整的HTML页面。

![image.png](https://p9-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/7bd1628370d14ce5a05c336be4648dbd~tplv-k3u1fbpfcp-watermark.image?)
**优点:**

-   减少了字符串的拼接操作
-   使代码结构更清晰
-   使代码更易于阅读与维护

![image.png](https://p9-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/9c9ea621ef0e4e7a878e8e69a62b9240~tplv-k3u1fbpfcp-watermark.image?)

<!-- 1.导入模板变量 -->
<script src="template-web.js"></script>
<!-- 在window全局,多一个函数,叫 template('模板的ID','需要渲染的数据对象') -->
<div id="container"></div>
<!-- 3.定义模板 -->
<!-- 模板的html结构,要定义到script中 -->
<script type="text/html" id="tpl-user">
    <p>{{name}}  {{age}}</p>
</script>
<script>
    //2.定义需要渲染的数据
    var data = { name: '张三', age: 20 }
    //4.调用 template('模板的ID','需要渲染的数据对象')函数
    var str = template('tpl-user', data)
    // 5.渲染 html 结构
    $('#container').html(str)
</script>
``` `{{}}`可以表示输出,要有返回值 `{{@ value}}`表示原文输出

{{if 判断条件}} 需输出的内容 {{/if}}
{{if 判断条件1}} 需输出的内容{{else if 判断条件2}} 需输出的内容 {{/if}}

循环:

//当前循环的索引使用 $index 进行访问,当前的循环项使用 $value 进行访问。
 
{{each arr}}
   {{$index}}  {{$value}}//$value是each循环获取的数组arr里的值
 {{/each}}

过滤器:

{{value |filterName}}将 value这个值传给后面的 filterName函数,最终输出函数返回的新值
定义过滤器的基本语法:

template.defaults.imports.filterName=function(value){
return;
}

exec()函数用于检索字符串中的正则表达式的匹配
如果字符串中有匹配的值,则返回该匹配值,否则返回null

ajax加强

1. XMLHttpRequest的基本使用

XMLHttpRequest(简称 xhr)是浏览器提供的 Javascript 对象,通过它,可以请求服务器上的数据资源。之前所学的 jQuery 中的 Ajax 函数,就是基于 xhr 对象封装出来的。

1.1 使用xhr发起get请求

步骤:

  • 创建 xhr 对象
  • 调用 xhr.open() 函数:指定 请求方式 与 URL地址
  • 调用 xhr.send() 函数:发起 Ajax 请求
  • 监听 xhr.onreadystatechange 事件
    <script>
        // 创建 xhr 对象
        var xhr = new XMLHttpRequest()
        // 调用 xhr.open() 函数:创建请求 指定 请求方式, URL地址 和 查询字符串
        xhr.open('GET', 'http://www.liulongbin.top:3006/api/getbooks?id=1')
        // 调用 xhr.send() 函数:发起 Ajax 请求
        xhr.send()
        // 监听 xhr.onreadystatechange 事件
        xhr.onreadystatechange = function () {
            // 4.1 监听 xhr 对象的请求状态 readyState ;与服务器响应的状态 status
            if (xhr.readyState === 4 && xhr.status === 200) {
                // 4.2 打印服务器响应回来的数据
                console.log(xhr.responseText)
            }
        }
        
    </script>

1.2 了解xhr对象的readyState属性

用来表示当前 Ajax 请求所处的状态。每个 Ajax 请求必然处于以下状态中的一个:

状态描述
0UNSENTXMLHttpRequest 对象已被创建,但尚未调用 open方法。
1OPENEDopen() 方法已经被调用。
2HEADERS_RECEIVEDsend() 方法已经被调用,响应头也已经被接收。
3LOADING数据接收中,此时 response 属性中已经包含部分数据。
4DONEAjax 请求完成,这意味着数据传输已经彻底完成或失败。

1.3 url编码与解码

  • URL 地址中,只允许出现英文相关的字母、标点符号、数字,因此,在 URL 地址中不允许出现中文字符。
  • 如果 URL 中需要包含中文这样的字符,则必须对中文字符进行编码(转义)。
  • URL编码的原则:使用安全的字符(没有特殊用途或者特殊意义的可打印字符)去表示那些不安全的字符。
  • URL编码原则的通俗理解:使用英文字符去表示非英文字符。
http://www.liulongbin.top:3006/api/getbooks?id=1&bookname=西游记
// 经过 URL 编码之后,URL地址变成了如下格式:
http://www.liulongbin.top:3006/api/getbooks?id=1&bookname=%E8%A5%BF%E6%B8%B8%E8%AE%B0

1.4 如何对URL进行编码与解码

浏览器提供了 URL 编码与解码的 API,分别是:

  • encodeURI() 编码的函数
encodeURI('黑马程序员')
// 输出字符串  %E9%BB%91%E9%A9%AC%E7%A8%8B%E5%BA%8F%E5%91%98
  • decodeURI() 解码的函数
decodeURI('%E9%BB%91%E9%A9%AC')
// 输出字符串  黑马

注: 由于浏览器会自动对 URL 地址进行编码操作,因此,大多数情况下,程序员不需要关心 URL 地址的编码与解码操作。

1.5 使用xhr发起get请求

步骤:

  • 创建 xhr 对象
  • 调用 xhr.open() 函数:指定 请求方式 与 URL地址
  • 设置Content-Type属性(固定写法)
    xhr.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded')
  • 调用 xhr.send() 函数:发起 Ajax 请求,同时指定要发送的数据
  • 监听 xhr.onreadystatechange 事件
        // 创建 xhr 对象
        var xhr = new XMLHttpRequest()
        // 调用 xhr.open() 函数
        xhr.open('POST', 'http://www.liulongbin.top:3006/api/addbook')
        // 设置 Content - Type 属性(固定写法)
        xhr.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded')
        // 调用 xhr.send() 函数,同时指定要发送的数据
        xhr.send('bookname=编译原理&author=蒋立源&publisher=西北工业大学出版社')
        // 监听 xhr.onreadystatechange 事件
        xhr.onreadystatechange = function () {
            if (xhr.readyState === 4 && xhr.status === 200) {
                // 4.2 打印服务器响应回来的数据
                console.log(xhr.responseText)
            }
        }

2. 数据交换格式

  • 数据交换格式,就是服务器端与客户端之间进行数据传输与交换的格式。
  • 前端领域,经常提及的两种数据交换格式分别是 XML 和 JSON。其中 XML 用的非常少,
    所以,我们重点要学习的数据交换格式就是 JSON。

2.1 XML简介

  • xml:可扩展标记语言。被设计用来传输和储存数据,是数据的载体
  • xml中没有预定义标签,都是自定义标签,用来表示一些数据

比如一个学生数据:

<student>
  <name>张三</name>
  <age>18</age>
  <sex></sex>
</student>

缺点:

  • XML 格式臃肿,和数据无关的代码多,体积大,传输效率低
  • 在 Javascript 中解析 XML 比较麻烦

2.2 JSON简介

概念:

  • JSON (JavaScript Object Notation),即“JavaScript 对象表示法”
  • JSON 就是 Javascript 对象和数组的字符串表示法,它使用文本表示一个 JS 对象或数组的信息,因此,JSON 的本质是字符串。

作用

  • JSON 是一种轻量级的文本数据交换格式,在作用上类似于 XML,专门用于存储和传输数据,
  • 但是 JSON 比 XML 更小、更快、更易解析。

2.3 JSON的两种结构

JSON 就是用字符串来表示 Javascript 的对象和数组。

所以,JSON 中包含对象数组两种结构,

通过这两种结构的相互嵌套,可以表示各种复杂的数据结构。

对象结构

  • 对象结构在 JSON 中表示为 { } 括起来的内容。
  • 数据结构为 如下所示 的键值对结构。
        {
            “key”: “value”,
            “key”: “value”,
            ...
        }
  • 其中,key 必须是使用英文的双引号包裹的字符串,
  • value 的数据类型可以是数字、字符串、布尔值、null、数组、对象6种类型。

image.png

数组结构

  • 数组结构在 JSON 中表示为 [ ] 括起来的内容。
  • 数据结构为
 [ "java", "javascript", 30, true … ]//字符串要用双引号包裹

数组中数据的类型可以是数字、字符串、布尔值、null、数组、对象6种类型。

image.png

语法的注意事项:

  • 属性名必须使用双引号包裹
  • 字符串类型的值必须使用双引号包裹
  • JSON 中不允许使用单引号表示字符串
  • JSON 中不能写注释
  • JSON 的最外层必须是对象或数组格式
  • 不能使用 undefined 或函数作为 JSON 的值

JSON 的作用: 在计算机与网络之间存储和传输数据。

JSON 的本质: 用字符串来表示 Javascript 对象数据或数组数据

2.4 JSON和JS对象的关系

image.png 2.5 JSON和JS对象的互转 要实现从 JSON 字符串转换为 JS 对象,使用 JSON.parse() 方法:

var obj = JSON.parse('{"a": "Hello", "b": "World"}')

//结果是 {a: 'Hello', b: 'World'}

  • 要实现从 JS 对象转换为 JSON 字符串,使用 JSON.stringify() 方法:
	var json = JSON.stringify({a: 'Hello', b: 'World'})

	//结果是 '{"a": "Hello", "b": "World"}'

2.6 序列化和反序列化

  • 数据对象 转换为 字符串的过程,叫做序列化,例如:调用 JSON.stringify() 函数的操作,叫做 JSON 序列化。
  • 字符串 转换为 数据对象的过程,叫做反序列化,例如:调用 JSON.parse() 函数的操作,叫做 JSON 反序列化。

3. 封装自己的Ajax函数

/*定义options参数选项
我们自定义的 Ajax 函数,它接收一个配置对象作为参数,配置对象中可以配置如下属性:
method   请求的类型
url           请求的 URL 地址
data        请求携带的数据
success   请求成功之后的回调函数  */
 
//需要把data对象,转换成查询字符串的格式,因此定义resolveData函数
// @param { data } 需要发送到服务器的数据 即需输入的数据  name:'zs',age=20
// @returns { string } 返回拼接好的查询字符串 name = zs & age=10
function resolveData(data) {
    var arr = [];
    // 对数组或者对象的属性进行循环操作
    //for(变量(即属性名) in 对象名字(即属性值))
    for (let k in data) {
        arr.push(k + '=' + data[k]);
    }
    return arr.join('&');
}
 
function myajax(options) {
    // 创建 xhr 对象
    var xhr = new XMLHttpRequest()
    var data = resolveData(options.data);
 
    //判断方式为 get 还是 post
    if (options.method.toUpperCase() === "GET") {//toUpperCase()是转为大写
        xhr.open('GET', options.url + '?' + data);
        xhr.send();
    }
    else if (options.method.toUpperCase() === "POST") {
        xhr.open('POST', options.url);
        xhr.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
        xhr.send(data);
    }
 
    // 监听 xhr.onreadystatechange 事件
    xhr.onreadystatechange = function () {
        //监听 xhr 对象的请求状态 readyState ;与服务器响应的状态 status
        if (xhr.readyState === 4 && xhr.status === 200) {
            // 服务器响应回来的数据 为 JSON格式的数据
            var res = JSON.parse(xhr.responseText);
            options.success(res);
        }
    }
}

使用格式:

    <script>
        myajax({
            method: 'GET',
            url: 'http://www.liulongbin.top:3006/api/getbooks',
 
            success: function (res) { // 成功的回调函数
                console.log(res)     // 打印数据
            }
        })
 
        myajax({
            method: 'POST',
            url: 'http://www.liulongbin.top:3006/api/addbook',
            data: {
                bookname: '编译原理',
                author: '蒋立源',
                publisher: '西北工业大学出版社'
            },
            success: function (res) { // 成功的回调函数
                console.log(res)     // 打印数据
            }
        })
    </script>