Django学习---原生ajax

Ajax

原生ajax

Ajax主要就是使用 【XmlHttpRequest】对象来完成请求的操作,该对象在主流浏览器中均存在(除早起的IE),Ajax首次出现IE5.5中存在(ActiveX控件)。

XmlHttpRequest对象的主要方法:

a. void open(String method,String url,Boolen async)用于创建请求参数:method: 请求方式(字符串类型),如:POST、GET、DELETE...url:    要请求的地址(字符串类型)async:  是否异步(布尔类型)b. void send(String body)用于发送请求参数:body: 要发送的数据(字符串类型)c. void setRequestHeader(String header,String value)用于设置请求头,可以用在做csrf验证上main参数:header: 请求头的key(字符串类型)vlaue:  请求头的value(字符串类型)d. String getAllResponseHeaders()获取所有响应头返回值:响应头数据(字符串类型)e. String getResponseHeader(String header)获取响应头中指定header的值参数:header: 响应头的key(字符串类型)返回值:响应头中指定的header对应的值f. void abort()终止请求

XmlHttpRequest对象的主要属性:

a. Number readyState状态值(整数)详细:0-未初始化,尚未调用open()方法;1-启动,调用了open()方法,未调用send()方法;2-发送,已经调用了send()方法,未接收到响应;3-接收,已经接收到部分响应数据;4-完成,已经接收到全部响应数据;b. Function onreadystatechange当readyState的值改变时自动触发执行其对应的函数(回调函数)c. String responseText服务器返回的数据(字符串类型)d. XmlDocument responseXML服务器返回的数据(Xml对象)e. Number states服务端返回的状态码(整数),如:200、404...f. String statesText状态码对应的状态文本(字符串),如:OK、NotFound...

 

 xmlhttpresponse发送原生的ajax案例:(GET方式)

views.py:

def ajax(request):return render(request,'ajax.html')
def ajax_json(request):import jsonret = {'status':True,'data':None}return HttpResponse(json.dumps(ret))

 

ajax.html:

