Ajax實現原理詳解

Ajax:Asynchronous javascript and xml,實現了客戶端與服務器進行數據交流過程。使用技術的好處是:不用頁面刷新,并且在等待頁面傳輸數據的同時可以進行其他操作。

?? 這就是異步調用的很好體現。首先得了解什么是異步和同步的概念。

?? 舉個例子:比如你去圖書館借某種書,可惜圖書館此書被借完。這時可以采用兩種做法。

第一種做法:在圖書館一直等待,直到有人還書,然后再去吃飯睡覺。

第二種做法:直接跟圖書館管理員約定,若是有人還書,直接通知你。你則該忙什么忙什么。到時候會通知你。

而第一種做法就是同步的表現,必須等待別人還書(等待服務器返回信息)才進行其他事情,至死方休。

而第二種做法就是異步的表現,不耽誤時間,合理利用時間高效率做事。

遇到這種情況,你會采用那種辦法呢?

選擇第一種,哈哈,說明你太執著啦;選擇第二種,說明你靈活變通,合理安排自己的人生。你自己看著辦吧。

? 那Ajax是如何從瀏覽器發送Http請求到服務器呢?

? 這就得使用一個重要的對象XMLHttpRequest。

? 那首先了解一下XMLHttpRequest對象的屬性和方法。

? 主要的屬性:

readyState屬性有五個狀態值。

0:是uninitialized,未初始化。已經創建了XMLHttpRequest對象但是未初始化。
1:是loading,send for request but not called .已經開始準備好要發送了。
2:是loaded, send called,headers and status are available。已經發送,但是還沒有收到響應。
3:是interactive,downloading response,but responseText only partial set.正在接受響應,但是還不完整。
4:是completed,finish downloading.接受響應完畢。
responseText:服務器返回的響應文本。只有當readyState>=3的時候才有值,根據readyState的狀態值,可以知道,當readyState=3,返回的響應文本不完整,只有readyState=4,完全返回,才能接受全部的響應文本。

responseXML:response? as Dom Document object。響應信息是xml,可以解析為Dom對象。

status:服務器的Http狀態碼,若是200,則表示OK,404,表示為未找到。

statusText:服務器http狀態碼的文本。比如OK,Not Found。

? 主要的方法:

open(method,url,boolean):打開XMLHttpRequest對象。其中method方法有get,post,delete,put。若是查數據,從服務器中得到一定的數據,則使用get。若是直接提交到服務器中,更新一定的數據,則使用post;url是請求資源的地址。第三個參數表示是否使用異步。默認情況是true,因為Ajax的特點就是異步傳送。若使用同步則false。異步和同步上述已經舉例。

send(body):發送請求Ajax引擎,讓Ajax引擎操作。其中發送的內容可以是需要的參數,若是沒有參數,直接send(null)

? 那如何使用Ajax技術?

首先,有客戶端事件觸發Ajax事件。

然后,創建xmlHttpRequest對象,根據瀏覽器不同,創建的xmlHttpRequest對象不同。用open調用,用send發送請求給Ajax引擎。

最后,執行完畢后,把結果返回給客戶端。

? 執行的流程如下:\

?

測試代碼如下:

???? 創建xmlHttpRequest對象:

???? function createXMLHttpRequest() {

//表示當前瀏覽器不是ie,如ns,firefox

if(window.XMLHttpRequest) {//關于這個解釋請看本篇文章最底下

xmlHttp = new XMLHttpRequest();

} else if (window.ActiveXObject) {

xmlHttp = new ActiveXObject("Microsoft.XMLHTTP");

}

??? }

???? 客戶端事件觸發:?????

???????? function validate(field){

?????????? if(trim(field.value).length!=0)

????????? {

?//創建XMLHttpRequest

?createXMLHttpRequest() ;

?var url="user_validate.jsp?userId=" + trim(field.value)+"&timestampt="+new Date().getTime();

?// alert(url);

?xmlHttp.open("GET", url, true);

?//方法地址。處理完成后自動調用,回調。

?xmlHttp.onreadystatechange=callback ;

?xmlHttp.send(null);//將參數發送到Ajax引擎

?} else{ document.getElementById("userIdSpan").innerHTML = "";??? }???????

? }

結果返回操作:

