摘要:簡介業務做一個在線投票,給歌手投票。提交到當前頁面的中達到效果。用戶名密碼注冊總結在不使用對象的情況下,依然可以用來實現對后臺服務器的請求,同時不帶來頁面刷新或者跳轉。
ajax 簡介
業務:
做一個在線投票,給歌手投票。
要求:無刷新,并且不允許使用XMLHttpRequest對象.
分析:在XHR對象,沒有流行之前,已經有了“無刷新”這種效果的方法.
從http角度看,可以利用204 No content 狀態碼的特性
可以使用iframe
利用圖片加載的特性
可以使用script
無刷新只是表面現象,本質上,是需要發送一個請求,把數據送到后臺.
業務需求:
AJAX注冊,提交表單,要求頁面無刷新.
利用iframe特性
iframe嵌入在當前頁面。
post提交到當前頁面的iframe中,達到ajax效果。
總結:
在不使用XMLHttpRequest對象的情況下,依然可以用js來實現對后臺服務器的請求,同時不帶來頁面刷新或者跳轉。
所謂AJAX:
即是指:頁面不刷新的情況下,利用XMLHttpRequest對象發送HTTP請求.或者JavaScript的網絡化.
AJAX文件上傳實現原理(HTTP協議+JS引擎)的角度:
分析:從HTTP協議的角度來看,則要把文件的內容發送到服務器.如果可以,說明XMLHttpRequest對象在POST數據時,把文件的內容也發送到服務器,---> XHR對象獲取了你要上傳的文件的內容. ---> JavaScript讀取了本地的文件內容. ---> 處于安全原因,JavaScript是不能夠讀取到本地文件內容.
因此:AJAX原理上是無法實現的.
利用偽AJAX方式來實現.
iframe來實現.
用flash實現。如:swfuploaded插件
HTML5實現。(HTML5增加了文件讀取API)
AJAX核心:XMLHttpRequest對象.
XML對象一個專門的HTTP請求的工具.
如何使用XMLHttpRequrest對象做AJAX請求?
分析:
如何實例化該對象.
如何請求后臺資源.
請求結果如何得到(雙向通信).
創建XML對象.
new XMLHttpRequest();
如何通過XHR發送請求?
分析HTTP協議,要請求需要明確因素?
根據請求行:
用什么方法來請求.
GET,POST,PUT,DELETE,HEAD
請求那個資源(URL)
同步方式
同步,異步
獲取返回信息
XHR對象本身有一些屬性,responseText,表示返回值.
xhr.responseText
使用異步,如何知道請求完成.
XHR對象在請求與響應的過程中,狀態會不斷變化(0-4)xhr.readyState,逐步變化. 可以綁定一個函數,監聽狀態變化,只要狀態發生變化,就觸發函數xhr.onreadystatechange
返回值類型不考慮HTML5最新的標準,返回值:普通文本/xml文檔.二種返回形式
XML文檔function createXHR() { var xhr = null; if ( window.ActiveXObject ) { xhr = new window.ActiveXObject(); } else if ( XMLHttpRequest ) { xhr = new XMLHttpRequest("Microsoft.XMLHTTP"); } return xhr; } // xml function test1() { var xhr = createXHR(); xhr.open("GET", "./returntype.php", true); xhr.onreadystatechange = function () { if ( this.readyState == 4 ) { var xmldom = this.responseXML; console.log( xmldom ); } } xhr.send(null); }普通文本
普通文本變通形式:
后臺返回大段的html代碼,直接innerHTML到前臺頁面.
json格式的普通文本.
返回簡短的標志字符串 如: 0, 1, ok.
function createXHR() { var xhr = null; if ( window.ActiveXObject ) { xhr = new window.ActiveXObject(); } else if ( XMLHttpRequest ) { xhr = new XMLHttpRequest("Microsoft.XMLHTTP"); } return xhr; } // 返回普通文本的html代碼字符串 function test2() { var xhr = createXHR(); xhr.open("GET", "./returnhtml.php", true); xhr.onreadystatechange = function () { if ( this.readyState == 4 ) { console.log( this.responseText ); } } xhr.send(null); } // json格式字符串對象 function test3() { var xhr = createXHR(); xhr.open("GET", "./returnjson.php", true); xhr.onreadystatechange = function () { if ( this.readyState == 4 ) { console.log( this.responseText ); } } xhr.send(null); }jsonp格式
jsonp是跨域解決的一種方式.
異步原理
readyState 狀態值:
通過插隊機制,把回調函數插入到當前已經執行代碼的前方。
HTML5與AJAX iframe撲捉表單提交動作(onsubmit)
創建一個iframe
把表單的target修改 指向 該 iframe
銷毀iframe
$("form").submit(function () { var upName = "up" + Math.random(); $("
$error = $_FILES["pic"]["error"] == 0 ? "success" : "fail"; sleep(2); if ( $error == 0 ) { echo ""; } else { echo "上傳失敗"; }FormData
進度條: 總大小, 已上傳大小
解決:在HTML5中,有一個"上傳過程"的事件(onprogress),事件中,可以讀取到當前兩個信息.
思路:在上傳過程中,不斷觸發函數,讀取(已上傳/總大小),更新頁面數據。
FormData使用注意
每個表單域必須有name屬性
不能設置setRequestHeaer頭
特殊符號無須編碼
在form標簽里無須設置enctype="multipart/form-data"屬性(即使有上傳文件域也不需要設置)
(無刷新上傳附件,FormData可以收集上的文件域信息)
AJAX對象-> upload -> onprogress
AJAX對象有成員屬性upload,是一個對象,該對象有一個onprogress屬性,該屬性是一個時間,該事件每間隔0.1秒執行一次,執行過程中會知道當前的附件上傳情況。(例如:文件上傳的總大小,目前已經上傳大小等信息)
/** * file文件上傳 */ function selfile() { // 創建FromData對象 var fd = new FormData(); // 獲取文件對象 var pic = document.getElementsByTagName("input")[0].files[0]; // 把獲取的文件對象追加到表單數據中. fd.append("pic", pic); // fd.pic = pic; // AJAX var xhr = new XMLHttpRequest(); xhr.open("POST", "upfile.php", true); xhr.onreadystatechange = function () { if ( xhr.readyState == 4 ) { document.getElementById("debug").innerHTML = xhr.responseText; } } xhr.upload.onprogress = function ( ev ) { // 長度是否可以計算. (區分:分塊上傳) if ( ev.lengthComputable ) { // 當前已經上傳多少/總共多少 var percent = 100 * ev.loaded / ev.total; document.getElementById("debug").innerHTML = "已經上傳:" + percent.toFixed(2); } } xhr.send(fd); }大文件切割上傳
Blob對象
while循環實現文件上傳
/** * 使用的API * file --> Blob * Blob有slice, 可以截取二進制對象的一部分. */ /** * 思路: * 截取10M,上傳 * 判斷文件是否截取完畢 * * while( 存在數據 ) { // 截取, 上傳 } */ /** * 上傳文件 */ function sendFile() { const LENGTH = 10 * 1024 * 1024; // 一次性截取長度 var start = 0; // 從哪里開始截取 var end = start + LENGTH // 到哪邊截至 var blob = new Blob(); var fd = null; // XHR對象 var xhr = null; // 獲取總的文件大小 var pic = document.getElementById("pic").files[0]; var totalSize = pic.size; var percent = 0; while ( start < totalSize ) { // 截取文件 blob = pic.slice(start, end); fd = new FormData(); // fd.append("part", blob); fd.part = blob; // xml對象 xhr = new XMLHttpRequest(); xhr.open("POST", "sliceup.php", true); xhr.upload.onprogress = function ( ev ) { } // 發送請求 xhr.send(fd); start = end; end = start + LENGTH; percent += 100 * end / totalSize; if ( percent > 100 ) { percent = 100; } document.getElementById("msg").style.width = percent + "%"; } }
定時器實現切割上傳
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/22185.html
閱讀 1357·2021-11-22 15:25
閱讀 3350·2021-10-21 09:38
閱讀 1563·2021-10-19 13:21
閱讀 992·2021-09-06 15:00
閱讀 1674·2019-08-30 15:44
閱讀 2577·2019-08-29 15:40
閱讀 3432·2019-08-29 13:44
閱讀 2024·2019-08-26 16:56