AJAX異步交互

?

?

什么是AJAX

AJAX(Asynchronous Javascript And XML)翻譯成中文就是“異步Javascript和XML”。即使用Javascript語言與服務器進行異步交互,傳輸的數據為XML(當然,傳輸的數據不只是XML)。

AJAX還有一個最大的特點就是,當服務器響應時,不用刷新整個瀏覽器頁面,而是可以局部刷新。這一特點給用戶的感受是在不知不覺中完成請求和響應過程,當請求發出后,瀏覽器還可以進行其他操作,無需等待服務器的響應

同步交互與異步交互

同步交互:客戶端發出一個請求后,需要等待服務器響應結束后,才能發出第二個請求;

異步交互:客戶端發出一個請求后,無需等待服務器響應結束,就可以發出第二個請求。

AJAX的優缺點

優點:

AJAX使用Javascript技術向服務器發送異步請求;

AJAX無須刷新整個頁面;

因為服務器響應內容不再是整個頁面,而是頁面中的局部,所以AJAX性能高;

缺點:

AJAX并不適合所有場景,很多時候還是要使用同步交互;

AJAX雖然提高了用戶體驗,但無形中向服務器發送的請求次數增多了,導致服務器壓力增大;

因為AJAX是在瀏覽器中使用Javascript技術完成的,所以還需要處理瀏覽器兼容性問題