<input type="text"><input type="button" value="Ajax1" onclick="Ajax1();"><script>function Ajax1(){var xhr = new XMLHttpRequest();xhr.open('GET','/ajax_json/',true);xhr.onreadystatechange = function(){if(xhr.readyState == 4){//执行完毕console.log(xhr.responseText);}}xhr.send("name=root;pwd=123");}</script>

 

之后我们点击按钮,在console上就可以看到返回的数据

 xmlhttpresponse发送原生的ajax案例:(POST方式)

那如果用上述方法发送的话肯定是收不到post数据的,需要给它加上一个请求头

<script>function Ajax1(){var xhr = new XMLHttpRequest();xhr.open('POST','/ajax_json/',true);xhr.onreadystatechange = function(){if(xhr.readyState == 4){//执行完毕console.log(xhr.responseText);}}//设置请求头xhr.setRequestHeader('Content-type','application/x-www-form-urlencoded; charset-UTF-8');xhr.send("name=root;pwd=123");}

 

解决兼容性问题:

function getXHR(){var xhr = null;if(XMLHttpRequest){xhr = new XMLHttpRequest();}else{xhr = new ActiveXObject("Microsoft.XMLHTTP");}return xhr;}

 

 jquery ajax:

jQuery Ajax本质 XMLHttpRequest 或 ActiveXObject 

<p><input type="button" onclick="XmlSendRequest();" value='Ajax请求' />
</p><script type="text/javascript" src="jquery-1.12.4.js"></script><script>function JqSendRequest(){$.ajax({url: "http://c2.com:8000/test/",type: 'GET',dataType: 'text',success: function(data, statusText, xmlHttpRequest){console.log(data);}})}

“伪”AJAX

 首先我们来看一个例子:

<input type="text" id="url">
<input type="button" value="发送iframe请求" onclick="iframeRequest();">
<iframe id="ifm" src="http://www.baidu.com"></iframe><script src="/static/jquery-1.12.4.js"></script><script>function iframeRequest() {var url = $('#url').val()$('#ifm').attr('src',url)}

当我们在text框中输入地址,点击按钮的时候,就会跳转到相应的网址。但是此时当我们提交网址的时候我们的页面是不会刷新的。我们就可以用iframe的这个特点实现一个伪‘ajax’

<form action="/ajax_json/" method="post" target="ifm1"><iframe name="ifm1"></iframe><input type="text" name="username"><input type="text" name="email"><input type="submit" value="Form提交">
</form>

平常的form提交的时候都需要刷新页面提交数据,如果我们想要用iframe伪造提交,就可以用到form的一个参数target,设置为iframe的id选择器名称就可以了。此时我们的数据就可以发送给后台

那我们看到返回的数据在iframe中了,我们怎么把这个数据取出来呢?

这里我们可以看到iframe中其实是一个上下文的形式

我们就没有办法用jQuery中的innerhtml或者children等进行获取,那我们还可以知道的是这个数据是在服务端返回的时候才会被传到iframe中的。对于iframe来说如果有东西返回了,这里面就会有一个onload事件

<form action="/ajax_json/" method="post" target="ifm1"><iframe id="ifm1" name="ifm1"></iframe><input type="text" name="username"><input type="text" name="email"><input type="submit" onclick="submitForm();" value="Form提交">
</form>js代码:
function submitForm() {$('#ifm1').load(function () {var text = $('#ifm1').contents().find('body').text()var obj = JSON.parse(text)})
}

3种方式的选择时机

 如果发送的是普通的数据,比如用户填入的值等,直接用jQuery-》XMLHttpRequest-》iframe

 ajax文件上传

 基于原生的ajax:

upload.html:

 1 <!DOCTYPE html>
 2 <html lang="en">
 3 <head>
 4     <meta charset="UTF-8">
 5     <title>Title</title>
 6     <style>
 7         .upload{
 8             display: inline-block;
 9             padding: 10px;
10             background-color: coral;
11             position: absolute;
12             top:0;
13             bottom: 0;
14             left: 0;
15             right: 0;
16             z-index: 9;
17             border-radius: 8px;
18             text-align: center;
19         }
20         #f1{
21             width: 75px;
22             height:40px;
23             position: absolute;
24             top:0;
25             bottom: 0;
26             left: 0;
27             right: 0;
28             opacity: 0;
29             z-index: 10;
30 
31         }
32     </style>
33 </head>
34 <body>
35     <div style="position: relative;width: 75px;height:40px;">
36         <input type="file" id="f1" name="uploadFile">
37         <a class="upload">上传</a>
38     </div>
39     <input type="submit" value="提交XHR" onclick="xhrSubmit();">
40     <script src="/static/jquery-1.12.4.js"></script>
41     <script>
42         function xhrSubmit(){
43             var file_obj=document.getElementById('f1').files[0];
44             var fd = new FormData();
45             fd.append('username','root');
46             fd.append('uploadFile',file_obj);
47 
48             var xhr = new XMLHttpRequest();
49             xhr.open('POST','/upload_file/',true);
50             xhr.onreadystatechange=function(){
51                 if(xhr.readyState == 4){
52                     var obj = JSON.parse(xhr.responseText);
53                     console.log(obj)
54                 }
55             };
56             xhr.send(fd)
57         }
58     </script>
59 </body>
60 </html>

 

views.py

def upload(request):return render(request,'upload.html')
def upload_file(request):username = request.POST.get('username')fileName = request.FILES.get('uploadFile')print(username,fileName)with open(fileName.name,'wb') as f:for item in fileName.chunks():f.write(item)import jsonret = {'status': True, 'data': username}return HttpResponse(json.dumps(ret))

 

 这里要基于FormData类来进行存储文件,低版本不支持

 基于jQuery:

    function jqSubmit(){var file_obj=document.getElementById('f1').files[0];var fd = new FormData();fd.append('username','root');fd.append('uploadFile',file_obj);$.ajax({url:'/upload_file/',type: 'POST',data: fd,processData: false, //tell jQuery not to process the datacontentType: false, //tell jQuery not to set contenttypesuccess:function(data,s1,s2){console.log(data);console.log(s1);console.log(s2);}})}

 

 在这里我们因为要上传文件,所以要加上参数processData,contentType这两个参数。这样才能运行成功

 基于iframe:(这个兼容性很强

  <form action="/upload_file/" method="post" enctype="multipart/form-data" target="ifm1"><iframe id="ifm1" name="ifm1" style="display: none"></iframe><input type="file" name="uploadFile"><input type="submit" onclick="iframeSubmit();" value="Form提交"></form><script src="/static/jquery-1.12.4.js"></script><script>function iframeSubmit() {$('#ifm1').load(function () {var text = $('#ifm1').contents().find('body').text()var obj = JSON.parse(text)console.log(obj)})}

 

 文件预览:

我们在接受文件的时候,我们可以把文件的url路径返回去,然后在添加一个div,在里面插入图片即可:

view.py:

def upload_file(request):username = request.POST.get('username')fileName = request.FILES.get('uploadFile')import osimg_path = os.path.join('static/imgs/',fileName.name)with open(img_path,'wb') as f:for item in fileName.chunks():f.write(item)import jsonret = {'status': True, 'data': img_path}return HttpResponse(json.dumps(ret))

 

upload.html:

<form action="/upload_file/" method="post" enctype="multipart/form-data" target="ifm1"><iframe id="ifm1" name="ifm1" style="display: none"></iframe><input type="file" name="uploadFile" onchange="changeUpload();"><input type="submit" onclick="iframeSubmit();" value="Form提交"></form><div id ="preview" style="width:100px;height:300px;"></div><script src="/static/jquery-1.12.4.js"></script><script>function iframeSubmit() {$('#ifm1').load(function () {var text = $('#ifm1').contents().find('body').text()var obj = JSON.parse(text)$('#preview').empty()var imgTag = document.createElement('img')imgTag.src = '/' obj.data;$('#preview').append(imgTag);})}

 


更多专业前端知识,请上 【猿2048】www.mk2048.com

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/361899.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

霸主–统治和管理API的地方

今天我们生活在一个越来越分散的世界中。 如今的计算机系统不再是在随机桌子下面的某些硬件上运行单个部门项目&#xff0c;而是大规模&#xff0c;集中甚至分散地运行。 监视和管理的需求从未改变&#xff0c;但是随着时间的推移变得越来越复杂。 如果将所有这些跨功能功能都放…

Java开发人员应该知道的5种错误跟踪工具

随着Java生态系统的不断发展&#xff0c;可满足不断增长的请求和用户对高性能需求的Web应用程序成为了新型的现代开发工具。 具有快速新部署的快速节奏环境需要跟踪错误并获得应用程序行为的洞察力&#xff0c;而传统方法无法维持这种水平。 在这篇文章中&#xff0c;我们决定收…

Emacs中的Color Theme以及字体设置

先上一张效果图&#xff1a; Color Theme用的是gnome2, 字体用的是Visual Studio自带的Consolas。我使用的环境是WindowsCygwinEmacs23.2。 1,安装Color Theme插件 首先&#xff0c;从http://download.savannah.gnu.org/releases/color-theme/下载color theme 6.6.0版本。 接着…

vue兼容ie10问题并且node——module中出现es6语法如何解决

一、首先进行安装babel-polyfill&#xff0c;如果你用yarn安装babel-polyfill的话需要yarn add babel-polyfill进行安装 二、在babel.config.js中加入 三、在ie浏览器中找到报错的文件&#xff0c;然后将文件加入其中 转载于:https://www.cnblogs.com/changhuanran/p/11193149.…

2个在Java中将Byte []数组转换为String的示例

将字节数组转换为String似乎很容易&#xff0c;但是很难做到正确。 每当字节转换为String或char时&#xff0c;许多程序员都会犯忽略字符编码的错误&#xff0c;反之亦然。 作为程序员&#xff0c;我们都知道计算机只能理解二进制数据&#xff0c;即0和1。我们看到和使用的所有…

Linux文件IO-例会笔记总结

上周日实验室例会主要涉及linux文件操作的内核实现。主要讨论了linux下对文件进行操作时&#xff0c;系统内部调用了那些函数以及它们是怎么相互配合的。 linux系统是怎样对不同介质和不同的文件系统提供统一的文件操作接口呢&#xff1f;答案是&#xff1a;VFS。系统中所有文件…

用js来实现那些数据结构12(散列表)

上一篇写了如何实现简单的Map结构&#xff0c;因为东西太少了不让上首页。好吧。。。 这一篇文章说一下散列表hashMap的实现。那么为什么要使用hashMap&#xff1f;hashMap又有什么优势呢&#xff1f;hashMap是如何检索数据的&#xff1f;我们一点一点的来解答。 在我们学习一门…

探索SwitchYard 2.0.0.Alpha2快速入门

在我的最后一篇文章中&#xff0c;我解释了如何在WildFly 8.1上使用SwitchYard。 同时&#xff0c;该项目很忙&#xff0c;并发布了另一个Alpha2。 这是一个很好的机会&#xff0c;在这里浏览快速入门并刷新您的记忆。 除了版本更改之外&#xff0c;您仍然可以使用较早的博客来…

走进webpack(1)--环境拆分及模块化

初级的文章和demo已经基本完成了&#xff0c;代码也已经上传到了我的github上&#xff0c;如果你对webpack的使用并不是十分了解&#xff0c;那么建议你回头看下走近系列&#xff0c;里面包括了当前项目中使用频繁的插件&#xff0c;loader的讲解。以及基本的webpack配置&#…

适用于微服务架构的Apache Camel

在知道微服务架构被称为之前&#xff0c;我一直在使用它们。 我曾经使用过由隔离模块组成的管道应用程序&#xff0c;这些模块通过队列相互交互。 从那时起&#xff0c;许多&#xff08;前&#xff09;ThoughtWorks专家讨论了微服务。 首先是 Fred George&#xff0c; 然后是 J…

QueryString加密

有些人不想由URL暴露一些訊息&#xff0c;除了可以使用URL Rewrite之外&#xff0c;其實簡便一點的方法還有使用編碼or加密來達到偽裝的目的。使用Base64的原因是因為他的編碼不會有難以接受的特殊字元(註1)&#xff0c;你也可以用其他的編碼or加密算法替代(註2)。其實這邊已經…

即时大数据流处理=即时风暴

在Ubuntu背后的公司Canonical&#xff0c;每6个月进行一次技术工作&#xff0c;以第一手测试我们的工具并向其他人展示新想法。 这次&#xff0c;我创建了一个即时大数据解决方案&#xff0c;更具体地讲是“即时风暴”。 Storm现在是Apache基金会的一部分&#xff0c;但以前St…

webstorm中vue项目--运行配制

## npm搭建的项目&#xff0c;需要运行npm run dev来启动 webstorm作为一款优秀的编辑器&#xff0c;通过配置运行设置&#xff0c;达到一键运行 1.添加node.js配置 2.configuration->node interpreter : 路径/node.exe 3.configuration->working directory&#xff1a; …

VS2010 自动化整理代码(1)--- VS正则表达替换 PK Vim

自从开始在VS2010的IDE中开始用正则表达式修改 最近为了给Fortran找个好一点的编辑器&#xff0c;又开始使用Vim了。Vim是久负盛名的编辑器之神&#xff0c;可我们习惯了Visual Studio的智能提示等方便的操作&#xff0c;就总在琢磨要是VS 1. VS正则表达替换 PK Vim 这是善用…

2019.7.16考试总结

对于这个狗屎成绩我不想说什么&#xff0c;&#xff0c;&#xff0c;&#xff0c;&#xff0c;前两次考炸也就算了&#xff0c;主要因为不会&#xff0c;这次考成这狗屎&#xff0c;是因为手残眼瘸大脑间歇性抽搐 T1&#xff1a;我是菜鸡&#xff0c;我是蒟蒻&#xff0c;我好菜…

PrimeFaces Extensions中的全新JSF组件

PrimeFaces扩展团队很高兴宣布即将推出的3.0.0主要版本的几个新组件。 我们的新提交人Francesco Strazzullo为该项目提供了“ Turbo Boost”&#xff0c;并带来了至少6个已成功集成的 JSF组件&#xff01; 当前的开发状态是OpenShift上的deployet – 请查看展示柜。以下是有关添…

15 个最新的 CSS3 教程

1. 创建一个漂亮的图标 这个教程将教你如何用纯CSS3创建一个图中的图标2. CSS3 图片样式 这个教程将教你如何使用 box-shadow, border-radius和transition。3. CSS3 Transition 的模糊效果4. 实用的CSS3圆角表格5. 创建纯CSS3的票式标签6. 原始的鼠标浮动效果 这个教程将创建缩…

C++内存管理——指针数组

C/C程序中&#xff0c;指针和数组在不少地方可以相互替换着用&#xff0c;让人产生一种错觉&#xff0c;以为两者是等价的。但二者有着本质的区别&#xff1a;数组&#xff1a;要么在静态存储区被创建(如全局数组)&#xff0c;要么在栈上被创建。数组名对应着&#xff08;而不是…

flex弹性盒子

注意事项 1.设为Flex布局之后&#xff0c;子元素的float&#xff0c;clear和vertical-align属性都讲失效 2.采用Flex布局的元素&#xff0c;称为Flex容器&#xff08;Flex container&#xff09;&#xff0c;所有的子元素成为容器成员&#xff0c;称为Flex项目&#xff08;Fle…

开始JBoss BPM流程的3种基本方法

这一集提示和技巧将帮助您了解根据需要启动流程实例的最佳方法。 规划项目可能包括流程项目&#xff0c;但是您是否考虑过可以启动流程的各种方式&#xff1f; 也许您的JBoss BPM Suite在您的体系结构中本地运行&#xff0c;也许您在云中运行&#xff0c;但是无论它在哪里&am…