Ajax

ajax需要放在网站服务器下运行,不能双击运行。

用ajax得到服务器的返回结果,最后一段js代码指的是:当ajax对象接受到服务器的相应时,onload事件触发,此时执行函数进行打印:

 

 

 

通过浏览器测试:

 

 

服务器会将json数据由对象转换为字符串格式,进而返回给客户端,此时客户端必须再用JSON.parse将其解析成对象才方便后续的使用:

 

 

 

 传递get参数:

 

 

 

node从req.query当中得到参数,并返回给浏览器

 

 

 通过XHR可以看到ajax:

 

 得到post参数,假定要传的参数是通过拼接字符串的方式:

客户端:

 

服务器端:

 

由于是字符串格式:

 

 

若客户端用post传递json格式数据,注意json格式只能用post来传递: 

 

 

 

 

 客户端要用JSON.stringify把json对象转换成字符串格式才能发给服务器,同时设置请求头:

 

模拟不同的错误发生情况,注意responseText是服务器send过来的数据:

 

 

假定断网情况下:

 

 查看:

 

客户端利用onerror数据来处理事件:

 

2个状态码的区别: 

 

如果浏览器每次都请求同一个地址,那么有可能不会真的访问服务器,而是从缓存当中拿到,那么服务器真正的文件若发生变化客户端也不知道

解决,修改open中的地址加上随机数即可:

 异步编程:

将请求代码封装到函数当中,方便发送请求,简化代码,函数当中对象触发onload事件调用success处理函数让客户端外头处理,即具体处理的这个success函数写到了外面,这样就能够在客户端处理来自服务器端的数据了:

 

 

 传入get或者post请求:

先把参数封装成json格式,然后调用ajax,一会儿再把get改为post测试一下:

 

此处将json格式装换为name=asd&sex=awd格式,并以get方式传到服务器那里:

 

 

 

 完善:当用post请求传递json数据或者普通类型数据,得分开处理:

外面添加header属性:

 

 完善ajax函数:

 

 完善:对于服务器的不同返回状态,分开处理:

修改服务器端用于测试:

完善:ajax函数:

 

完善客户端外部,在header属性下面增添error属性:

 

 完善:当不知道服务器端会不会返回json数据类型还是别的类型:

 

 

 

 完善:如果用户没有传递参数,则用一个默认的数据default,把下面的options都改为defaults:

 

如果用户有传值,就覆盖defaults

 

测试:

 

 

 

模板引擎:

下载art-template模板引擎库文件:

 

 

创建并使用模板,第二个scrip是模板,template方法是库文件里面的,它加模板当中的变量进行替换,生成拼接好的字符串,然后html代码再复制给div的innerHTML就显示出来了:

 

 

 案例:邮箱验证:本案例使用bootstrap

 

 

 

代码:C:\aaa2222339\download\11-16 前后端交互\14ajax课程\day02\code\server\public 

案例,搜索框内容自动提示:

 

 案例:省市区

 

formdata:将普通表单转换为表单对象,此时不需要再人工拿到input了,不给不能使用get方法:

 

 

 服务器端,使用formidable来处理这种表单:

 

 

 

获取和设置表单属性,第一个参数是表单中name的值:

 

删除表单属性:

 

 追加表单对象:

 

 set和append区别,不过服务器端如果发现多个同名属性,只会选择最后一个属性:

 

formdata 文件上传,注意不能使用get方式:

 

客户端:

 

 

 

 

 

 服务器,先设置好文件将存放在服务器哪个位置,再保留上传的后缀名,最后parse()解析参数并自动上传:

 

测试:

 

 上传进度提示,当上传一个文件时,每次上传一部分都会触发onprogress事件:

客户端添加upload事件,关键代码:

 

 

 

 

 图片上传即时预览:看看上传的是个啥:

服务器端的file.attrName.path就是上传到服务器的具体哪个位置了,为了取得后面的位置,用split方法用以public做为分割符将其分割为一个数组,取1号索引:

 

 客户端关键代码,服务器将上传到自己位置的地址发现客户端,让客户端显示。注意要用js动态创建img标签,而不是把img写到html中,因为需要上传完成之后才要显示图片:

 

 同源:

 

同源政策:ajax不能向非同源的地址发送请求。写2个服务器,同时开启,访问第一个服务器的html页面,但是该html页面里面的json访问的是第二个服务器:

s2:

 

 s1:

 

浏览器报错: 

 

 jsonp解决:jsonp输入get请求,A服务器有个html,利用script标签的src指向B服务的地址,B服务器的关键代码:

 

 A服务器的html页面,通过script标签得到了B服务器返回的字符串,然后执行fn(对象),由于fn(对象)上面已经定义,所以执行fn函数:

 

优化:点击按钮之后再创建script标签(动态发送请求),此时删掉上面案例那个有src的script防止干扰,由于只看到效果就行,所以当script加载并调用函数完毕之后,就去掉script标签,此时多次点击按钮也不会有多个script了:

 

