Ajax
1 <!DOCTYPE html> 2 <html lang="en"> 3 <head> 4 <meta charset="UTF-8"> 5 <title>Title</title> 6 <script src="/static/jquery-3.4.1/jquery-3.4.1.js"></script> 7 <style> 8 .btn{ 9 display: inline-block; 10 padding: 5px 10px; 11 background-color: brown; 12 color: aliceblue; 13 14 } 15 </style> 16 </head> 17 <body> 18 <div> 19 <h3>4、通过formdata和ajax上传文件</h3> 20 <input type="file" id="img"> 21 <h4>a、formdata+jquery ajax测试</h4> 22 <a class="btn" onclick="Ajaxsubmit6()">提交</a> 23 <h4>a、formdata+xmlhttprequest测试</h4> 24 <a class="btn" onclick="Ajaxsubmit7()">提交</a> 25 </div> 26 <script> 27 ///ajax上传文件: 28 //a、通过formdata和ajax发送请求 29 function Ajaxsubmit6 (){ 30 file_obj=document.getElementById("img").files[0] 31 var data = new FormData() 32 data.append("k1","k2") 33 data.append("k3",file_obj) 34 $.ajax({ 35 url:'/ajax1.html', 36 type:'POST', 37 data:data, 38 success:function (arg) { 39 console.log(arg) 40 }, 41 processData:false, //通过formdata上传的时候需要自己写请求头 42 contentType:false, 43 }) 44 } 45 function Ajaxsubmit7() { 46 /*通过 new 方法XMLHttpRequest对象实例*/ 47 var data = new FormData() 48 data.append("k1","k2") 49 var xhr = new XMLHttpRequest(); 50 /*open表示以什么方式创建连接*/ 51 xhr.open('POST','/ajax1.html') 52 /*回调函数需要写在send前 53 * 详细: 54 0-未初始化,尚未调用open()方法; 55 1-启动,调用了open()方法,未调用send()方法; 56 2-发送,已经调用了send()方法,未接收到响应; 57 3-接收,已经接收到部分响应数据; 58 4-完成,已经接收到全部响应数据;*/ 59 xhr.onreadystatechange=function(){ 60 if (xhr.readyState == 4){ 61 console.log(xhr.responseText) 62 } 63 } 64 /*get方式没有send的数据,如果需要加数据需要在url后面直接写上*/ 65 xhr.send(data); 66 67 68 } 69 70 } 71 </script> 72 73 <script> 74 75 </script> 76 </body> 77 </html>
一、Ajax概述
对于WEB应用程序:用户使用浏览器发送请求,然后服务器返回结果,往往返回的是字符串(HTML),浏览器将字符串(HTML)渲染并显示在浏览器上。
1、传统的Web应用:每一个简单的操作都需要重新加载全局数据;
2、AJAX(Asynchronous JavaScript and XML (异步的JavaScript和XML),一种创建交互式网页应用的网页开发技术方案)
异步的javascript:使用JavaScript语言以及相关的浏览器提供类库的功能向服务端发送请求,当服务端处理完请求之后,自动执行某个JavaScript的回调函数。
以上的请求和响应的整个过程是偷偷进行的,页面上无任务感知:URL不会刷新;
XML:XML是一种标记语言,是AJAX在和后台交互时传输数据的格式之一
利用AJAX可以做:
- 注册时,输入用户名自动检测用户是否已经存在;
- 登录时,提示用户名密码错误;
- 删除数据时,将行ID发送到后台,在后台数据库中删除,数据库删除成功后,在页面DOM中将数据行业删除
二、AJAX
1、JQuery AJAX
2、原生XMLHttprequest对象完成AJAX请求
1 <!DOCTYPE html> 2 <html lang="en"> 3 <head> 4 <meta charset="UTF-8"> 5 <title>Title</title> 6 <script src="/static/jquery-3.4.1/jquery-3.4.1.js"></script> 7 <style> 8 .btn{ 9 display: inline-block; 10 padding: 5px 10px; 11 background-color: brown; 12 color: aliceblue; 13 14 } 15 </style> 16 </head> 17 <body> 18 <h1>Ajax全套</h1> 19 <h3>jQuery Ajax___get</h3> 20 <div> 21 <a class="btn" onclick="Ajaxsubmit1()">Ajaxsubmit1_get</a> 22 <a class="btn" onclick="Ajaxsubmit2()">Ajaxsubmit2_get</a> 23 24 </div> 25 <h3>jQuery Ajax___post</h3> 26 <div> 27 <a class="btn" onclick="Ajaxsubmit3()">Ajaxsubmit3_post</a> 28 <a class="btn" onclick="Ajaxsubmit4()">Ajaxsubmit4_post</a> 29 30 </div> 31 <script> 32 /*基于jquery ajax(普通的ajax)*/ 33 function Ajaxsubmit1 (){ 34 $.ajax({ 35 url:'/ajax1.html', 36 type:'GET', 37 data:{'p':123}, 38 success:function (arg) { 39 {#console.log("请求成功")#} 40 } 41 42 }) 43 } 44 /* 不依赖jquery,使用原生的xmlhttprequest对象*/ 45 function Ajaxsubmit2() { 46 /*通过 new 方法XMLHttpRequest对象实例*/ 47 var xhr = new XMLHttpRequest(); 48 /*open表示以什么方式创建连接*/ 49 xhr.open('GET','/ajax1.html') 50 /*回调函数需要写在send前 51 * 详细: 52 0-未初始化,尚未调用open()方法; 53 1-启动,调用了open()方法,未调用send()方法; 54 2-发送,已经调用了send()方法,未接收到响应; 55 3-接收,已经接收到部分响应数据; 56 4-完成,已经接收到全部响应数据;*/ 57 xhr.onreadystatechange=function(){ 58 if (xhr.readyState == 4){ 59 console.log(xhr.responseText) 60 } 61 } 62 /*get方式没有send的数据,如果需要加数据需要在url后面直接写上*/ 63 xhr.send(null); 64 65 66 } 67 /*这是post 68 * jquery AJAX的post*/ 69 function Ajaxsubmit3 (){ 70 $.ajax({ 71 url:'/ajax1.html', 72 type:'POST', 73 data:{'p':123}, 74 success:function (arg) { 75 {#console.log("请求成功")#} 76 } 77 78 }) 79 } 80 /* 不依赖jquery,使用原生的xmlhttprequest对象的post*/ 81 function Ajaxsubmit4() { 82 /*通过 new 方法XMLHttpRequest对象实例*/ 83 var xhr = new XMLHttpRequest(); 84 /*open表示以什么方式创建连接*/ 85 xhr.open('POST','/ajax1.html') 86 /*回调函数需要写在send前 87 * 详细: 88 0-未初始化,尚未调用open()方法; 89 1-启动,调用了open()方法,未调用send()方法; 90 2-发送,已经调用了send()方法,未接收到响应; 91 3-接收,已经接收到部分响应数据; 92 4-完成,已经接收到全部响应数据;*/ 93 xhr.onreadystatechange=function(){ 94 if (xhr.readyState == 4){ 95 console.log(xhr.responseText) 96 } 97 } 98 /*get方式没有send的数据,如果需要加数据需要在url后面直接写上*/ 99 xhr.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded; charset-UTF-8') 100 xhr.send("p=456"); 101 102 103 } 104 105 <script> 106 107 </script> 108 </body> 109 </html>
1 from django.shortcuts import render,HttpResponse 2 import json,os,uuid 3 from django.views.decorators.clickjacking import xframe_options_exempt, xframe_options_sameorigin, xframe_options_deny 4 # Create your views here. 5 def index(request): 6 return render(request,'index.html') 7 def ajax(request): 8 return HttpResponse("这是ajax的返回数据") 9 """ 10 在使用iframe+form构造伪Ajax的时候,出现Refused to display 'http://127.0.0.1:9000/ajax1.html' in a frame 11 because it set 'X-Frame-Options' to deny的报错: 12 通过查询得知:https://www.liangzl.com/get-article-detail-158781.html需在相关的接口上添加装饰器即可""" 13 @xframe_options_exempt 14 def ajax1(request): 15 print(request.POST) 16 print(request.GET) 17 print(request.FILES) 18 ret = {"code":0,"message":"response success"} 19 return HttpResponse(json.dumps(ret))
3、伪AJAX:Iframe+Form
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> <script src="/static/jquery-3.4.1/jquery-3.4.1.js"></script> <style> .btn{ display: inline-block; padding: 5px 10px; background-color: brown; color: aliceblue; } </style> </head> <body> <script> function Ajaxsubmit5() { //在提交之前绑定事件 document.getElementById("iframe").onload=reloadiframe document.getElementById("fm").submit(); } function reloadiframe() { {#console.log("abs")#} {# console.log(ths)#} {# //dom#} {# console.log(ths.contentWindow.document.body.innerHTML)#} {# //jquery#} {# console.log($(ths).contents().find("body").html())#} var content = this.contentWindow.document.body.innerHTML var obj =JSON.parse(content) if(obj.code == 0){ alert(obj.message) } } </script> <div> {# /* 伪Ajax:基于form表单及iframe完成*/#} {# /*iframe*/#} {#<iframe id = "iframe" style="height: 800px" width= "100%" src="http://www.baidu.com" frameborder="0"></iframe>#} <iframe id = "iframe" name="ifra" ></iframe> <form action="/ajax1.html" id="fm" method="POST" target="ifra" > <input name="root" value="111111" /> {# <input type="submit" value="提交" />#} <a onclick="Ajaxsubmit5()">Ajaxsubmit5</a> </form> </div> <script> </script> </body> </html>
4、AJAX完成文件上传
(1)、AJAX文件上传
1 <!DOCTYPE html> 2 <html lang="en"> 3 <head> 4 <meta charset="UTF-8"> 5 <title>Title</title> 6 <script src="/static/jquery-3.4.1/jquery-3.4.1.js"></script> 7 <style> 8 .btn{ 9 display: inline-block; 10 padding: 5px 10px; 11 background-color: brown; 12 color: aliceblue; 13 14 } 15 </style> 16 </head> 17 <body> 18 <div> 19 <h3>4、通过formdata和ajax上传文件</h3> 20 <input type="file" id="img"> 21 <h4>a、formdata+jquery ajax测试</h4> 22 <a class="btn" onclick="Ajaxsubmit6()">提交</a> 23 <h4>a、formdata+xmlhttprequest测试</h4> 24 <a class="btn" onclick="Ajaxsubmit7()">提交</a> 25 </div> 26 <script> 27 ///ajax上传文件: 28 //a、通过formdata和ajax发送请求 29 function Ajaxsubmit6 (){ 30 file_obj=document.getElementById("img").files[0] 31 var data = new FormData() 32 data.append("k1","k2") 33 data.append("k3",file_obj) 34 $.ajax({ 35 url:'/ajax1.html', 36 type:'POST', 37 data:data, 38 success:function (arg) { 39 console.log(arg) 40 }, 41 processData:false, //通过formdata上传的时候需要自己写请求头 42 contentType:false, 43 }) 44 } 45 function Ajaxsubmit7() { 46 /*通过 new 方法XMLHttpRequest对象实例*/ 47 var data = new FormData() 48 data.append("k1","k2") 49 var xhr = new XMLHttpRequest(); 50 /*open表示以什么方式创建连接*/ 51 xhr.open('POST','/ajax1.html') 52 /*回调函数需要写在send前 53 * 详细: 54 0-未初始化,尚未调用open()方法; 55 1-启动,调用了open()方法,未调用send()方法; 56 2-发送,已经调用了send()方法,未接收到响应; 57 3-接收,已经接收到部分响应数据; 58 4-完成,已经接收到全部响应数据;*/ 59 xhr.onreadystatechange=function(){ 60 if (xhr.readyState == 4){ 61 console.log(xhr.responseText) 62 } 63 } 64 /*get方式没有send的数据,如果需要加数据需要在url后面直接写上*/ 65 xhr.send(data); 66 67 68 } 69 70 } 71 </script> 72 73 <script> 74 75 </script> 76 </body> 77 </html>
1 from django.shortcuts import render,HttpResponse 2 import json,os,uuid 3 from django.views.decorators.clickjacking import xframe_options_exempt, xframe_options_sameorigin, xframe_options_deny 4 # Create your views here. 5 6 def upload_img(request): 7 nid = str(uuid.uuid4()) 8 ret = {'status':True,'data':None,'message':None} 9 obj = request.FILES.get("k3") 10 11 file_path = os.path.join('static',nid+obj.name) 12 f = open(file_path,'wb') 13 for line in obj.chunks(): 14 f.write(line) 15 f.close() 16 ret['data'] = file_path 17 ret['message'] = '上传成功' 18 return HttpResponse(json.dumps(ret)) 19 ###确定上传后在吧文件路劲写到数据库去;
(2)、伪AJAX文件上传
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> <script src="/static/jquery-3.4.1/jquery-3.4.1.js"></script> <style> .btn{ display: inline-block; padding: 5px 10px; background-color: brown; color: aliceblue; } </style> </head> <body> <script> function Ajaxsubmit8() { document.getElementById("iframe1").onload=reloadiframe1 document.getElementById("fm1").submit(); function reloadiframe1() { {#console.log("abs")#} {# console.log(ths)#} {# //dom#} {# console.log(ths.contentWindow.document.body.innerHTML)#} {# //jquery#} {# console.log($(ths).contents().find("body").html())#} var content = this.contentWindow.document.body.innerHTML; var obj =JSON.parse(content); console.log(obj); } } </script> <h3>5、通过iframe+form上传文件</h3> <div> {# /* 伪Ajax:基于form表单及iframe完成*/#} {# /*iframe*/#} {#<iframe id = "iframe" style="height: 800px" width= "100%" src="http://www.baidu.com" frameborder="0"></iframe>#} <iframe id = "iframe1" style="display: none" name="ifra1" ></iframe> <form action="/ajax1.html" id="fm1" method="POST" enctype="multipart/form-data" target="ifra1" > <input type="text" name="k1"> <input type="text" name="k2"> <input type="file" name="k3"> {# <input type="submit" value="提交" />#} <a onclick="Ajaxsubmit8()">提交</a> </form> </div> <script> </script> </body> </html>
(3)、伪AJAX文件上传并预览
1 <!DOCTYPE html> 2 <html lang="en"> 3 <head> 4 <meta charset="UTF-8"> 5 <title>Title</title> 6 <script src="/static/jquery-3.4.1/jquery-3.4.1.js"></script> 7 <style> 8 .btn{ 9 display: inline-block; 10 padding: 5px 10px; 11 background-color: brown; 12 color: aliceblue; 13 14 } 15 </style> 16 </head> 17 <body> 18 <div> 19 {# /* 伪Ajax:基于form表单及iframe完成*/#} 20 {# /*iframe*/#} 21 {#<iframe id = "iframe" style="height: 800px" width= "100%" src="http://www.baidu.com" frameborder="0"></iframe>#} 22 <iframe id = "iframe1" style="display: none" name="ifra1" ></iframe> 23 <form action="/upload_img.html" id="fm1" method="POST" enctype="multipart/form-data" target="ifra1" > 24 {# <input type="text" name="k1">#} 25 {# <input type="text" name="k2">#} 26 <input type="file" name="k3" onchange="uploadfile();"> 27 {# <input type="submit" value="提交" />#} 28 {# <a onclick="Ajaxsubmit8()">提交</a>#} 29 </form> 30 <h3>上传预览</h3> 31 <div id="preview"> 32 </div> 33 </div> 34 35 <script> 36 function uploadfile() { 37 document.getElementById("iframe1").onload=reloadiframe1 38 document.getElementById("fm1").submit(); 39 function reloadiframe1() { 40 {#console.log("abs")#} 41 {# console.log(ths)#} 42 {# //dom#} 43 {# console.log(ths.contentWindow.document.body.innerHTML)#} 44 {# //jquery#} 45 {# console.log($(ths).contents().find("body").html())#} 46 var content = this.contentWindow.document.body.innerHTML; 47 var obj =JSON.parse(content); 48 console.log(obj.data); 49 var tag = document.createElement('img'); 50 tag.src=obj.data; 51 $("#preview").empty().append(tag) 52 } 53 54 } 55 </script> 56 </body> 57 </html>
1 from django.shortcuts import render,HttpResponse 2 import json,os,uuid 3 from django.views.decorators.clickjacking import xframe_options_exempt, xframe_options_sameorigin, xframe_options_deny 4 # Create your views here. 5 def upload_img(request): 6 nid = str(uuid.uuid4()) 7 ret = {'status':True,'data':None,'message':None} 8 obj = request.FILES.get("k3") 9 10 file_path = os.path.join('static',nid+obj.name) 11 f = open(file_path,'wb') 12 for line in obj.chunks(): 13 f.write(line) 14 f.close() 15 ret['data'] = file_path 16 ret['message'] = '上传成功' 17 return HttpResponse(json.dumps(ret)) 18 ###确定上传后在吧文件路劲写到数据库去;
5、AJAX跨域
(1)、JSONP实现AJAX跨域
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> <div id="content"></div> <input type="button" value="发送" onclick="submitjsonp();"> <script src="/static/jquery-3.4.1/jquery-3.4.1.js"></script> <script> //通过jsonp完成跨域请求 function submitjsonp() { $.ajax({ url:'http://www.jxntv.cn/data/jmd-jxtv2.html?callback=list&_=1454376870403', type:'GET', //jsonp方式不再按照原方式进行数据处理 dataType:'jsonp', jsonp:'callback', jsonpCallback:'list' }) function list(arg) { console.log(arg); } } </script> </body> </html>

浙公网安备 33010602011771号