首頁 web前端 js教程 圖文詳解AJAX的底層原理介紹

圖文詳解AJAX的底層原理介紹

Apr 03, 2018 pm 05:13 PM
ajax 原理 底層

這次為大家帶來圖文詳解AJAX的底層原理介紹,使用JAX底層原理的注意事項有哪些,下面就是實戰案例,一起來看一下。

先上原理圖:

 

」背景:

     1.傳統的Web網站,提交表單,需要重新載入整個頁面。

     2.如果伺服器長時間未能回傳Response,客戶端將會無回應,使用者體驗很差。

     3.服務端回傳Response後,瀏覽器需要載入整個頁面,對瀏覽器的負擔也是很大的。

     4.瀏覽器提交表單後,傳送的資料量大,造成網路的效能問題。

問題:

     1.如何改善?

     2.AJAX是什麼?

     3.有什麼優點?

     4.有什麼缺點?

一、什麼是AJAX

1.為什麼需要AJAX

當需要從伺服器取得數據,並刷新頁面的操作,如果不採用AJAX,則需要用提交整個表單的方式,當提交表單時,發送請求給伺服器,頁面需要等待伺服器發送完response後,頁面才能恢復操作。

2.AJAX的概念:

     1.AJAX = 非同步 JavaScript 與 XML。

     2.AJAX 是一種用於建立快速動態網頁的技術。

     3.透過在後台與伺服器進行少量資料交換,可以讓網頁實現非同步更新。

     4.可在不重新載入整個網頁的情況下,更新網頁的某部分。

3.什麼叫異步

目前頁面發送一個請求給伺服器,目前頁面不需要等待伺服器回應才能操作網頁。發送完請求之後,目前頁面可以繼續瀏覽,操作。

4.什麼叫局部刷新

我們可以用兩種方式來實現部分刷新。

1. iframe頁面重載的方式。

這種方式雖然實現了部分刷新,但是是頁面的重載,所以也會帶來效能上的問題。

Step1.在頁面中定義一個Iframe

<iframe id="indexFrame" name="index" width="1000" height="800"
    frameborder="0" marginwidth="0" marginheight="0" scrolling="yes" style="margin-top:100px;"></iframe>
登入後複製

Step2.設定Iframe的src

var indexFrame = document.getElementById("indexFrame");
indexFrame.src = "introduction.php";
登入後複製

Step3.新增一個button的點擊事件,當點擊這個button時,重新設定Iframe的src,實現iframe裡面的頁面刷新。 Iframe外面的內容不刷新。

<button id="room" onclick=&#39;IndexClick("room")&#39;>Click Me!</button>
登入後複製
function IndexClick(moduleKey) {
 var indexFrame = document.getElementById("indexFrame");
 if(indexFrame == null)
 {
   indexFrame = parent.document.getElementById("indexFrame");
 }
 var url = "introduction.php";
 switch (moduleKey) {
  case "introduction":
   url = "introduction.php";
   break;
  case "room":
   url = "room.php";
   break;
  default:
   {
   }
 }
 indexFrame.src = url;
}
登入後複製

透過這個方式我們可以實作一個導覽列的功能:

    

  2.AJAX方式

##  

2.AJAX方式

# #    Step1.JavaScrpit發送非同步請求

    Step2.服務端查詢資料庫,返回資料

    Step3.服務端回傳」編號用JavaScript操作DOM。

  看下面的例子:

  

  當我們切換DropDownList中的Item時,JavaScript發送非同步請求給Server端,Server端返回數據,然後Java將資料解析出來,拼接了一個Table,將Table呈現在頁面上。

二、提交Form表單的原理

#1.程式碼

###

客户端代码:

<form id="form1" action="Test.ashx" method="get">
   您的姓名1:<input type="text" name="fname" size="20" />
   <input type="submit" name="submit" value="Sumbit">
 </form>
登入後複製

服务端代码:

public void ProcessRequest (HttpContext context)
{
  //Delay
  for (int i = 0; i < 2; i++)
  {
   System.Threading.Thread.Sleep(1000);
  }
 
   //从Requset.Form中获取fname的值。使用Form获取请求的键值对的值的前提条件是HTTP request Content-Type 值必须是"application/x-www-form-urlencoded" 或 "multipart/form-data".
  string fname = context.Request["fname"];
 
  context.Response.ContentType = "text/plain";
 //将字符串写入 HTTP 响应输出流。
  context.Response.Write("Hello World " + fname);
 }
