您好,登錄后才能下訂單哦!
jquery是對Ajax的一個封裝,真正的操作是封裝里面的內(nèi)容(基于內(nèi)部調(diào)用原生的Ajax的XMLHTTPRequest)
Ajax還有一種是偽造ajax,所為偽造就是不用XMLHTTPRequest,利用的瀏覽器的一種技術(shù)實(shí)現(xiàn)的
XmlHttpRequest對象的主要方法:
void open(String method,String url,Boolen async)
用于創(chuàng)建請求
參數(shù):
method: 請求方式(字符串類型),如:POST、GET、DELETE...
url: 要請求的地址(字符串類型)
async: 是否異步(布爾類型)
b. void send(String body)
用于發(fā)送請求
參數(shù):
body: 要發(fā)送的數(shù)據(jù)(字符串類型)
c. void setRequestHeader(String header,String value)
用于設(shè)置請求頭
參數(shù):
header: 請求頭的key(字符串類型)
vlaue: 請求頭的value(字符串類型)
d. String getAllResponseHeaders()
獲取所有響應(yīng)頭
返回值:
響應(yīng)頭數(shù)據(jù)(字符串類型)
e. String getResponseHeader(String header)
獲取響應(yīng)頭中指定header的值
參數(shù):
header: 響應(yīng)頭的key(字符串類型)
返回值:
響應(yīng)頭中指定的header對應(yīng)的值
f. void abort()
終止請求
發(fā)送
監(jiān)聽狀態(tài)
<body>
<input type="text" id="i1"> + <input type="text" id="i2"> = <input type="text" id="i3">
<input type="button" value="原生提交ajax" onclick="addajax();">
<script>
function addajax() {
var xhr = new XMLHttpRequest();
xhr.onreadystatechange=function () {
if(xhr.readyState==4){
alert(xhr.responseText)
}
}
xhr.open('GET','/add/?i1=11&i2=13');
xhr.send();
}
</script>
</body>
上面的內(nèi)容是在body里面,后臺request.post里面是沒有數(shù)據(jù)的,要有需要添加請求頭如下圖:
XmlHttpRequest對象的主要屬性:
a. Number readyState
狀態(tài)值(整數(shù))
詳細(xì):
0-未初始化,尚未調(diào)用open()方法;
1-啟動,調(diào)用了open()方法,未調(diào)用send()方法;
2-發(fā)送,已經(jīng)調(diào)用了send()方法,未接收到響應(yīng);
3-接收,已經(jīng)接收到部分響應(yīng)數(shù)據(jù);
4-完成,已經(jīng)接收到全部響應(yīng)數(shù)據(jù);
b. Function onreadystatechange
當(dāng)readyState的值改變時自動觸發(fā)執(zhí)行其對應(yīng)的函數(shù)(回調(diào)函數(shù))
c. String responseText
服務(wù)器返回的數(shù)據(jù)(字符串類型)
d. XmlDocument responseXML
服務(wù)器返回的數(shù)據(jù)(Xml對象)
e. Number states
狀態(tài)碼(整數(shù)),如:200、404...
f. String statesText
狀態(tài)文本(字符串),如:OK、NotFound...
iframe是可以偽造的,不會刷新。結(jié)合form來提交數(shù)據(jù)
填寫回調(diào)函數(shù)
返回來的是放在了iframe里面。如果iframe里面有內(nèi)容了,說明有返回了。通過onload函數(shù)來加載
取值是不一樣的,因?yàn)橛袃蓚€document,需要進(jìn)入這個對象里面
最終的偽造ajax
views代碼
def upload(request):
if request.method == "GET":
return render(request,'upload.html')
else:
import os
file_obj = request.FILES.get('wenjian')
print(file_obj.name)
file_path = os.path.join('static',file_obj.name)
with open(file_path,'wb') as f:
for chun in file_obj.chunks():
f.write(chun)
return HttpResponse(file_path)
html代碼
<body>
<input type="file" id="i1">
<a onclick="uploadajax();">上傳</a>
<div id="con"></div>
<script>
function uploadajax() {
var formData = new FormData();//依賴formData這個對象
formData.append('k1','v1');//通過append來給formData添加數(shù)據(jù)
formData.append('wenjian',document.getElementById('i1').files[0]);//這里通過id得到的結(jié)果是一個列表,所以可以通過0位置來取第一個值
var xhr = new XMLHttpRequest();
xhr.onreadystatechange=function () {
if(xhr.readyState == 4){
var file_path = xhr.responseText;
console.log(file_path)
var tag = document.createElement('img');
tag.src = "/" + file_path;
document.getElementById('con').appendChild(tag);
}
};
xhr.open('POST','/upload/');
xhr.send(formData)
}
</script>
</body>
結(jié)果:
function upload2(){
var formData = new FormData();
formData.append('k1','v1');
// formData.append('fafafa',document.getElementById('i1').files[0]);
formData.append('fafafa',$('#i2')[0].files[0]);
// $('#i2') -> $('#i2')[0]
// document.getElementById('i1') -> $(document.getElementById('i1'))
$.ajax({
url: '/upload/',
type: 'POST',
data: formData,
contentType:false,
processData:false,
success:function(arg){
var tag = document.createElement('img');
tag.src = "/"+ arg;
$('#container2').append(tag);
}
})
}
#偽造的方法是下面
<h2>偽 Ajax上傳文件</h2>
<form id="f1" method="POST" action="/upload/" target="ifr" enctype="multipart/form-data">
<iframe id="ifr" name="ifr" ></iframe>
<input type="file" name="fafafa" />
<a onclick="upload3();">上傳</a>
</form>
<div id="container3"></div>
function upload3(){
document.getElementById('ifr').onload = loadIframe;
document.getElementById('f1').submit();
}
function loadIframe(){
var content = document.getElementById('ifr').contentWindow.document.body.innerText;
var tag = document.createElement('img');
tag.src = "/"+ content;
$('#container3').append(tag);
}
上傳的按鈕好看是吧input type=file這個通過opcity來設(shè)置為透明度為0
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報,并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。