function callback(){

?{???????

?alert(xmlHttp.readyState);

?

?if(xmlHttp.readyState==4){ //Ajax引擎初始化

?if(xmlHttp.status==200){ //http協議成功

?//alert(xmlHttp.responseText);

?document.getElementById("userIdSpan").innerHTML = "<font color='red'>" + xmlHttp.responseText + "</font>";

?}else

??????????? {

???????????? alert("請求失敗,錯誤碼="+xmlHttp.status);

??????????? }????????????????

?}

?}

注意:

????? onreadyStateChange事件,當readyState狀態值發生改變就會觸發此事件。

????? 其中,xmlHttpRequest提交http請求的過程中,readyState歷經五個狀態值(0,1,2,3,4),所以callback函數中的alert(xmlHttp.readyState)則會不斷輸出1,2,3,4。其中0狀態不會輸出,因為0狀態的時候并不執行此事件。

?????? ps:當時在eslipse默認web?瀏覽器中輸出的readyState狀態順序一直是:1,3,4,2。當時很糾結,因為狀態值含義的分析,結果應該是1,2,3,4。后來折騰半天,才發現是瀏覽器的問題。不同的瀏覽器,執行的結果是不同的。使用IE瀏覽器測試,結果是1,2,3,4。哈哈,真的只有想不到,沒有搜不到的。

?

附加內容:

if (window.XMLHttpRequest){。。。。。。}是什么意思?

    在JS里,window是最頂級對象(除了Object,Function...那些之外),它代表了一個窗體。而window.XMLHttpRequest代表的是window的一個屬性。
這個是用來區分瀏覽器的,因為在firefox,opera,safiar,IE7.0,IE8.0(我所知道的window對象有這個屬性的瀏覽器)這些瀏覽器中,window是有
XMLHttpRequest這個屬性的,而IE6.0,5.5都是沒有的,IE6.0或5.5是沒有這個屬性的,使用window.ActiveXObject替代。當然前者和后者的
XMLHttpRequest對象生成方式也是不一樣的。

轉載于:https://www.cnblogs.com/tzz-ing/p/5700377.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/457546.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/457546.shtml
英文地址,請注明出處:http://en.pswp.cn/news/457546.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

SpringJDBC解析3-回調函數(update為例)

PreparedStatementCallback作為一個接口&#xff0c;其中只有一個函數doInPrepatedStatement&#xff0c;這個函數是用于調用通用方法execute的時候無法處理的一些個性化處理方法&#xff0c;在update中的函數實現&#xff1a; protected int update(final PreparedStatementCr…

python上下文管理器

DAY 23. python上下文管理器 Python 的 with 語句支持通過上下文管理器所定義的運行時上下文這一概念。 此對象的實現使用了一對專門方法&#xff0c;允許用戶自定義類來定義運行時上下文&#xff0c;在語句體被執行前進入該上下文&#xff0c;并在語句執行完畢時退出該上下文&…

勾股定理python思路_趣叮咚編程數學揭秘:為什么勾股定理a+b=c?

我們都知道&#xff1a;三角形3個外角之和360度可是誰知道為什么等于360度呢&#xff1f;其實利用編程制作動圖演繹了解啦&#xff1a;那勾股定理abc又是為什么呢&#xff1f;還有很多有趣的數學公式都可以演繹&#xff1a;圓的面積公式、圓周長...通過動圖演繹原來晦澀難懂的定…

System.InvalidOperationException : 不應有 Response xmlns=''。

xml如下&#xff1a; <?xml version"1.0" encoding"UTF-8"?> <Response version"2"><datacash_reference>4700203048783633</datacash_reference><information>Failed to identify the card scheme of the supp…

Navicat Premium連接SQL Server

Navicat Premium連接SQL Server 步驟&#xff1a; 激活SQL Server 服務配置SQL Server網絡配置連接SQL Server 激活SQLServer服務 直接搜索 計算機管理 點 服務和應用程序&#xff0c; 點 SQL Server配置管理器&#xff0c; 雙擊第一個SQL Server服務 不出意外的話&#xf…

mysql 單標遞歸_MySql8 WITH RECURSIVE遞歸查詢父子集的方法

背景開發過程中遇到類似評論的功能是&#xff0c;需要時用查詢所有評論的子集。不同數據庫中實現方式也不同&#xff0c;本文使用Mysql數據庫&#xff0c;版本為8.0Oracle數據庫中可使用START [Param] CONNECT BY PRIORMysql 中需要使用 WITH RECURSIVE需求找到name為張三的孩子…

processon完全裝逼指南

一、引言 作為一名IT從業者&#xff0c;不僅要有扎實的知識儲備&#xff0c;出色的業務能力&#xff0c;還需要具備一定的軟實力。軟實力體現在具體事務的處理能力&#xff0c;包括溝通&#xff0c;協作&#xff0c;團隊領導&#xff0c;問題的解決方案等&#xff0c;這些能力在…

mysql在空閑8小時之后會斷開連接(默認情況)

調試程序的過程發現&#xff0c;在mysql連接空閑一定時間&#xff08;默認8小時&#xff09;之后會斷開連接&#xff0c;需要重新連接&#xff0c;也引發我對重連機制的思考。轉載于:https://www.cnblogs.com/ppzbty/p/5707576.html

selector多路復用_多路復用器Selector

Unix系統有五種IO模型分別是阻塞IO(blocking IO)&#xff0c;非阻塞IO( non-blocking IO)&#xff0c;IO多路復用(IO multiplexing)&#xff0c;信號驅動(SIGIO/Signal IO)和異步IO(Asynchronous IO)。而IO多路復用通常有select&#xff0c;poll&#xff0c;epoll&#xff0c;k…

解決svn log顯示no author,no date的方法之一

只要把svnserve.conf中的anon-access read 的read 改為none&#xff0c;也不需要重啟svnserve就行 sh-4.1# grep "none" /var/www/html/svn/pro/conf/svnserve.conf ### and "none". The sample settings below are the defaults. anon-access none轉載…

REST framework 權限管理源碼分析

REST framework 權限管理源碼分析 同認證一樣&#xff0c;dispatch()作為入口&#xff0c;從self.initial(request, *args, **kwargs)進入initial() def initial(self, request, *args, **kwargs):# .......# 用戶認證self.perform_authentication(request)# 權限控制self.che…

解決larave-dompdf中文字體顯示問題

0、使用MPDF dompdf個人感覺沒有那么好用&#xff0c;最終的生產環境使用的是MPDF&#xff0c;github上有文檔說明。如果你堅持使用&#xff0c;下面是解決辦法。可以明確的說&#xff0c;中文亂碼是可以解決的。 1、安裝laravel-dompdf依賴。 Packagist&#xff1a;https://pa…

mfc程序轉化為qt_小峰的QT學習筆記

我的專業是輸電線路&#xff0c;上個學期&#xff0c;我們開了一門架空線路設計基礎的課&#xff0c;當時有一個大作業是計算線路的比載&#xff0c;臨界檔距&#xff0c;弧垂最低點和安裝曲線。恰逢一門結課考試結束&#xff0c;大作業ddl快到&#xff0c;我和另外兩個同專業的…

MS SQL的存儲過程

-- -- Author: -- Create date: 2016-07-01 -- Description: 注冊信息 -- ALTER PROCEDURE [dbo].[sp_MebUser_Register]( UserType INT, MobileNumber VARCHAR(11), MobileCode VARCHAR(50), LoginPwd VARCHAR(50), PayPwd VARCHAR(50), PlateNumber VARCHAR(20), UserTr…

mysql 中 all any some 用法

-- 建表語句 CREATE TABLE score(id INT PRIMARY KEY AUTO_INCREMENT,NAME VARCHAR(20),SUBJECT VARCHAR(20),score INT);-- 添加數據 INSERT INTO score VALUES (NULL,張三,語文,81), (NULL,張三,數學,75), (NULL,李四,語文,76), (NULL,李四,數學,90), (NULL,王五,語文,81), (…

REST framework 用戶認證源碼

REST 用戶認證源碼 在Django中&#xff0c;從URL調度器中過來的HTTPRequest會傳遞給disatch(),使用REST后也一樣 # REST的dispatch def dispatch(self, request, *args, **kwargs):""".dispatch() is pretty much the same as Djangos regular dispatch,but w…

scrapyd部署_如何通過 Scrapyd + ScrapydWeb 簡單高效地部署和監控分布式爬蟲項目

來自 Scrapy 官方賬號的推薦需求分析初級用戶&#xff1a;只有一臺開發主機能夠通過 Scrapyd-client 打包和部署 Scrapy 爬蟲項目&#xff0c;以及通過 Scrapyd JSON API 來控制爬蟲&#xff0c;感覺 命令行操作太麻煩 &#xff0c;希望能夠通過瀏覽器直接部署和運行項目專業用…

最長上升子序列 (LIS算法(nlong(n)))

設 A[t]表示序列中的第t個數&#xff0c;F[t]表示從1到t這一段中以t結尾的最長上升子序列的長度&#xff0c;初始時設F [t] 0(t 1, 2, ..., len(A))。則有動態規劃方程&#xff1a;F[t] max{1, F[j] 1} (j 1, 2, ..., t - 1, 且A[j] < A[t])。 現在&#xff0c;我們仔細…

牛頓插值--python實現

from tabulate import tabulate import sympy""" 牛頓插值法 """class NewtonInterpolation:def __init__(self, x: list, y: list):self.Xi = xself

css搖曳的_HTML5+CSS3實現樹被風吹動搖晃

1新建html文檔。2書寫hmtl代碼。3書寫css代碼。.trunk, .trunk div { background: #136086; width: 100px; height: 10px; position: absolute; left: 50%; top: 70%; margin-left: -10px; -webkit-animation-name: rot; animation-name: rot; -webkit-animation-duration: 2.0…