ajax技術詳解

来源:https://www.cnblogs.com/guanqiweb/archive/2019/01/21/10299862.html
-Advertisement-
Play Games

今天來講一下ajax的有關知識點。 ajax概念 ajax全稱叫 Asynchronous JavaScript and XML ,意思是非同步的 JavaScript 和 XML。 ajax是現有標準的一種新方法,不是編程語言,可以在不刷新網頁的情況下,和伺服器交換數據並且更新部分頁面內容,不需要任 ...


今天來講一下ajax的有關知識點。

ajax概念

ajax全稱叫Asynchronous JavaScript and XML,意思是非同步的 JavaScript 和 XML。

ajax是現有標準的一種新方法,不是編程語言,可以在不刷新網頁的情況下,和伺服器交換數據並且更新部分頁面內容,不需要任何插件,只需要游覽器允許運行JavaScript就可以。

而傳統的網頁(不使用ajax的)如果需要更新頁面內容,就需要重新請求伺服器,返回網頁內容,重新渲染刷新頁面。

ajax的原理

原理:ajax的運行過程包括以下幾個方面

  1. Browser游覽器通過事件觸發方法,本地通過XMLHttpRequest對象,創建並且發送請求通過互聯網到伺服器;
  2. Server伺服器收到請求的內容,響應請求,發送所需數據到游覽器;
  3. Browser游覽器通過XMLHttpRequest對象的onreadystatechange的方法收到請求的數據後,解析和渲染數據到頁面中。

註意:ajax依賴的標準有以下幾個

  1. XMLHttpRequest對象,非同步的與伺服器交換數據
  2. JavaScript/DOM,信息顯示/交互
  3. XML,作為轉換數據的格式

XMLHttpRequest的使用

創建XMLHttpRequest對象,通過new實例化一個XMLHttpRequest對象。

var xhr = new XMLHttpRequest() || new ActiveXObject('Microsoft.XMLHTTP'); // 相容ie和Firefox,google chrome,opera,safari

發送請求使用XMLHttpRequest對象的opensend方法

open方法使用

open(method,url,async),接受三個參數。

  • 第一個是method請求的類型,如:getpost;
  • 第二個是url請求地址,即文件在伺服器的位置;
  • 第三個是是否處理非同步處理請求,值為true和false;

例如:

xhr.open('get','https://www.abc.com/service.php?tamp='+Date.parse(new Date()),true);

send方法使用

send(string)接受的參數為請求類型為post傳遞的值,為get類型時候不傳值。

例如:

send('tamp='+Date.parse(new Date());

onreadystatechange事件

當readyState屬性發生變化時,就會觸發onreadystatechange事件,該事件通過回調函數獲取到響應的數據信息。

readyState值:

  • 值為0表示:請求未初始化;
  • 值為1表示:伺服器連接已建立;
  • 值為2表示:請求已接收;
  • 值為3表示:請求處理中;
  • 值為4表示:請求已完成,且響應已就緒;

status值:

  • 200: 請求成功
  • 404: 未找到頁面

簡單的get請求。

var xhr;
if (!xhr && typeof xhr !== 'object') {
    var xhr = new XMLHttpRequest() || new ActiveXObject('Microsoft.XMLHTTP');
}
xhr.open('get','https://www.abc.com/service.php?tamp='+Date.parse(new Date()),true);
xhr.onreadystatechange = function() {
    if (xhr.readyState === 4) {
        if (xhr.status === 200) {
            console.log(xhr.responseText);
        }
    }
}
xhr.send();

模擬數據

模擬的JSON數據

// 保存為data.json文件
{
    "msg": "get_succ",
    "code": 201,
    "data": {
        "list": [
            {
                "id":1,
                "name": "alun"
            },
            {
                "id":2,
                "name": "mark"
            },
            {
                "id":3,
                "name": "jean"
            }
        ]
    }
}

模擬的Nodejs的api

請確保你的系統安裝有node.js環境。

// 保存為node.js文件
// 引入http模塊
const http = require('http');

const port = 3000;

const success = {
    msg: "get_succ",
    code: 201,
    data: {
        list: [
            {"id":1,"name": "alun"},
            {"id":2,"name": "mark"},
            {"id":3,"name": "jean"}
        ]
    }
}

const error = {
    msg: "get_fail",
    code: 101,
    data: {
        info: 'this request failed,again try!'
    }
}

const authy = {
    msg: "no visited!",
    code: 403,
    data: {
        info: 'not visited!'
    }
}

// 建立http服務
const serve = http.createServer((req,res) => {
    var lawDomainList = "http://localhost:9925";
    res.setHeader('Content-Type', 'text/plain;charset=utf8');
    res.setHeader("Access-Control-Allow-Origin",lawDomainList);
    if (req.url == '/api') {
        res.end(JSON.stringify(success));
    } else {
        res.end(JSON.stringify(error));
    }
    res.end(authy);
})
// 監聽埠
serve.listen(port,function(){
    console.log('serve is running on port 3000!');
})

封裝的ajax函數

// 保存為ajax.js文件
$g = {
    get: function(url) {
        return new Promise(function(resolve,reject) {
            if (!url && !(typeof url == 'string')) { throw new Error('SysantaxError: this get request must had url!'); }
            var xhr = new XMLHttpRequest() || new ActiveXObject('Microsoft.XMLHTTP');
            xhr.open('GET',url,true);
            xhr.onreadystatechange = function() {
                if (this.readyState === 4) {
                    if (this.status === 200) {
                        resolve(this.responseText,this);
                    } else {
                        var resJson = { code: this.status, response: this.response }
                        reject(resJson, this)
                    }
                }
            }
            xhr.send();
        })
    },
    post: function(url,data) {
        return new Promise(function(resolve,reject) {
            if (!url) { throw new Error('SysantaxError: this post request must had url!'); }
            if (!data) { throw new Error('SysantaxError: this post request must had data!'); }
            var xhr = new XMLHttpRequest() || new ActiveXObject('Microsoft.XMLHTTP');
            xhr.open('POST',url,true);
            xhr.setRequestHeader('Content-Type','application/x-www-form-urlencoded');
            xhr.onreadystatechange = function() {
                if (this.readyState === 4) {
                    if (this.status === 200) {
                        resolve(this.responseText,this);
                    } else {
                        var resJson = { code: this.status, response: this.response }
                        reject(resJson, this)
                    }
                }
            }
            xhr.send(JSON.stringify(data));
        })
    }
}

示例:獲取數據渲染頁面

通過點擊按鈕獲取數據,渲染列表。

<button class="btn">請求數據</button>
<ul class="res">結果:暫無結果</ul>
<script src="ajax.js"></script>
let btn = document.querySelector('.btn');
let resbox = document.querySelector('.res');
btn.onclick = function() {
    var url = 'http://localhost:3000/api'; // node api
    var urlJson = 'data.json'; // mock api
    $g.get(url).then(function(res) {
        if (typeof res == 'string') {
            let responTxt = JSON.parse(res);
            if (responTxt.msg == 'get_succ' && responTxt.code == 201) {
                let list = responTxt.data.list;
                let str = '';
                for (let i=0;i<list.length;i++) {
                    str += '<li>'+ list[i].id + ':' + list[i].name + '</li>';
                }
                resbox.innerHTML = str;
            }
        }
    }).catch(function(err){
        throw new Error(err);
    });
}

寫在最後

這隻是我總結的一小部分知識點,其實這個技術還是有很多地方沒有說到,以後再補充吧!


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • why not divs? 所有html頁面標簽都可以用div解決,為什麼還會存在各種不同的標簽呢? 代碼是寫給機器閱讀的,初始化標簽更利於快速編程,畢竟很多標簽有了自定義屬性,無需編碼控制,可維護性更高! 由於html存在無限級嵌套,都要被機器一一識別,效率未免太低,於是利用多樣的標簽來幫助瀏覽器 ...
  • iterator作用 為所有的數據結構提供統一的訪問方式。 介面對象 介面對象一共有3個方法,next()方法、return()方法、throw()方法。 next() 必填 用於for..of迭代。 該方法返回一個對象{value,done}。 value:元素值,done:狀態位,用於指定迴圈是 ...
  • jquery中有隱式迭代,不需要我們再次對某些元素進行操作。但是如果涉及到不同元素有不同操作,需要進行each遍歷。本文利用10個li設置不同的透明度的案例,對each方法進行說明。 語法: $(元素).each(function(index,element){ }); 參數index:表示元素索引 ...
  • 在美團、淘寶、京東等網頁上,有許多商品、服務評價頁面,五星好評功能很常見,本文利用jQuery實現五星好評功能。 案例圖片: 案例需求: 如左圖所示,滑鼠進入某個五角星,該五角星包括之前的五角星全部變成黃色。 滑鼠離開後,變成黃色的恢複原狀 當滑鼠在某個五角星上點擊的時候,該五角星和其之前的五角星全 ...
  • js獲取url參數值 今天說一下如何獲取url參數值。 思路 + 通過 的`search`就可以獲取到url中問號後面的值。 + 字元串過濾到問號 + 通過split方法分割參數集合 + 迴圈賦值 + 匹配對應的參數值 + 返回值 封裝的方法 js function getUrlParams(nam ...
  • 網上已經有很多關於正六邊形的CSS畫法,主要是利用一個矩形和前後的兩個三角形組合而成。 之前在看四維圖新的官網的時候,發現了一種六邊形的畫法,比較適合多排六邊形組合成蜂窩狀的展示區域(註:四維圖新現在改成了上面說的那種畫法了)。 示意圖: 1、HTML結構 每個li里包著.hex和.hexIn。.h ...
  • 配置: 配置: ...
  • 實現 iframe 的自適應高度,能夠隨著頁面的長度自動的適應以免除頁面和 iframe 同時出現滾動條的現象。 (需要只有iframe出現滾動條) 剛開始以為是很小的問題一直沒註意,但是經常頁面比較高的只能顯示一半,後來也在網上搜了很多解解辦法,一直沒真正解決,下麵是我在網上搜到的方法: 下麵是我 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...