登入後複製

2.将代码部署到IIS

3.打开站点:

http://localhost:8003/Test.html

4.输入“Jackson0714”然后点击Sumbit按钮,页面会重新刷新,显示"Hello World Jackson0714"

5.提交Form表单后,页面发送请求和服务端返回响应的流程

6.通过抓包,我们可以得到HTTP Headers

浏览器发送HTTP给服务端,采取的协议是HTTP协议。

在传输过程中,我们可以看下HTTP Headers。

三、AJAX提交请求和服务响应的原理

1.代码

客户端HTML代码:

<!DOCTYPE html>
 
<html lang="en" xmlns="http://www.w3.org/1999/xhtml">
<head>
 <meta charset="utf-8" />
 <title></title>
 <script type="text/javascript" src="Ajax.js"></script>
 
</head>
<body>
 <p id="Test" style="background-color:#40eeee">
  您的姓名2:<input type="text" id="testGetName" size="20" />
  <button type="button" onclick="testGet();">Ajax Get请求</button>
 </p>
   
 <p id="Test" style="background-color:#ff6a00">
  您的姓名3:<input type="text" id="testPostName" size="20" />
  <button type="button" onclick="testPost();">Ajax Post请求</button>
 </p>
 
 <p id="myp" />
 
</body>
</html>
登入後複製

客户端JS代码:

var xmlhttp = createRequest();
 
function testGet() {
 var fname = document.getElementById("testGetName").value;
 xmlhttp.open("GET", "Test.ashx?fname=" + fname + "&random=" + Math.random() , true);
 xmlhttp.onreadystatechange = callback;
 xmlhttp.send(null);
}
 
function testPost() {
 var fname = document.getElementById("testPostName").value;
 xmlhttp.open("POST", "Test.ashx?" + "&random=" + Math.random() , true);
 xmlhttp.setRequestHeader("Content-Type", "application/x-www-form-urlencoded;charset=UTF-8");
 xmlhttp.onreadystatechange = callback;
 xmlhttp.send("fname="+fname);
 
}
 
function createRequest() {
 var xmlhttp;
 if (window.XMLHttpRequest) {
  // code for IE7+, Firefox, Chrome, Opera, Safari
  xmlhttp = new XMLHttpRequest();
 }
 else {
  // code for IE6, IE5
  xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");
 }
 return xmlhttp
}
 
function callback() {
 if (xmlhttp.readyState == 4 && xmlhttp.status == 200) {
  document.getElementById("myp").innerHTML = xmlhttp.responseText;
 }
}
登入後複製

这里有一点需要注意

var xmlhttp = createRequest(); 。

       1.让服务端能够操作这个变量,如果定义成局部变量,则服务端返回response时,不能对xmlhttp的属性赋值。回调函数要求request是全局的,才能访问这个变量和它的属性值。

       2.定义成全局变量后,可能出现两个请求或多个请求共享同一个请求对象。而这个请求对象只能存放一个回调函数来处理服务器响应。当服务器返回两个请求的Response后,可能会调用后指定的回调函数。所以可能有两个完全不同的服务器响应由同一个回调函数处理,而这可能并不是正确的处理。解决办法是创建两个不同的请求对象。 

服务端代码不变。

2.输入“Jackson0714”然后点击Sumbit按钮,页面不会刷新,在最下面显示"Hello World Jackson0714"

3.AJAX发送请求和服务端返回响应的流程

 

4.通过抓包,我们可以得到HTTP Headers

浏览器发送HTTP给服务端,采取的协议是HTTP协议。

在传输过程中,我们可以看下HTTP Headers:

 

5.AJAX  GET和POST方式区别

AJAX发送请求和POST发送请求的代码如下:

//GET方式
function testGet() {
 var fname = document.getElementById("testGetName").value;
 xmlhttp.open("GET", "Test.ashx?fname=" + fname + "&random=" + Math.random() , true);
xmlhttp.onreadystatechange = callback;
 xmlhttp.send(null);
}
 
//POST方式
function testPost() {
 var fname = document.getElementById("testPostName").value;
 xmlhttp.open("POST", "Test.ashx?" + "&random=" + Math.random() , true);
 xmlhttp.setRequestHeader("Content-Type", "application/x-www-form-urlencoded;charset=UTF-8");
 xmlhttp.onreadystatechange = callback;
 xmlhttp.send("fname="+fname);
 
}
登入後複製

