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發(fā)送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){ // 檢測狀態(tài),如果為4瘫拣,就意味著接收完畢服務器返回的數(shù)據(jù)
console.log(xhr.responseText)
}
};
xhr.open('get','/ajax.html?a=1'); // 在這里我們只能手動添加數(shù)據(jù)的路徑
xhr.send(null);
}
</script>
</body>
</html>
jquery ajax 的 post 發(fā)送數(shù)據(jù)
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識別不出請求頭就不會去請求體中提取數(shù)據(jù),
// 也就是說不添加請求頭數(shù)據(jù)也是可以發(fā)送過去的麸拄,只是django不能識別派昧,發(fā)送的數(shù)據(jù)放在 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 提交數(shù)據(jù)的功能)五慈,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 提交后返回的數(shù)據(jù)會顯示在 iframe 中主穗,這種方式是兼容性最好的泻拦,很多網(wǎng)站上傳文件都是通過這種方式做的,iframe 歷史悠久忽媒,所以很多瀏覽器都支持争拐,效果也好
利用 iframe 和 form 表單提交,我們要如何去取得 iframe 中的數(shù)據(jù)呢晦雨,什么時候去取呢架曹,在 iframe 接收到數(shù)據(jù),也就是 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 取得數(shù)據(jù)
console.log($(that).contents().find('body').html()); // jquery 取得iframe數(shù)據(jù)
}
</script>
</body>
</html>
# 這個方法會報錯金赦,在第一次加載頁面時音瓷,會提示 onloadtest()方法找不到,因為整個html都是
# 從上到下加載的夹抗,自然而然就找不到了绳慎,我們可以用另外綁定函數(shù)的方式來解決
# 要十分注意是如何傳遞 this 參數(shù)的
用綁定函數(shù)的方式,
<!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){
// 接收完畢服務器返回的數(shù)據(jù)
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 已脓,就隱藏了
上傳文件珊楼,并在服務器端保存,保存完畢后在網(wǎng)頁上顯示出來度液。
# 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可以跨域的特性實現(xiàn)跨域交流。
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<input type="submit" value="發(fā)送1" onclick="test1()">
<input type="submit" value="發(fā)送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為返回的數(shù)據(jù)曲聂,也就是 anthor server
var p_ele = $("<p>");
p_ele.html(arg);
$("#preview").append(p_ele);
}
</script>
</body>
</html>
# 我在 9000 端口上運行了另一個 django ,相對應的視圖函數(shù)為
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="發(fā)送1">
<input type="submit" value="發(fā)送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,這里封裝了創(chuàng)建script標簽并移除的代碼膜楷,
}) // 效果也是一樣的
}
function func(arg) {
var p_ele = $("<p>");
p_ele.html(arg);
$("#preview").append(p_ele);
}
</script>
</body>
</html>
note
提交:
- Form
- Ajax
一旭咽、Ajax,偷偷向后臺發(fā)請求
- XMLHttpRequest
- 手動使用
- jQuery
- “偽”Ajax
- iframe標簽
- form表單
二赌厅、Ajax上傳文件
- jQuery
- 原生
以上兩種方式可利用formData對象穷绵,來封裝用戶提交的數(shù)據(jù),但是formData并不是所有瀏覽器都支持,
還是兼容性的問題特愿,(考慮到低版本的IE)
- Iframe+Form 兼容性最好的方式
******Iframe+Form*******
三请垛、JSONP 跨域Ajax
瀏覽器同源策略:XMLHttpRequest
巧妙的機制JSONP
JSONP:是一種方式,并非數(shù)據(jù)結構洽议,返回數(shù)據(jù)時有條件限制,
利用創(chuàng)建script塊漫拭,在其中執(zhí)行src屬性為:遠程url
返回--函數(shù)(返回值)
function 函數(shù)(arg){
}
jsonp 只能發(fā)get請求亚兄,不管怎么寫,都是get方式
注意:CORS 采驻,跨站資源共享
參考博客:http://www.cnblogs.com/wupeiqi/articles/5703697.html
http://www.cnblogs.com/wupeiqi/articles/5702910.html