jquery 中封装了ajax,使得我们可以十分便捷的使用ajax,
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<link rel="stylesheet" href="/static/bootstrap.css">
</head>
<body>
<h1>ajax</h1>
<a class="btn btn-info" onclick="AjaxSubmin1()">Jquery-点我</a>
<script src="/static/jquery-3.3.1.min.js"></script>
<script>
function AjaxSubmin1() {
$.ajax({
url: '/ajax.html',
type: "get",
data: {'a':1},
success:function (arg) {
console.log(arg);
}
})
};
</script>
</body>
</html>
而原生的ajax,也必须要学会使用,对吧,,下面这个是ajax发送get请求,
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<link rel="stylesheet" href="/static/bootstrap.css">
</head>
<body>
<h1>ajax</h1>
<a class="btn btn-primary" onclick="AjaxSubmin2()">原生ajax-点我</a>
function AjaxSubmin2() {
var xhr = new XMLHttpRequest(); // new 为建立一个对象
xhr.onreadystatechange = function () {
if(xhr.readyState == 4){ // 检测状态,如果为4,就意味着接收完毕服务器返回的数据
console.log(xhr.responseText)
}
};
xhr.open('get','/ajax.html?a=1'); // 在这里我们只能手动添加数据的路径
xhr.send(null);
}
</script>
</body>
</html>
jquery ajax 的 post 发送数据
function AjaxSubmin1() {
$.ajax({
url: '/ajax.html/', // 这里相对于get方式路径后需要多加一个 /
type: "post",
data: {'a':1},
success:function (arg) {
console.log(arg);
}
})
};
原生 ajax 的 post 方式
function AjaxSubmin2() {
var xhr = new XMLHttpRequest();
xhr.onreadystatechange = function () {
if(xhr.readyState == 4){
console.log(xhr.responseText)
}
};
xhr.open('post','/ajax.html/'); // 这里的路径后也必须添加一个 /
// 这里必须添加一个请求头,要不然django识别不出请求头就不会去请求体中提取数据,
// 也就是说不添加请求头数据也是可以发送过去的,只是django不能识别,发送的数据放在 request.body 中
xhr.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded; charset-UTF-8');
xhr.send("a=1");
}
iframe 挺有意思的,
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<link rel="stylesheet" href="/static/bootstrap.css">
</head>
<body>
<h1>ajax</h1>
<div>
<input id="url" type="text" placeholder="请输入URL"><a onclick="test1()">查看</a>
</div>
<iframe id="iframe" src="http://www.baidu.com" frameborder="0" style="width: 600px;height: 800px;"></iframe>
<script src="/static/jquery-3.3.1.min.js"></script>
<script>
function test1() {
url = $("#url").val();
$("#iframe").attr("src",url);
}
</script>
</body>
</html>

iframe 可以嵌套两层,之后就不行了。
iframe 和 form 表单可以构成伪ajax,(利用 iframe 的页面不刷新特性,和 form 提交数据的功能),target 和 name 是关键点。
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<link rel="stylesheet" href="/static/bootstrap.css">
</head>
<body>
<h1>伪ajax</h1>
<form action="/ajax.html/" method="post" id="fm" target="iframe">
<input type="text" value="libai" name="user">
<a onclick="test()">提交</a>
</form>
<iframe name="iframe"></iframe>
<script>
function test() {
document.getElementById("fm").submit();
}
</script>
</body>
</html>
form 提交后返回的数据会显示在 iframe 中,这种方式是兼容性最好的,很多网站上传文件都是通过这种方式做的,iframe 历史悠久,所以很多浏览器都支持,效果也好

