diff --git "a/33\351\227\253\347\273\247\345\221\250/20231206Ajax.md" "b/33\351\227\253\347\273\247\345\221\250/20231206Ajax.md" new file mode 100644 index 0000000000000000000000000000000000000000..82e9d9eb324b19ced2cd41672558bdf8e055dcbb --- /dev/null +++ "b/33\351\227\253\347\273\247\345\221\250/20231206Ajax.md" @@ -0,0 +1,158 @@ +一、概念 +1.什么是Ajax +Ajax(Asynchronous Javascript And XML),即是异步的JavaScript和XML,Ajax其实就是浏览器与服务器之间的一种异步通信方式 + +异步的JavaScript + +它可以异步地向服务器发送请求,在等待响应的过程中,不会阻塞当前页面,在这种情况下,浏览器可以做自己的事情。直到成功获取响应后,浏览器才开始处理响应数据。 + +XML + +是前后端数据通信时传输数据的一种格式,现在已经不怎么用了,现在比较常用的是 JSON + +所以归纳上述的概念,Ajax就是在浏览器不重新加载网页的情况下,对页面的某部分进行更新。 + +2.应用场景 +注册页面 + + + +搜索提示 + + + +还有很多很多... + +所以Ajax最大的优点就是,发送请求的时候不会影响用户的操作,相当于两条平行线一样,“你忙你的,我忙我的”,不需要去等待页面的跳转而浪费时间。 + +二、实现Ajax +我们先看一组代码:在这里创建的json文件和html文件都在同一个文件夹中 + +//test.josn的代码 +{ + "reply":"我收到啦!" +} + +const xhr = new XMLHttpRequest(); +xhr.onreadystatechange = () => { + if (xhr.readyState !== 4) return; + if ((xhr.status >= 200 && xhr.status < 300) || xhr.status === 304) { + console.log(xhr.responseText); + } +}; +xhr.open('GET', 'text.json', true); +xhr.send(null); +执行结果: + + + +在这里要啰嗦两句:json文件中的对象键名一定要用双引号包裹,如果属性值里面有字符串,也需要用双引号包裹。 + +执行步骤 +1.创建xhr对象 +const xhr = new XMLHttpRequest(); +2.利用onreadystatechange属性,封装一个函数,用于监听 readyState的变化。 +xhr.onreadystatechange = () => { +if (xhr.readyState !== 4) return; +if (xhr.status >= 200 && xhr.status < 300 ){ + console.log(xhr.responseText); + } +}; +2.1在xhr对象执行收发数据的时候,它会经历五种状态: + +Ajax状态码 状态 +0 (未初始化)未启动 +1 (启动)已经调用 open(),但尚未调用 send() +2 (发送)发送状态,已经调用 send(),但尚未接收到响应 +3 (接收)已经接收到部分响应数据 +4 (完成)已经接收到全部响应数据,而且已经可以在浏览器中使用了 +加两句console.log()就可以看见状态码的变化了。 + + + +上述的readyStateChange事件是专门用来监听xhr对象的Ajax状态码,只要readyState(也就是Ajax状态码)发生了变化,就会触发这个事件。 + + + +2.2判断HTTP状态码是否为200-299 + +Ajax状态码为4是不够的,这仅仅表明收到服务器端响应的全部数据,并不能保障数据都是正确的。 + +所以,我们还需要判断HTTP的状态码,判断xhr对象的status属性值是否在200到300之间(200-299 用于表示请求成功) + +if (xhr.status >= 200 && xhr.status < 300 ){ + console.log(xhr.responseText); +} +所以要想请求成功完成,必须要满足上面两个条件。 + +3.准备发送请求 +xhr.open('GET','text.json', true); +参数1:选用"GET"或者“POST”的请求方式 + +参数2:发送请求的地址 + +参数3:是否异步 + +4.发送请求 +xhr.send(null) + 注意:send() 的参数是通过请求体携带的数据,而GET请求是通过请求头携带数据的,所以要把send的参数置为null + +三、跨域 +概念 +什么是跨域?为什么会有跨域这种问题存在? + +跨域的字面意思来说,就是向一个域发送请求,如果要请求的域和当前域是不同域,就叫跨域 + +https(协议)://a.xxx.com(域名):8080(端口号)/flie/list(路径) + +只要协议、域名、端口号,只要有任何一个不一样,都是不同域 + +同源策略 +同源策略限制了跨域,同源策略是浏览器核心的安全机制,如果没有了同源策略,浏览器的正常功能就会受到影响,所以web是构建在同源策略的基础之上。 + +如果非同源,那么在请求数据时,浏览器会在控制台中报一个异常,提示拒绝访问。 + +以下就是不同源: + +前端: http://a.com:8080/ + +服务端:https//b.com/api/xxx + +所以同源就是协议、域名、 端口号都要一样。 + +跨域解决方法 +1.CORS 跨域资源共享 + +2.JSONP + +四、写一个简易的Ajax +结合了Promise和Ajax的知识点 + +```js +function ajax(url) { + const p = new Promise((resolve, reject) => { + const xhr = new XMLHttpRequest(); + xhr.open('GET', url, true) + xhr.onreadystatechange = () => { + if(xhr.readyState === 4){ + if((xhr.status >= 200 && xhr.status < 300) || xhr.status === 304){ + resolve( + JSON.parse(xhr.response) + ) + }else{ + reject(new Error('Response error')) + } + } + } + xhr.send(null) + }) + return p +} +const url = 'text.json' +ajax(url).then(res => console.log(res)).catch(err => console.log(err)) + + + +``` + + diff --git "a/33\351\227\253\347\273\247\345\221\250/20231207ChatRobot.md" "b/33\351\227\253\347\273\247\345\221\250/20231207ChatRobot.md" new file mode 100644 index 0000000000000000000000000000000000000000..244a4c77a3e5f14a2279a6b2c4cbde65a8a720d6 --- /dev/null +++ "b/33\351\227\253\347\273\247\345\221\250/20231207ChatRobot.md" @@ -0,0 +1,354 @@ +# 笔记 + +```js +// axios +axios({ + url: '要访问的API', + method: 'get/post', // get:查询,获取 post:提交 + params:{ + 参数名:值, + 参数名:值, + 参数名:值... + } + [ data:{ + 参数名:值, + 参数名:值, + 参数名:值... + }] +}).then(function(result){ + // 成功时执行的逻辑 +}).catch(function(error){ + // 异常时执行的逻辑 +}) + +// 批量处理表单数据,需要先导入()这个库,且表单一定要有name属性 +serialize(form表单元素,{hash:true,empty:true}) // empty:包含与否空格 +``` + +# 聊天机器人 + +```html + + + +
+ + + +