四、XMLHttpRequest 对象的知识

1.XMLHttpRequest 对象的方法

 2.XMLHttpRequest 对象的属性

五、JQuery实现AJAX

下面的代码实现了当切换DropDownList的item时,触发getWeeklyCalendar方法,用JQuery的类库方法$.ajax来发送AJAX请求。

客户端JQuery代码

function getWeeklyCalendar(name,currentDate,mode){
 $.ajax({
  type:'POST',
  url:'weekProcess.php',data:'func=getWeeklyCalender&name='+name+'&currentDate='+currentDate+'& mode='+mode,
  success:function(data){
  paintWeeklyCandler(data);
  }
 });
}
登入後複製

后台成功返回Response后,执行paintWeeklyCandler(data)方法

后台PHP代码

<?php<br> //定义返回的Response的格式为JSON格式
 header('Content-type: text/json');<br> //引入自定义的数据库连接文件
 include 'dbConfig.php';<br> //引入自定义的设置session的文件
 include_once 'session.php';
 /*
 * Function requested by Ajax
 */
 if(isset($_POST['func']) && !empty($_POST['func']))
 {
  switch($_POST['func']){
    case 'getWeeklyCalender':
      getWeeklyCalender($_POST['name'],$_POST['currentDate'],$_POST['mode']);
       break;
     case 'getWeeklyStatus':
      getWeeklyStatus($_POST['name'],$_POST['currentDate'],$_POST['mode']);
      break;
     case 'getEvents':
      getEvents($_POST['date'],$_POST['name']);
      break;
    default:
      break;
 }
}
 function getWeeklyCalender($name = '',$currentDate = '',$mode = '')
 {
  //逻辑代码<br>    <br>  <br>    //返回JSON格式的Response
  echo json_encode(array('result'=>$DaysOfWeekResultsArray));
 }<br>?>
登入後複製

六、优势

     1.使用异步方式与服务器通信,页面不需要重新加载,页面无刷新

     2.按需取数据,减少服务器的负担

     3.使得Web应用程序更为迅捷地响应用户交互

     4.AJAX基于标准化的并被广泛支持的技术,不需要下载浏览器插件或者小程序,但需要客户允许JavaScript在浏览器上执行

     5.浏览器的内容和服务端代码进行分离。页面的内容全部由JAVAScript来控制,服务端负责逻辑的校验和从数据库中拿数据。

七、缺点

     1.安全问题:将服务端的方法暴露出来,黑客可利用这一点进行攻击

     2.大量JS代码,容易出错

     3.Ajax的无刷新重载,由于页面的变化没有刷新重载那么明显,所以容易给用户带来困扰——用户不太清楚现在的数据是新的还是已经更新过的;现有的解决有:在相关位置提示、数据更新的区域设计得比较明显、数据更新后给用户提示等

     4.可能破坏浏览器后退按钮的正常行为;

     5.一些手持设备(如手机、PAD等)自带的浏览器现在还不能很好的支持Ajax

八、应用场景

     1.对数据进行过滤和操纵相关数据的场景

     2.添加/删除树节点

     3.添加/删除列表中的某一行记录

     4.切换下拉列表item

     5.注册用户名重名的校验

九、不适用场景

     1.整个页面内容的保存

     2.导航

相信看了本文案例你已经掌握了方法,更多精彩请关注php中文网其它相关文章!

推荐阅读:

新手必看的Ajax技术组成与核心原理分析

js+ajaxcap操作json对象循环到表格保存

以上是圖文詳解AJAX的底層原理介紹的詳細內容。更多資訊請關注PHP中文網其他相關文章!

本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

<🎜>:泡泡膠模擬器無窮大 - 如何獲取和使用皇家鑰匙
4 週前 By 尊渡假赌尊渡假赌尊渡假赌
北端:融合系統,解釋
4 週前 By 尊渡假赌尊渡假赌尊渡假赌
Mandragora:巫婆樹的耳語 - 如何解鎖抓鉤
3 週前 By 尊渡假赌尊渡假赌尊渡假赌

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

熱門話題

Java教學
1672
14
CakePHP 教程
1428
52
Laravel 教程
1332
25
PHP教程
1276
29
C# 教程
1256
24
PHP 與 Ajax:建立一個自動完成建議引擎 PHP 與 Ajax:建立一個自動完成建議引擎 Jun 02, 2024 pm 08:39 PM