利用 iframe 和 form 表单提交,我们要如何去取得 iframe 中的数据呢,什么时候去取呢,在 iframe 接收到数据,也就是 iframe 加载的时候去取就行了
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<link rel="stylesheet" href="/static/bootstrap.css">
</head>
<body>
<h1>伪ajax</h1>
<form action="/ajax.html/" method="post" id="fm" target="iframe">
<input type="text" value="libai" name="user">
<a onclick="test()">提交</a>
</form>
<iframe name="iframe" onload="onloadtest(this)" id="ifr"></iframe>
<script src="/static/jquery-3.3.1.min.js"></script>
<script>
function test() {
document.getElementById("fm").submit();
}
function onloadtest(that) {
console.log(that.contentWindow.document.body.innerHTML); // js 取得数据
console.log($(that).contents().find('body').html()); // jquery 取得iframe数据
}
</script>
</body>
</html>
# 这个方法会报错,在第一次加载页面时,会提示 onloadtest()方法找不到,因为整个html都是
# 从上到下加载的,自然而然就找不到了,我们可以用另外绑定函数的方式来解决
# 要十分注意是如何传递 this 参数的
用绑定函数的方式,
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<link rel="stylesheet" href="/static/bootstrap.css">
</head>
<body>
<h1>伪ajax</h1>
<form action="/ajax.html/" method="post" id="fm" target="iframe">
<input type="text" value="libai" name="user">
<a onclick="test()">提交</a>
</form>
<iframe name="iframe" id="ifr"></iframe>
<script src="/static/jquery-3.3.1.min.js"></script>
<script>
function test() {
document.getElementById(("ifr")).onload = onloadtest; // 按下按钮时为iframe绑定
document.getElementById("fm").submit();
}
function onloadtest() {
console.log(this.contentWindow.document.body.innerHTML);
console.log($(this).contents().find('body').html());
}
</script>
</body>
</html>
iframe 和 form 的 伪 ajax 提交方式,post 和 get 只需要修改 form 中的 type 就行了,其他的都一样。
ajax 和 js 上传文件
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<link rel="stylesheet" href="/static/bootstrap.css">
</head>
<body>
<h1>文件上传</h1>
<input type="file" id="img">
<a onclick="test1()" class="btn btn-primary">jquery 上传</a>
<a onclick="test2()" class="btn btn-danger">js 上传</a>
<script src="/static/jquery-3.3.1.min.js"></script>
<script>
function test1() {
var data = new FormData();
data.append('k1','v1');
data.append('k2','v2');
data.append('k3',document.getElementById(("img")).files[0]);
$.ajax({
url: "/ajax.html/",
type: "POST",
data: data,
processData: false, // tell jQuery not to process the data
contentType: false, // tell jQuery not to set contentType
success:function (arg) {
console.log(arg);
}
})
}
function test2() {
var data = new FormData();
data.append('k1','v1');
data.append('k2','v2');
data.append('k3',document.getElementById(("img")).files[0]);
var xhr = new XMLHttpRequest();
xhr.onreadystatechange = function () {
if(xhr.readyState==4){
// 接收完毕服务器返回的数据
console.log(xhr.responseText)
}
};
xhr.open("POST","/ajax.html/"); // 这里不用再设置 setHeader
xhr.send(data);
}
</script>
</body>
</html>
iframe 和 form 上传文件
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<link rel="stylesheet" href="/static/bootstrap.css">
</head>
<body>
<h1>文件上传</h1>
<form action="/ajax.html/" method="post" id="fm" target="iframe" enctype="multipart/form-data">
<input type="text" name="k1">
<input type="text" name="k2">
<input type="file" name="k3">
<a onclick="test()">提交</a>
</form>
<iframe name="iframe" id="ifr"></iframe>
<script src="/static/jquery-3.3.1.min.js"></script>
<script>
function test() {
document.getElementById(("ifr")).onload = onloadtest; // 按下按钮时为iframe绑定
document.getElementById("fm").submit();
}
function onloadtest() {
console.log($(this).contents().find('body').html());
}
</script>
</body>
</html>