优化:如果客户端1更改了fn的命名,那么就会出错,此时为了使得客户端1与服务器2的fn函数同名,客户端1利用url传入fn的名字给服务器2:

客户端1:

 

服务器 2:

 

 优化:封装成jsonp函数方便调用:

 

 点击按钮则调用函数:

 

优化:windows的属性中注册函数,这样就成为了全局变量,当服务器返回时,客户端script生成,此时就能自动执行这个全局函数fn了。为了防止window的fn属性被覆盖,因此需要每次点击按钮fn的名字都不相同,即window的属性就不相同,此时使用random随机生成数字,最后用fnName作为fn的名字,此时注意变量名不能.,只能放到[]里面。

 

 2个按钮有各自的处理函数,此时把处理函数写到jsonp()的参数对象的success属性中,删掉之前的fn:

 

 

 

 服务器端测试,每次请求隔1s之后返回结果:

 查看每次点击的函数名字:

 优化:当传递多个参数时,将参数写到data属性中:

 

在jsonp函数中,拼接参数:

 

服务器提供jsonp方法,这个和注释部分的那些代码实现功能基本一致:

 

 

浏览器查看:

 

 

 

使用jsonp获取天气服务区所返回的天气信息并显示到客户端:

文档如下,设置jsonp函数的属性值,告诉服务器自己想要什么数据

 

关键代码说明,下面模板中会调用dateFormat函数传入参数,并得到返回值:

模板中:

 

js中:

代码:C:\aaa2222339\download\11-16 前后端交互\14ajax课程\day03\code\s1\public 

 CORS跨域资源共享:允许浏览器向跨域服务器直接发送ajax请求(不用像上面得绕过去),只用设置服务器端哪些客户端值得相应,能用哪些方式相应:

jsonp代码不用变:

 

修改跨域服务器代码,让非同源服务器一开始就判断要不要给客户端相应: 

 

 

浏览器查看:

 

 

 

 

 

 另一种访问非同源服务器方案:用A客户端访问A服务器,由于服务器方面可以跨域,则A服务器再访问B服务器,由B服务器返回数据给A服务器,A服务器再返回给客户端:

A客户端访问A服务器:

 

A服务器访问B服务器,body变量接受B服务器返回的数据,再把body返回给客户端:

 

 

 

B服务器:

 

 实现跨域登录功能:

 

在跨域请求时,默认是不携带cookie的,但是可以设置,客户端设置withCredentials为true携带cookie,服务器端:

 

 服务器端也要加一行代码允许客户端携带:

 

  代码:C:\aaa2222339\download\11-16 前后端交互\14ajax课程\day03\code\s1\public

 利用jQuery的ajax方法发送请求,error函数参数是ajax对象:

 

 

 说明:改为pos也行。由于与客户端的协议,端口,域名相同,可以简写为如下,浏览器自动拼接:

 

 测试上面的error函数:

修改服务器:

 传递参数,content-type指定要传递什么类型的参数,如果不写则默认是x-www。。。,相对应data就得是name=awd&。。。格式:

 

 

如果contentype设置为别的,则data要换格式:

 

 

beforeSend:

 

 

 

 

 

 

 封装表单数据:serialize函数只能将表单数据转换成name=asd&..格式,不方便。

 

 

 这里的serializeArray能将表单数据转换为上一行注释的格式,然后通过循环最终把form表单拼接为对象数据格式并返回。

 

 

 $.ajax()可以传递ajax请求,也能传递jsonp请求,需要在dataType中说明:

客户端:

 

 

跨域服务器:

 

 

如果原来是:?callback=....,想把callback改个名字叫cb ,需要新增jsonp属性:

 

 

服务器端:

 

 

 如果不想使用success属性,而是想自己定义调用函数,增加jsonpCallback属性,并在外面定义fn:

 

 

 

 

 

 

 

 发送get请求或者post请求,第一个参数请求方式,第二个参数是要传递的参数,可以是对象也可以是字符串,可选的,第三个参数是回调函数用于处理服务器返回的数据:

 

 

服务器端:

 

 

案例todo:

代码:C:\aaa2222339\download\11-16 前后端交互\14ajax课程\day04\code\server\public\todo

 

 

进入MongoDB数据库环境:

 

 

切换到admin数据库:

 

 

登录进admin数据库:

 

 

切换到todo数据库,如果不存在则创建:

 

 

 为todo数据库创建普通账号,可读写:

 

 

 输入exit退出。

全局事件:

nprogress插件:

 

 

 

 

 

 客户端添加2个全局事件:

 

 

 服务器端利用定时器测试一下进度条:

 

 

统一API风格:

 

 

 服务器端实现:

 

 

 

 

 

 客户端测试:

 

 

 

 

xml:

 

 

客户端利用xml dom操纵xml,获取xml数据:

 

 

服务器端返回xml数据:

 

posted @ 2020-02-05 17:03  Jary霸  阅读(100)  评论(0编辑  收藏  举报