鍍金池/ 教程/ HTML/ 不使用 jQuery 的 Ajax 請求
備忘錄模式
解釋器模式
類似 Python 的 zip 函數(shù)
類變量和實例變量
提示參數(shù)
指數(shù)對數(shù)運算
檢查變量的類型是否為數(shù)組
由數(shù)組創(chuàng)建一個字符串
生成隨機數(shù)
刪除數(shù)組中的相同元素
大寫單詞首字母
雙向服務(wù)器
類的混合
計算復(fù)活節(jié)的日期
轉(zhuǎn)換弧度和度
找到上一個月(或下一個月)
雙向客戶端
橋接模式
嵌入 JavaScript
AJAX
觀察者模式
克隆對象(深度復(fù)制)
一個隨機整數(shù)函數(shù)
清理字符串前后的空白符
歸納數(shù)組
平方根倒數(shù)快速算法
適配器模式
打亂數(shù)組中的元素
將數(shù)組連接
使用數(shù)組來交換變量
更快的 Fibonacci 算法
服務(wù)器
服務(wù)端和客戶端的代碼重用
客戶端
查找子字符串
策略模式
CoffeeScrip 的 type 函數(shù)
由數(shù)組創(chuàng)建一個對象詞典
回調(diào)綁定
工廠方法模式
映射數(shù)組
當函數(shù)括號不可選
生成可預(yù)測的隨機數(shù)
不使用 jQuery 的 Ajax 請求
把字符串轉(zhuǎn)換為小寫形式
類方法和實例方法
擴展內(nèi)置對象
定義數(shù)組范圍
MongoDB
匹配字符串
創(chuàng)建一個不存在的對象字面值
列表推導(dǎo)
比較范圍
修飾模式
檢測每個元素
拆分字符串
字符串插值
對象數(shù)組
去抖動函數(shù)
使用 Nodeunit 測試
SQLite
單件模式
篩選數(shù)組
替換子字符串
數(shù)組最大值
計算(美國和加拿大的)感恩節(jié)日期
找到一個月中的最后一天
計算兩個日期中間的天數(shù)
基本的 HTTP 服務(wù)器
把字符串轉(zhuǎn)換為大寫形式
使用 HTML 命名實體替換 HTML 標簽
For 循環(huán)
模板方法模式
重復(fù)字符串
使用 Jasmine 測試
對象的鏈式調(diào)用
數(shù)學常數(shù)
反轉(zhuǎn)數(shù)組
計算月球的相位
使用 Heregexes
查找子字符串
生成器模式
遞歸函數(shù)
HTTP 客戶端
創(chuàng)建 jQuery 插件
檢測與構(gòu)建丟失的函數(shù)
生成唯一ID
命令模式

不使用 jQuery 的 Ajax 請求

問題

你想要通過 AJAX 來從你的服務(wù)器加載數(shù)據(jù),而不使用 jQuery 庫。

解決方案

你將使用本地的 XMLHttpRequest 對象。

通過一個按鈕來打開一個簡單的測試 HTML 頁面。

<!DOCTYPE HTML>
<html lang="en-US">
<head>
    <meta charset="UTF-8">
    <title>XMLHttpRequest Tester</title>
</head>
<body>
    <h1>XMLHttpRequest Tester</h1>
    <button id="loadDataButton">Load Data</button>

    <script type="text/javascript" src="XMLHttpRequest.js"></script>
</body>
</html>

當單擊該按鈕時,我們想給服務(wù)器發(fā)送 Ajax 請求以獲取一些數(shù)據(jù)。對于該例子,我們使用一個 JSON 小文件。

// data.json
{
  message: "Hello World"
}

然后,創(chuàng)建 CoffeeScript 文件來保存頁面邏輯。此文件中的代碼創(chuàng)建了一個函數(shù),當點擊加載數(shù)據(jù)按鈕時將會調(diào)用該函數(shù)。

1 # XMLHttpRequest.coffee
2 loadDataFromServer = ->
3   req = new XMLHttpRequest()
4 
5   req.addEventListener 'readystatechange', ->
6     if req.readyState is 4                        # ReadyState Complete
7       successResultCodes = [200, 304]
8       if req.status in successResultCodes
9         data = eval '(' + req.responseText + ')'
10         console.log 'data message: ', data.message
11       else
12         console.log 'Error loading data...'
13 
14   req.open 'GET', 'data.json', false
15   req.send()
16 
17 loadDataButton = document.getElementById 'loadDataButton'
18 loadDataButton.addEventListener 'click', loadDataFromServer, false

討論

在以上代碼中,我們對 HTML 中按鍵進行了處理(第 16 行)以及添加了一個單擊事件監(jiān)聽器(第 17 行)。在事件監(jiān)聽器中,我們把回調(diào)函數(shù)定義為 loadDataFromServer。

我們在第 2 行定義了 loadDataFromServer 回調(diào)的開頭。

我們創(chuàng)建了一個 XMLHttpRequest 請求對象(第 3 行),并添加了一個 readystatechange 事件處理器。請求的 readyState 發(fā)生改變的那一刻,它就會被觸發(fā)。

在事件處理器中,我們會檢查判斷是否滿足 readyState=4,若等于則說明請求已經(jīng)完成。然后檢查請求的狀態(tài)值。狀態(tài)值為 200 或者 304 都代表著請求成功,其它則表示發(fā)生錯誤。

如果請求確實成功了,那我們就會對從服務(wù)器返回的 JSON 重新進行運算,然后把它分配給一個數(shù)據(jù)變量。此時,我們可以在需要的時候使用返回的數(shù)據(jù)。

在最后我們需要提出請求。

在第 13 行打開了一個 “GET” 請求來讀取 data.json 文件。

在第 14 行把我們的請求發(fā)送至服務(wù)器。

舊版服務(wù)器支持

如果你的應(yīng)用需要使用舊版本的 Internet Explorer ,你需確保 XMLHttpRequest 對象存在。為此,你可以在創(chuàng)建 XMLHttpRequest 實例之前輸入以下代碼。

if (typeof @XMLHttpRequest == "undefined")
  console.log 'XMLHttpRequest is undefined'
  @XMLHttpRequest = ->
    try
      return new ActiveXObject("Msxml2.XMLHTTP.6.0")
    catch error
    try
      return new ActiveXObject("Msxml2.XMLHTTP.3.0")
    catch error
    try
      return new ActiveXObject("Microsoft.XMLHTTP")
    catch error
    throw new Error("This browser does not support XMLHttpRequest.")

這段代碼確保了 XMLHttpRequest 對象在全局命名空間中可用。

上一篇:字符串插值下一篇:模板方法模式