AJAX核心(XMLHttpRequest

其實AJAX就是在Javascript中多添加了一個對象:XMLHttpRequest對象。所有的異步交互都是使用XMLHttpRequest對象完成的。也就是說,我們只需要學習一個Javascript的新對象即可。

注意,各個瀏覽器對XMLHttpRequest的支持也是不同的!大多數瀏覽器都支持DOM2規范,都可以使用:var xmlHttp = new XMLHttpRequest()來創建對象;但IE有所不同,IE5.5以及更早版本需要:var xmlHttp = new ActiveXObject(“Microsoft.XMLHTTP”)來創建對象;而IE6中需要:var xmlHttp = new ActiveXObject(“Msmxl2.XMLHTTP”)來創建對象;而IE7以及更新版本也支持DOM2規范。

編寫AJAX步驟

1,為了處理瀏覽器兼容問題,給出下面方法來創建XMLHttpRequest對象:

function createXMLHttpRequest() {var xmlHttp;// 適用于大多數瀏覽器,以及IE7和IE更高版本try{xmlHttp = new XMLHttpRequest();} catch (e) {// 適用于IE6try {xmlHttp = new ActiveXObject("Msxml2.XMLHTTP");} catch (e) {// 適用于IE5.5,以及IE更早版本try{xmlHttp = new ActiveXObject("Microsoft.XMLHTTP");} catch (e){}}}            return xmlHttp;
}

?

2,打開與服務器的連接:得到XMLHttpRequest對象后,就可以調用該對象的open()方法打開與服務器的連接了。open()方法的參數如下:

open(method, url, async):

method:請求方式,通常為GET或POST;

url:請求的服務器地址,例如:/ajaxdemo1/AServlet,若為GET請求,還可以在URL后追加參數;

async:這個參數可以不給,默認值為true,表示異步請求

3,發送請求:當使用open打開連接后,就可以調用XMLHttpRequest對象的send()方法發送請求了。send()方法的參數為POST請求參數,即對應HTTP協議的請求體內容,若是GET請求,需要在URL后連接參數。

注意:若沒有參數,需要給出null為參數!若不給出null為參數,可能會導致FireFox瀏覽器不能正常發送請求!如:xmlHttp.send(null);

4,接受服務器響應:

當請求發送出去后,服務器端Servlet就開始執行了,但服務器端的響應還沒有接收到。接下來我們來接收服務器的響應。

XMLHttpRequest對象有一個onreadystatechange事件,它會在XMLHttpRequest對象的狀態發生變化時被調用。下面介紹一下XMLHttpRequest對象的5種狀態:

0:初始化未完成狀態,只是創建了XMLHttpRequest對象,還未調用open()方法;

1:請求已開始,open()方法已調用,但還沒調用send()方法;

2:請求發送完成狀態,send()方法已調用;

3:開始讀取服務器響應;

4:讀取服務器響應結束。

onreadystatechange事件會在狀態為1、2、3、4時引發。

下面代碼會被執行四次!對應XMLHttpRequest的四種狀態!

?????? xmlHttp.onreadystatechange = function() {

?????????? alert('hello');

?????? };

?

但通常我們只關心最后一種狀態,即讀取服務器響應結束時,客戶端才會做出改變。我們可以通過XMLHttpRequest對象的readyState屬性來得到XMLHttpRequest對象的狀態。

?????? xmlHttp.onreadystatechange = function() {

?????????? if(xmlHttp.readyState == 4) {

????????????? alert('hello');??

?????????? }

?????? };

其實我們還要關心服務器響應的狀態碼是否為200,其服務器響應為404,或500,那么就表示請求失敗了。

我們可以通過XMLHttpRequest對象的status屬性得到服務器的狀態碼。

最后,我們還需要獲取到服務器響應的內容,可以通過XMLHttpRequest對象的responseText得到服務器響應內容。

?????? xmlHttp.onreadystatechange = function() {

?????????? if(xmlHttp.readyState == 4 && xmlHttp.status == 200) {

????????????? alert(xmlHttp.responseText);???

?????????? }

?????? };

?

下面是一個例子:

--------------------------------------------這是一個Servlet文件
public
class AServlet extends HttpServlet {public void doGet(HttpServletRequest request, HttpServletResponse response)//throws ServletException, IOException {System.out.println("Hello AJAX!");response.getWriter().print("Hello AJAX!!!");}public void doPost(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {response.setContentType("text/html;charset=utf-8");request.setCharacterEncoding("UTF-8");String username = request.getParameter("username");//獲取請求參數System.out.println("(POST:) Hello AJAX!" + username);response.getWriter().print("(POST:) Hello AJAX!!!" + username);} }

?

----------------------------------------------------這是一個jsp文件
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%> <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html><head><title>My JSP 'ajax1.jsp' starting page</title><meta http-equiv="pragma" content="no-cache"><meta http-equiv="cache-control" content="no-cache"><meta http-equiv="expires" content="0"> <meta http-equiv="keywords" content="keyword1,keyword2,keyword3"><meta http-equiv="description" content="This is my page"><!--<link rel="stylesheet" type="text/css" href="styles.css">--> <script type="text/javascript"> // 創建異步對象 function createXMLHttpRequest() {try {return new XMLHttpRequest();//大多數瀏覽器} catch (e) {try {return ActvieXObject("Msxml2.XMLHTTP");//IE6.0} catch (e) {try {return ActvieXObject("Microsoft.XMLHTTP");//IE5.5及更早版本 } catch (e) {alert("哥們兒,您用的是什么瀏覽器啊?");throw e;}}} }window.onload = function() {//文檔加載完畢后執行var btn = document.getElementById("btn");btn.onclick = function() {//給按鈕的點擊事件注冊監聽/*ajax四步操作,得到服務器的響應把響應結果顯示到h1元素中*//*1. 得到異步對象 */var xmlHttp = createXMLHttpRequest();/*2. 打開與服務器的連接* 指定請求方式* 指定請求的URL* 指定是否為異步請求*//************修改open方法,指定請求方式為POST**************/xmlHttp.open("POST", "<c:url value='/AServlet'/>", true);/************設置請求頭:Content-Type,如果請求方式為get的話,則不必要添加請求頭************/xmlHttp.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");/*3. 發送請求*//**********發送時指定請求體***********/xmlHttp.send("username=張三&password=123");//GET請求沒有請求體,但也要給出null,不然FireFox可能會不能發送!/*4. 給異步對象的onreadystatechange事件注冊監聽器*/xmlHttp.onreadystatechange = function() {//當xmlHttp的狀態發生變化時執行// 雙重判斷:xmlHttp的狀態為4(服務器響應結束),以及服務器響應的狀態碼為200(響應成功)if(xmlHttp.readyState == 4 && xmlHttp.status == 200) {// 獲取服務器的響應結束var text = xmlHttp.responseText;// 獲取h1元素var h1 = document.getElementById("h1");h1.innerHTML = text;}};}; }; </script></head><body> <button id="btn">點擊這里</button> <h1 id="h1"></h1></body> </html>

?

轉載于:https://www.cnblogs.com/QianYue111/p/9813774.html

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

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

相關文章

koa --- [MVC實現之三]換個角度重新開始-初始化

說明 下面文章是對該系列前面2篇及項目中經驗的總結,重新開始寫的實現了Mar類,貫穿Router層、Controller層、Service層基本骨架的搭建 初始 使用Koa創建一個簡單的服務器,一般會使用如下 const koa require(koa); const app new koa(); const Router require(koa-router…

MySQL索引設計原則

一、MySQL常用的索引類型 1.1主鍵索引 primary key 1.2唯一索引 unique 1.3普通索引 index 1.4全文索引 1.5組合索引 二、MySQL常用的數據結構 2.1B-tree 2.2哈希索引 三、索引的設計原則 3.1選擇唯一性索引 被設為唯一性的值可以設置為索引&#xff0c;這樣能快速定位到某條記…

Flask-admin 學習及一些筆記

Flask-admin 學習及一些筆記 基本認識&#xff1a;flask-admin是flask的擴張&#xff0c;主要用于對flask應用程序增加管理界面。 some notes&#xff1a; 在 BaseView 的子類中可以定義若干個視圖函數, 使用 Flask-Admin 的 expose 裝飾器來注冊函數為視圖, 這與一般的視圖…

java web 服務器環境搭建之jdk安裝

Java 部署環境搭建 一 安裝centos系統,安裝完成后用root用戶登錄 二 Java 環境安裝 下載jdk安裝包,使用以下命令下載安裝包,也可以在windows環境現在,在上傳到linux機器上curl -O -L http://download.oracle.com/otn-pub/java/jdk/8u191-b12/2787e4a523244c269598db4e85c51e0c/…

koa --- [MVC實現之四]Router、Controller、Service的實現

說明 上一篇: [MVC實現之三]上一篇實現了,Router層、Controller層、Service層的基本原則,并且成功的通過Mar類來傳遞這些層級之間需要的參數.這一篇主要是通過業務層面來具體實現: Router層:監聽頁面的路由,并調用Controller層的路由處理函數Controller層:給Router層提供服務,…

2017-2018-2 20179317 《網絡攻防技術》第七周學習心得體會

教材學習內容總結 課本第七章主要圍繞windows操作系統安全攻防技術進行講述&#xff0c;教材中主要涉及的攻擊內容如下&#xff1a; Windows操作系統的基本結構 運行于處理器特權模式的操作系統內核運行在處理器非特權模式的用戶空間代碼采用宏內核模式來進行構架 Windows操作系…

Jinja的基礎知識

Jinja的基礎知識 介紹&#xff1a;Jinja2 是一個現代的&#xff0c;設計者友好的&#xff0c;仿照 Django 模板的 Python 模板語言。 它速度快&#xff0c;被廣泛使用&#xff0c;并且提供了可選的沙箱模板執行環境保證安全 基本操作 變量&#xff1a;使用{{}}包圍 <a>…

PE文件格式詳解(二)

0x00 前言 上一篇講到了PE文件頭的中IMAGE_FILE_HEADER結構的第二個結構&#xff0c;今天從IMAGE_FILE_HEADER中第三個結構sizeOfOptionalHeader講起。這個字段的結構名也叫做IMAGE_OPTIONAL_HEDAER講起。 0x01 IMAGE_OPTIONAL_HEADER概述 其實這個結構是IMAGE_FILE_HEADER結構…

javascript --- [代碼優化]將復雜的函數分解寫異步請求數據的同步寫法

說明 今天優化項目結構,發現有如下一個函數 const drawMqiPie async (index) > {// 請求的參數let params {lineNo: lineNo,direct: 1,driveway: 1,pageNum: 0,pageSize: 0,computeRange: 3,detectDate: $(#detectYear).val() -01-01}// 請求的urllet url conf.URL s…

20165223《Java程序設計》第八周Java學習總結

教材學習內容總結 第12章-JAVA多線程機制 要點 Java中的線程Thread類與線程的創建線程的常用方法線程同步協調同步的線程線程聯合GUI線程計時器線程教材學習中的問題和解決過程 1. 進程與線程 程序&#xff1a;靜態的代碼&#xff0c;應用執行的藍本進程&#xff1a;程序的一次…

各種平臺的表達芯片跟mRNA-seq數據比較

各種平臺的表達芯片跟mRNA-seq數據比較 RNA-Seq 表達譜 芯片數據分析文章見&#xff1a;http://journals.plos.org/plosone ... ournal.pone.0078644指定的細胞系是&#xff1a;Human CCR6 CD4 memory T cell &#xff0c;測了6個時間點&#xff0c;共12個樣本表達芯片用的…

SQLAlchemy 一些基本操作

SQLAlchemy 一些基本操作 建表&#xff1a;db.create_all() 一次性創建全部的表 插入數據&#xff1a; ? 1、創建變量user User(username “hjj2”,password “1234”) ? 2、使用db.session.add(user)&#xff0c;添加到會話對象中 ? 3、使用db.session.commit()&am…

koa --- [MVC實現之五]Model層的實現

說明 上一篇: MVC實現之四這一篇主要介紹: 項目中用到的Sequelize庫中的一些方法,參考使用Sequelize連接mysql將Model層加入Mar類中 Service層 還是從業務出發,Service層是調用方,調用方式和Controller層調用Service層一樣 class Service {constructor(app) {const { model…

關于字符串 --java

這是在杭電上做一道水題時發現的&#xff0c;挺不錯&#xff0c;寫下了分享一下 http://acm.hdu.edu.cn/showproblem.php?pid2072 這里我用了兩種方法&#xff0c;參考大佬的&#xff0c;一個是list實現類&#xff0c;一個是用set框架 import java.util.*;public class Main {…

三元表達式 列表遞推 生成器表達式

#!/use/bin/python# -*- conding:utf-8 -*-# def my_max(x,y):# if x > y : #>必須緊湊# return x# else:# return y# x 10# y 20# res x if x>y else y# print(res)# name input(>>>:).strip()# res 漂亮小姐姐 if name 汪妍…

node --- 模擬事件的異步

事件 在前端瀏覽器最常見的就是頁面交互事件本質是發布/訂閱設計模式 目標 對象使用add方法訂閱事件。使用emit發布消息 訂閱事件 添加觸發事件的一個唯一字符串,以及對應的處理函數先初始化事件對象 class Event {constructor(){this.events {};} }訂閱在訂閱事件的時候,…

Vue-webpack項目配置詳解

Vue-webpack項目配置詳解 1、首先我們在構建vue項目后&#xff0c;就得先了解vue的項目結構 ├── build --------------------------------- webpack相關配置文件 │ ├── build.js --------------------------webpack打包配置文件 │ ├── check-versions.js ----…

淺談PHP面向對象編程(九)

9.0 設計模式 在編寫程序時經常會遇到一此典型的問題或需要完成某種特定需求&#xff0c;設計模式就是針對這些問題和需求&#xff0c;在大量的實踐中總結和理論化之后優選的代碼結構編程風格&#xff0c;以及解決問題的思考方式。 設計模式就像是經典的棋譜。不同的棋局&#…

javascript --- Object.create的閱讀

說明 今天閱讀koa源碼時,遇到Object.create,感覺對這個概念有點生疏,于是打開了MDN進行重新梳理傳送門 Object.create() 直接套用官網的栗子 const person {isHuman: false,printIntroduction: function () {console.log(My name is ${this.name}. Am I human? ${this.i…

python 12306 車次數據獲取

python 12306 車次數據獲取 ssl._create_default_https_context ssl._create_default_https_context train_data 2018-10-20 headers {User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.100 Safari/537.36,…