使用PHP和Ajax建置自動完成建議引擎:伺服器端腳本:處理Ajax請求並傳回建議(autocomplete.php)。客戶端腳本:發送Ajax請求並顯示建議(autocomplete.js)。實戰案例:在HTML頁面中包含腳本並指定search-input元素識別碼。

nohup的作用及原理解析 nohup的作用及原理解析 Mar 25, 2024 pm 03:24 PM

nohup的作用及原理解析在Unix和類Unix作業系統中,nohup是一個常用的命令,用於在後台運行命令,即便用戶退出當前會話或關閉終端窗口,命令仍然能夠繼續執行。在本文中,我們將詳細解析nohup指令的作用和原理。一、nohup的作用後台運行命令:透過nohup命令,我們可以讓需要長時間運行的命令在後台持續執行,而不受用戶退出終端會話的影響。這在需要運行

解決jQuery AJAX請求403錯誤的方法 解決jQuery AJAX請求403錯誤的方法 Feb 19, 2024 pm 05:55 PM

jQuery是一個受歡迎的JavaScript函式庫,用來簡化客戶端端的開發。而AJAX則是在不重新載入整個網頁的情況下,透過發送非同步請求和與伺服器互動的技術。然而在使用jQuery進行AJAX請求時,有時會遇到403錯誤。 403錯誤通常是伺服器禁止存取的錯誤,可能是由於安全性原則或權限問題導致的。在本文中,我們將討論如何解決jQueryAJAX請求遭遇403錯誤

解決jQuery AJAX請求遇到403錯誤的方法 解決jQuery AJAX請求遇到403錯誤的方法 Feb 20, 2024 am 10:07 AM

標題:解決jQueryAJAX請求出現403錯誤的方法及程式碼範例403錯誤是指伺服器禁止存取資源的請求,通常會導致出現這個錯誤的原因是請求缺少權限或被伺服器拒絕。在進行jQueryAJAX請求時,有時會遇到這種情況,本文將介紹如何解決這個問題,並提供程式碼範例。解決方法:檢查權限:首先要確保請求的URL位址是正確的,同時驗證是否有足夠的權限來存取該資

如何解決jQuery AJAX報錯403的問題? 如何解決jQuery AJAX報錯403的問題? Feb 23, 2024 pm 04:27 PM

如何解決jQueryAJAX報錯403的問題?在開發網頁應用程式時,經常會使用jQuery來發送非同步請求。然而,有時在使用jQueryAJAX時可能會遇到錯誤代碼403,表示伺服器禁止存取。這種情況通常是由伺服器端的安全性設定所導致的,但可以透過一些方法來解決這個問題。本文將介紹如何解決jQueryAJAX報錯403的問題,並提供具體的程式碼範例。一、使

深入探討Struts框架的原理與實踐 深入探討Struts框架的原理與實踐 Feb 18, 2024 pm 06:10 PM

Struts框架的原理解析與實務探索Struts框架作為JavaWeb開發中常用的MVC框架,具有良好的設計模式和可擴展性,廣泛應用於企業級應用程式開發中。本文將對Struts框架的原理進行解析,並結合實際程式碼範例進行探索,幫助讀者更好地理解和應用該框架。一、Struts框架的原理解析1.MVC架構Struts框架是基於MVC(Model-View-Con

深入理解MyBatis中的批次Insert實作原理 深入理解MyBatis中的批次Insert實作原理 Feb 21, 2024 pm 04:42 PM

MyBatis是一款流行的Java持久層框架,廣泛應用於各種Java專案。其中,批次插入是常見的操作,可以有效提升資料庫操作的效能。本文將深入探討MyBatis中批量的Insert實作原理,並結合具體的程式碼範例進行詳細解析。 MyBatis中的批次Insert在MyBatis中,批量Insert操作通常使用動態SQL來實作。透過建構一條包含多個插入值的S

MyBatis分頁插件原理詳解 MyBatis分頁插件原理詳解 Feb 22, 2024 pm 03:42 PM

MyBatis是一個優秀的持久層框架,它支援基於XML和註解的方式操作資料庫,簡單易用,同時也提供了豐富的插件機制。其中,分頁插件是使用頻率較高的插件之一。本文將深入探討MyBatis分頁外掛的原理,並結合具體的程式碼範例進行說明。一、分頁外掛原理MyBatis本身並沒有提供原生的分頁功能,但可以藉助外掛程式來實現分頁查詢。分頁插件的原理主要是透過攔截MyBatis

See all articles