iframe 的框可以设置为 display:none ,就隐藏了
上传文件,并在服务器端保存,保存完毕后在网页上显示出来。
# views.py 文件
from django.shortcuts import render
from django.shortcuts import HttpResponse
import json
import os
import uuid
def index(request):
if request.method == "GET":
return render(request, "index.html")
def upload(request):
nid = uuid.uuid4()
result = {'status':True,"data":None}
img = request.FILES.get("img")
print(img.name)
base_dir = os.path.join("static",str(nid)+img.name)
f = open(base_dir,"wb")
for line in img.chunks():
f.write(line)
f.close()
print(base_dir)
result["data"] = '\\' + base_dir
return HttpResponse(json.dumps(result))
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>文件上传</title>
</head>
<body>
<form action="/upload.html/" method="post" id="fm" target="iframe" enctype="multipart/form-data">
<input type="file" name="img" onchange="test()">
</form>
<iframe name="iframe" id="ifr" style="display: none"></iframe>
<h3>预览</h3>
<div id="preview"></div>
<script src="/static/jquery-3.3.1.min.js"></script>
<script>
function test() {
document.getElementById(("ifr")).onload = onloadtest; // 按下按钮时为iframe绑定
document.getElementById("fm").submit();
}
function onloadtest() {
var response = $(this).contents().find('body').html();
response = JSON.parse(response);
console.log(response);
console.log(response.data);
var image = $("<img>");
image.attr("src",response['data']);
$("#preview").empty().append(image)
}
</script>
</body>
</html>

jsonp,跨域请求,利用script可以跨域的特性实现跨域交流。
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<input type="submit" value="发送1" onclick="test1()">
<input type="submit" value="发送2" onclick="test2()">
<div id="preview"></div>
<script src="/static/jquery-3.3.1.min.js"></script>
<script>
function test1() {
$.ajax({
url: "/ajax.html",
type: 'GET',
data: {bbc: 222},
success: function (arg) {
{# console.log(arg);#}
var p_ele = $("<p>");
p_ele.html(arg);
$("#preview").append(p_ele);
}
})
}
function test2() {
var tag = $("<script>");
tag.attr('src','http://127.0.0.1:9000/jsonp.html');
document.head.appendChild(tag[0]);
document.head.removeChild(tag[0]);
};
function func(arg) { # 这里的 func 要和返回的一致,arg为返回的数据,也就是 anthor server
var p_ele = $("<p>");
p_ele.html(arg);
$("#preview").append(p_ele);
}
</script>
</body>
</html>
# 我在 9000 端口上运行了另一个 django ,相对应的视图函数为
def jsonp(request):
return HttpResponse("func('anthor server');")

在jquery上,也为我们做好了封装,看下面的
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<input type="submit" value="发送1">
<input type="submit" value="发送2" onclick="test2()">
<div id="preview"></div>
<script src="/static/jquery-3.3.1.min.js"></script>
<script>
function test2() {
$.ajax({
url: "http://127.0.0.1:9000/jsonp.html",
type: 'GET',
dataType: 'jsonp', // 不同于json,这里封装了创建script标签并移除的代码,
}) // 效果也是一样的
}
function func(arg) {
var p_ele = $("<p>");
p_ele.html(arg);
$("#preview").append(p_ele);
}
</script>
</body>
</html>

note
提交:
- Form
- Ajax
一、Ajax,偷偷向后台发请求
- XMLHttpRequest
- 手动使用
- jQuery
- “伪”Ajax
- iframe标签
- form表单
二、Ajax上传文件
- jQuery
- 原生
以上两种方式可利用formData对象,来封装用户提交的数据,但是formData并不是所有浏览器都支持,
还是兼容性的问题,(考虑到低版本的IE)
- Iframe+Form 兼容性最好的方式
******Iframe+Form*******
三、JSONP 跨域Ajax
浏览器同源策略:XMLHttpRequest
巧妙的机制JSONP
JSONP:是一种方式,并非数据结构,返回数据时有条件限制,
利用创建script块,在其中执行src属性为:远程url
返回--函数(返回值)
function 函数(arg){
}
jsonp 只能发get请求,不管怎么写,都是get方式
注意:CORS ,跨站资源共享
参考博客:http://www.cnblogs.com/wupeiqi/articles/5703697.html
http://www.cnblogs.com/wupeiqi/articles/5702910.html
网友评论