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,一经查实,立即删除!

相关文章

The Little Schemer-周而复始之Y组合子由来

什么是递归&#xff1f; (define length(lambda (l)(cond((null? l) 0)(else (add1 (length (cdr l)))))))以上是length函数的实现用递归的形式计算出数据集合l的长度。 如果没有define这种赋值操作我们怎么定义length函数&#xff1f;换句话说我们怎么使用匿名函数完成递归…

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

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

Django操作与内容

一、路由系统 1.如何实现伪静态 在cnblogs中&#xff1a;https://www.cnblogs.com/wangwei5979/p/11160708.html 而我们自己写的&#xff1a; http://127.0.0.1:8000/up_studnet/?id12同样是网页 为何cnblogs这样设计 原因&#xff1a; 1就是因为比较美观 2由于使用搜索引擎来…

监控 SQL Server 的运行状况

Microsoft SQL Server 2005 提供了一些工具来监控数据库。方法之一是动态管理视图。动态管理视图 (DMV) 和动态管理函数 (DMF) 返回的服务器状态信息可用于监控服务器实例的运行状况、诊断问题和优化性能。 常规服务器动态管理对象包括&#xff1a; dm_db_*&#xff1a;数据库和…

RFC2616-HTTP1.1-Header Field Definitions(头字段规定部分—单词注释版)

part of Hypertext Transfer Protocol -- HTTP/1.1RFC 2616 Fielding, et al. 14 Header Field Definitions(规定) This section(部分&#xff0c;章节) defines(规定定义) the syntax(语法) and semantics(语意) of all standard(标准) HTTP/1.1 header fields. For entity-…

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版本。 接着…

JavaScript与 HTML表单的交互过程,想要学习动态网页但是无从下手的新手看看。...

最近开始了 java web的学习在学习中学到了很多有用的东西 比如说 html 表单如何 和 javascript进行交互的 读完本篇文章后相信初学者会有一个 清晰的理解 。。。 对应下面的代码看我写的问题 。 其实表单的交互操作很简单 就是在 提交表单数据的时候调用一个 javascrip…

问题记录之前端路由系统

概要&#xff1a; 公司的一个项目中使用了根据路由配置生成对应的Route&#xff0c;而配置会存在一份在store中&#xff0c;当store中的RouteConfig变化时&#xff0c;会根据最新的配置来生成最新的试图。 因为路由配置系统实现上的一些缺陷本次需要对其就行性能上的一些优化…

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算法初窥03(搜索及去重算法)

前面我们了解了一些常用的排序算法&#xff0c;那么这篇文章我们来看看搜索算法的一些简单实现&#xff0c;我们先来介绍一个我们在实际工作中一定用到过的搜索算法——顺序搜索。 1、顺序搜索 其实顺序搜索十分简单&#xff0c;我们还是以第一篇文章写好的架子作为基础&#…

nginx try_files流程解析

前端部署单页应用时在nginx上经常用到try_files指令&#xff0c;而对于try_files并不知道其所以然&#xff0c;所以花时间整理总结如下。 Syntax: try_files file … uri; try_files file … code; Default: — Context: server, location 根据root和alias指令提供的值按照tr…

javascript中编码与解码的decodeURI()、decodeURIComponent()区别

1、 定义和用法 decodeURI() 函数可对 encodeURI() 函数编码过的 URI 进行解码。decodeURIComponent() 函数可对 encodeURIComponent() 函数编码的 URI 进行解码。 从W3C的定义和用法来看&#xff0c;两者没有什么区别&#xff0c;但是两者的参数是有区别的&#xff1a;decodeU…

vb 类模拟 引用

引用&#xff1a;http://wenku.baidu.com/view/f434ea26a5e9856a56126008.html Class1中 Option Explicit Public Sub test() Form1.TextForIpAddressAdd.Text "123"End Sub Form1中 Option Explicit Private test As New Class1 Private Sub Form_Load() 初始化 te…

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

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

如何自定义Hibernate脏检查机制

介绍 在上一篇文章中&#xff0c;我描述了Hibernate自动脏检查机制。 尽管您应该始终喜欢它&#xff0c;但是有时您可能想添加自己的自定义污垢检测策略。 自定义脏检查策略 Hibernate提供以下定制机制&#xff1a; 休眠拦截器#findDirty&#xff08;&#xff09; CustomEnt…

读vue【深入响应式系统】后整理

一直以来对vue的依赖自动追踪的原理很感兴趣&#xff0c;像魔法一样。对于交给vue的对象返回后&#xff0c;在哪里使用了这个返回的对象vue会自动追踪&#xff0c;等这个对象改变时vue会自动通知到之前使用改变量的方法&#xff0c;整个过程和react很不一样&#xff0c;react的…

萌新自我介绍

第一次用博客&#xff0c;多有不会&#xff0c;可能向各位大佬请教&#xff0c;谢谢&#xff01;&#xff01;&#xff01;&#xff01;转载于:https://www.cnblogs.com/fakerOrz/p/11194872.html