国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

Ajax 與異步數(shù)據(jù)傳輸

孫淑建 / 1494人閱讀

摘要:基本概念全稱是異步的和。通過在后臺與服務(wù)器進行少量數(shù)據(jù)交換,可以使網(wǎng)頁實現(xiàn)異步更新。我們加了一個隨機數(shù)以后,每次請求不同,瀏覽器就不會使用緩存數(shù)據(jù)了。中文亂碼問題返回的中文數(shù)據(jù)亂碼是因為頁面和頁面中使用了不同的編碼方式導(dǎo)致的。

基本概念

Ajax 全稱是異步的 JavaScript 和 XML 。 通過在后臺與服務(wù)器進行少量數(shù)據(jù)交換,AJAX 可以使網(wǎng)頁實現(xiàn)異步更新。這意味著可以在不重新加載整個網(wǎng)頁的情況下,對網(wǎng)頁的某部分進行更新。傳統(tǒng)的網(wǎng)頁(不使用 AJAX)如果需要更新內(nèi)容,必須重載整個網(wǎng)頁頁面。

Ajax 具有以下優(yōu)點和缺點:

優(yōu)點

無需刷新頁面,用戶體驗好;

異步與服務(wù)器通信,不影響主進程,響應(yīng)更迅速;

可以把部分服務(wù)器的工作放在客戶端的瀏覽器完成,減輕服務(wù)器壓力,減少冗余請求和響應(yīng);

Ajax 是前端開發(fā)的標(biāo)準(zhǔn)化技術(shù),無需插件支持,跨平臺性能好;

缺點

Ajax 請求不修改瀏覽器歷史記錄,因此不支持前進后退功能;

Ajax 暴露了過多和服務(wù)器交互的細(xì)節(jié);

破壞了程序的異常機制,容易調(diào)試;

不利于搜索引擎抓取信息;

同源策略

同源策略是Netscape提出的一個著名的安全策略,它是指同一個“源頭”的數(shù)據(jù)可以自由訪問,但不同源的數(shù)據(jù)相互之間都不能訪問。我們試想一下以下幾種情況:

我們打開了一個天貓并且登錄了自己的賬號,這時我們再打開一個天貓的商品,我們不需要再進行一次登錄就可以直接購買商品,因為這兩個網(wǎng)頁是同源的,可以共享登錄相關(guān)的 cookie 或 localStorage 數(shù)據(jù);

如果你正在用支付寶或者網(wǎng)銀,同時打開了一個不知名的網(wǎng)頁,如果這個網(wǎng)頁可以訪問你支付寶或者網(wǎng)銀頁面的信息,就會產(chǎn)生嚴(yán)重的安全的問題。顯然瀏覽器不允許這樣的事情發(fā)生;

想必你也有過同時登陸好幾個 qq 賬號的情況,如果同時打開各自的 qq 空間瀏覽器會有一個小號模式,也就是另外再打開一個窗口專門用來打開第二個 qq 賬號的空間。

很明顯,第1個和第3個例子中,不同的天貓商店和 qq 空間屬于同源,可以共享登錄信息。qq 為了區(qū)別不同的 qq 的登錄信息,重新打開了一個窗口,因為瀏覽器的不同窗口是不能共享信息的。而第2個例子中的支付寶、網(wǎng)銀、不知名網(wǎng)站之間是非同源的,所以彼此之間無法訪問信息,如果你執(zhí)意想請求數(shù)據(jù),會提示異常:

No "Access-Control-Allow-Origin" header is present on the requested resource. Origin "null" is therefore not allowed access.

那么什么是同源的請求呢?同源請求要求被請求資源頁面和發(fā)出請求頁面滿足3個相同:

協(xié)議相同
域名相同
端口相同

簡單理解一下:

/*以下兩個數(shù)據(jù)非同源,因為協(xié)議不同*/
http://www.abc123.com.cn/item/a.js
https://www.abc123.com.cn/item/a.js

/*以下兩個數(shù)據(jù)非同源,因為域名不同*/
http://www.abc123.com.cn/item/a.js
http://www.abc123.com/item/a.js

/*以下兩個數(shù)據(jù)非同源,因為主機名不同*/
http://www.abc123.com.cn/item/a.js
http://item.abc123.com.cn/item/a.js

/*以下兩個數(shù)據(jù)非同源,因為協(xié)議不同*/
http://www.abc123.com.cn/item/a.js
http://www.abc123.com.cn:8080/item/a.js

/* 以下兩個數(shù)據(jù)非同源,域名和 ip 視為不同源
 * 這里應(yīng)注意,ip和域名替換一樣不是同源的
 * 假設(shè)www.abc123.com.cn解析后的 ip 是 195.155.200.134
 */
http://www.abc123.com.cn/
http://195.155.200.134/

/*以下兩個數(shù)據(jù)同源*/                               /* 這個是同源的*/
http://www.abc123.com.cn/source/a.html
http://www.abc123.com.cn/item/b.js
Ajax

Ajax在編寫時一共4個步驟:

創(chuàng)建 xhr 對象

設(shè)置傳輸?shù)刂?/p>

設(shè)置回調(diào)函數(shù)

發(fā)送數(shù)據(jù)

常見的發(fā)送方式有 GET 和 POST,除此之外還有 HEAD, DELETE, TRACE, PUT, CONNECT, OPTIONS和 PATCH等,這里只舉例前兩個 GET 和 POST。

例如根據(jù)姓名查詢一個人的信息并寫在div#output中

//GET 方法
function search(name, fun){
  var xhr = new XMLHttpRequest();
  var url = "search.php?name=" + window.encodeURIComponent(name) + "&t=" + Math.random();
  xhr.open("GET", url);
  xhr.send();
  xhr.onreadystatechange = function(){
    if(xhr.readyState == 4 && xhr.status == 200){
        var data = JSON.parse(xhr.responseText);   //獲取了 JSON 字符串
        fun(data);
    }
  }
}
function show(data){
    this.innerHTML = "姓名:" + data.name + "
性別:" + data.gender + "
年齡:" + data.age + "
地址:" + data.address + "
電話:" + data.tel; } var output = document.getElementById("output"); search("李華", show.bind(output)); //服務(wù)器端 search.php
//POST方法
function search(name, fun){
  var xhr = new XMLHttpRequest();
  var url = "search.php";
  var para = "name=" + window.encodeURIComponent(name) + "&t=" + Math.random();
  xhr.open("POST", url);
  //POST方式下,必須把 Content-Type 設(shè)置為application/x-www-form-urlencoded
  xhr.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
  xhr.onreadystatechange = function(){
    if(xhr.readyState == 4 && xhr.status == 200){
      console.log(xhr.responseText);
        var data = JSON.parse(xhr.responseText);   //獲取了 JSON 字符串
        fun(data);
    }
  }
  xhr.send(para);
}
function show(data){
    this.innerHTML = "姓名:" + data.name + "
性別:" + data.gender + "
年齡:" + data.age + "
地址:" + data.address + "
電話:" + data.tel; } var output = document.getElementById("output"); search("李華", show.bind(output)); //服務(wù)器端 search.php

上述代碼的 jQuery 寫法:

//GET 方式
function search(name, fun){
  var url = "search.php?name=" + window.encodeURIComponent(name) + "&t=" + Math.random();
  $.get(url, fun);
}
function show(data){
  data = JSON.parse(data);
    this.innerHTML = "姓名:" + data.name + "
性別:" + data.gender + "
年齡:" + data.age + "
地址:" + data.address + "
電話:" + data.tel; } var output = document.getElementById("output"); search("李華", show.bind(output));
//POST 方式
function search(name, fun){
  var url = "search.php";
  var obj = {};
  obj.name = name;
  obj.t = Math.random();
  $.post(url, obj, fun);
}
function show(data){
  data = JSON.parse(data);
    this.innerHTML = "姓名:" + data.name + "
性別:" + data.gender + "
年齡:" + data.age + "
地址:" + data.address + "
電話:" + data.tel; } var output = document.getElementById("output"); search("李華", show.bind(output));
Ajax常見問題 緩存問題

細(xì)心一些可以發(fā)現(xiàn),上面發(fā)送請求的數(shù)據(jù)中加入了一個隨機數(shù) t。因為有時服務(wù)器更新的了數(shù)據(jù)后,我們再一次執(zhí)行 Ajax 請求不能顯示新的結(jié)果,這是由于 js 為了加速,頁面會使用緩存保持當(dāng)前調(diào)用的相同鏈接。我們加了一個隨機數(shù)以后,每次請求不同,瀏覽器就不會使用緩存數(shù)據(jù)了。

中文亂碼問題

返回的中文數(shù)據(jù)亂碼是因為 js 頁面和action頁面中使用了不同的編碼方式導(dǎo)致的。可以有以下2中方式解決(瀏覽器 html 文件是 urf-8 編碼的):

對請求數(shù)據(jù)字段進行2次 encodeURI 編碼,服務(wù)器獲取數(shù)據(jù)后做一次 UTF-8 轉(zhuǎn)碼

對請求數(shù)據(jù)字段進行1次 encodeURI 編碼,服務(wù)器獲取數(shù)據(jù)后做一次 ISO-8859-1 轉(zhuǎn)換 和一次 UTF-8 轉(zhuǎn)碼

tips: 考慮到兼容性,第1個方法更好

兼容性問題

之前的代碼并沒有按兼容性的格式書寫,不過 Ajax 的兼容也不難,主要表現(xiàn)在 XMLHTTPRequest對象獲取環(huán)節(jié):

var xhr;
if(XMLHttpRequest){
  xhr = new XMLHttpRequest();    //chrome, safari, opera, firefox
} else if(ActionXObject){
  try{
    xhr = new ActionXObject("Msxml2.XMLHTTP");   //IE 中 Msxml 插件
  }catch(e){
    xhr = new ActionXObject("Microsoft.XMLHTTP");   //IE
  }
}
GET和POST方式對比
--- GET POST
后退/刷新 無害 數(shù)據(jù)會重新提交
書簽 可藏為書簽 無法藏為書簽
緩存 可以緩存 不可以緩存
MIME類型 application/x-www-from-urlencode application/x-www-from-urlencode或 multipart/form-data (二進制為多重編碼
歷史記錄 參數(shù)保留在歷史記錄中 參數(shù)不會留在歷史記錄
數(shù)據(jù)長度 URL最長2048個字符(2kB) 無限
數(shù)據(jù)類型 ASCII字符 無限
安全性
可見性 數(shù)據(jù)可見 數(shù)據(jù)不可見
跨域數(shù)據(jù)訪問 JSONP

這里需要強調(diào)的是,jsonp不屬于Ajax的部分,它只是吧url放入script標(biāo)簽中實現(xiàn)的數(shù)據(jù)傳輸,主要優(yōu)點是不受同源策略限制。由于一般庫也會把它和Ajax封裝在一起,所以這里放在一起討論。下面是一個jsonp的例子(實現(xiàn)功能:輸入手機號碼查詢歸屬地和運營商):




    
    兼容問題
    



上述代碼的全部js部分可以用jQuery實現(xiàn),如下:

function jsonpCallback(data) {        
    $("#output").text(data.province + " " + data.catName);    
}
$("#search").click(function(){
    var num = $("#tel").val();
    if(/^1[34578]d{9}$/.test(num)){
        var url = "http://tcc.taobao.com/cc/json/mobile_tel_segment.htm?tel=" + num" + "t=" + Math.random();   
        $.ajax({
            url: url, 
            type: "GET", 
            dataType: "JSONP",  // 處理Ajax跨域問題(本質(zhì)已不是Ajax)
            success: function(data){ 
                $("#output").text(data.province + " " + data.catName);
            }
        });
    } else {
        alert("您輸入的手機號有誤")
    }
});
其他 Ajax 參數(shù)及方法

javascript

//屬性
xhr.responseText;   //從服務(wù)器返回的字符串?dāng)?shù)據(jù)
xhr.responseXML;   //從服務(wù)器返回的 XML 數(shù)據(jù)
xhr.status;    //服務(wù)器相應(yīng)狀態(tài)
xhr.readyState;    //0: 請求未初始化; 1: 已建立連接; 2: 請求已接收; 3: 請求處理中; 4: 響應(yīng)已就緒
xhr.timeout;    //指定多少毫秒后超時,長整型
xhr.upload;    //獲取上傳進度
xhr.withCredentials;    //是否可以跨源,boolean 型,默認(rèn) false
//方法
xhr.getResponseHeader("connection");   //獲取指定頭信息
xhr.getAllResponseHeaders();   //獲全部定頭信息
xhr.open("METHOD", url, isAsyn);   //open方法有3個參數(shù),最后一個參數(shù)是 Boolean 型,表示是否異步,默認(rèn)為 true
xhr.abort();   //終止請求,置xhr.readyState為0,但不觸發(fā)onreadystatechange
xhr.overrideMimeType()   //強制重寫 http 頭的 MIME 類型
//事件
XMLHttpRequestEventTarget.onreadystatechange   //在xhr.readyState屬性改變時觸發(fā)
XMLHttpRequestEventTarget.ontimeout   //在響應(yīng)超時時觸發(fā)
XMLHttpRequestEventTarget.onabort   //當(dāng)請求失敗時調(diào)用該方法
XMLHttpRequestEventTarget.onerror   //當(dāng)請求發(fā)生錯誤時調(diào)用該方法
XMLHttpRequestEventTarget.onload   //當(dāng)一個HTTP請求正確加載出內(nèi)容后返回時調(diào)用。
XMLHttpRequestEventTarget.onloadstart   //當(dāng)一個HTTP請求開始加載數(shù)據(jù)時調(diào)用。
XMLHttpRequestEventTarget.onloadend   //當(dāng)內(nèi)容加載完成,不管失敗與否,都會調(diào)用該方法
XMLHttpRequestEventTarget.onprogress   //間歇調(diào)用該方法用來獲取請求過程中的信息。

注:關(guān)于 xhr.status 可能的返回值,詳見 http狀態(tài)碼

jQuery 中的 Ajax 方法 ajax 靜態(tài)方法
$.ajax({options})    //發(fā)起一個 ajax 請求
options 常用以下屬性設(shè)置:url, method("GET"/"POST"), crossDomain, accepts(可接受的類型), dataType, cache, contentType(編碼格式), success, error等
$.ajaxSetup({options});    //options同上,設(shè)置 ajax 默認(rèn)參數(shù),不建議使用
$.post(url, data, success, datatype);    //發(fā)起一個 POST 請求 data為傳遞參數(shù)(可選), success(reponseText, statusText, xhr)  為成功時的回調(diào)函數(shù)(可選), datatype(xml/html/script/json/jsonp/text,可選)
$.get(url, data, success, datatype);    //發(fā)起一個 GET 請求, 參數(shù)同上
$.getScript(url, data, success)    //以 GET 請求獲取一個 JS 文件并執(zhí)行,參數(shù)含義同上
$.getJSON(url, data, success)    //以 GET 請求獲取一個 JSON 字符串,參數(shù)含義同上
ajax 動態(tài)方法
$().ajaxComplete(function(){});    //注冊Ajax請求完成時要調(diào)用的處理程序
$().ajaxError(function(){});    //注冊要在Ajax請求完成時遇到錯誤而調(diào)用的處理程序
$().ajaxSend(function(){});    //附加要在發(fā)送Ajax請求之前執(zhí)行的函數(shù)
$().ajaxStart(function(){});    //注冊在第一個Ajax請求開始時要調(diào)用的處理程序
$().ajaxStop(function(){});    //注冊要在所有Ajax請求完成后調(diào)用的處理程序
$().ajaxSuccess(function(){});    //附加要在Ajax請求成功完成時執(zhí)行的函數(shù)
$().load(url, data, callback);    //返回某 url 的數(shù)據(jù),data為傳遞參數(shù)(可選), callback(reponseText, statusText, xhr) 回調(diào)函數(shù)(可選)
其他相關(guān)方法
$.param(obj);    //將對象轉(zhuǎn)化為一個 url 參數(shù)列表
$(form).serialize();    //表單數(shù)據(jù)序列化為 url 參數(shù)列表
$(form).serializeArray();    //同上,但返回 JSON 串
簡單封裝 Ajax 相關(guān)方法

簡單模仿 jQuery 中 $.ajax() 方法

(function(){
  // Ajax 選項
  var options = {
    type: "GET",   //提交方式
    url: "",    //路徑
    params: {},   //請求參數(shù)
    dataType: "text",   //內(nèi)容類型
    success: function(){},   //回調(diào)函數(shù)
    error: function(){}
  };

  //獲取 XMLHTTPRequest 對象
  var createRequest = function(){
    var xmlhttp;
    if(xmlhttp.XMLHttpRequest){
      xmlhttp = new XMLHttpRequest();
    }
    else{
      xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");
    }
    if(xmlhttp.overrideMimeType){
      xmlhttp.overrideMimeType("text/xml");  //修改 MIME 類型
    }
    return xmlhttp;
  },

  // 設(shè)定 Ajax 選項
  var setOptions = function(newOptions){
    for(var prop in newOptions){
      if(newOptions.hasOwnProperty(prop)){
        this.option[prop] = newOptions[prop];
      }
    }
  },

  //格式化參數(shù)列表
  var formatParameters = function(){
    var paramsArr = [];
    var params = this.options.params;
    for(var prop in params){
      if(params.hasOwnProperty(prop)){
        paramsArr.push(prop + "=" + encodeURIComponent(params[prop]));
      }
    }
    return paramsArr.join("&");
  },

  //預(yù)處理并調(diào)用相應(yīng)函數(shù)
  var readystatechange = function(xmlhttp){
    var returnValue;
    if(xmlhttp.readyState == 4 && xmlhttp.status == 200){
      switch(this.options.dataType){
        case "xml":
          returnValue = xmlhttp.responseXML;
          break;
        case "json":
          returnVaue = xmlhttp.responseText;
          if(returnValue){
            returnValue = eval("(" + returnValue + ")");
          }
          break;
        default:
          returnVaue = xmlhttp.responseText;
          break;
      }
      if(returnValue){
        this.options.success(returnValue);
      }
      else{
        this.options.success();
      }
    } else{
      this.options.error();
    }
  },

  //發(fā)送請求,也就是$.ajax()函數(shù)
  var request = function(options){
    // var ajaxObj = this;

    var xmlhttp = this.createRequest();
    this.setOptions(options);
    xmlhttp.onreadystatechange = this.readystatechange.bind(null, xmlhttp);

    var formatParams = this.formatParameters();
    var type = this.options.type;
    var url = this.options.url;

    if("GET" === type.toUpperCase()){
      url += "?" + formatParameters;
    }
      xmlhttp.open(type, url, true);

    if("GET" === type.toUpperCase()){
      xmlhttp.send();
    } else if("POST" === type.toUpperCase()){
      xmlhttp.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
      xmlhttp.send(formatParameters);
    }
  }

  window.$.ajax = request;  //暴露方法到閉包外面去
})();

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/97335.html

相關(guān)文章

  • 深入淺出Ajax

    摘要:在接收響應(yīng)期間持續(xù)不斷地觸發(fā)。在請求發(fā)生錯誤時觸發(fā)。在通信完成或者觸發(fā)或事件后觸發(fā)。已經(jīng)接收到部分響應(yīng)數(shù)據(jù)。基于標(biāo)準(zhǔn)被廣泛支持。破壞程序的異常處理機制。 原文(我的GitHub):https://github.com/liangfengbo/frontend-ability/issues/1 學(xué)習(xí)大綱 理解Ajax的工作原理 Ajax核心-XMLHttpRequest對象 封裝Aja...

    megatron 評論0 收藏0
  • AJAX面試題都在這里

    摘要:常見面試題什么是,為什么要使用是的縮寫。該對象在中首次引入,它是一種支持異步請求的技術(shù)。頭信息已經(jīng)接收,響應(yīng)數(shù)據(jù)尚未接收。同源策略是客戶端腳本尤其是的重要的安全度量標(biāo)準(zhǔn)。這樣頁面的所有都會執(zhí)行這條語句就是不需要保存緩存記錄。 AJAX常見面試題 什么是AJAX,為什么要使用Ajax AJAX是Asynchronous JavaScript and XML的縮寫。他是指一種創(chuàng)建交互式網(wǎng)頁...

    QiShare 評論0 收藏0
  • 深入了解ajax

    摘要:而由于安全風(fēng)險的原因,被禁止使用。就好比單線程一樣,請求發(fā)出后就進入阻塞狀態(tài),直到解除阻塞,余下的代碼才會繼續(xù)執(zhí)行。安全問題暴露了與服務(wù)器交互的細(xì)節(jié)。破壞了程序的異常機制。服務(wù)器端暫時無法處理請求可能是過載或維護。 AJAX全稱Asynchronous JavaScript and XML(異步JavaScript和XML),是指一種創(chuàng)建交互式網(wǎng)頁應(yīng)用的網(wǎng)頁開發(fā)技術(shù)。它有機地包含了以下...

    zhouzhou 評論0 收藏0
  • 再也不學(xué)AJAX了!(二)使用AJAX

    摘要:隨著對象被廣泛的接收,也開始著手制定相應(yīng)的標(biāo)準(zhǔn)來規(guī)范其行為。四設(shè)置請求頭每個請求和響應(yīng)都會帶有相應(yīng)的頭部信息,包含一些與數(shù)據(jù),收發(fā)者網(wǎng)絡(luò)環(huán)境與狀態(tài)等相關(guān)信息。該方法會令對象實例停止觸發(fā)事件,并且不再允許訪問任何和響應(yīng)有關(guān)的對象屬性。 在上一篇文章中我們知道,AJAX是一系列技術(shù)的統(tǒng)稱。在本篇中我們將更進一步,詳細(xì)解釋如何使用Ajax技術(shù)在項目中獲取數(shù)據(jù)。而為了解釋清楚,我們首先要搞清楚...

    nemo 評論0 收藏0
  • ajaxajax的封裝

    摘要:此外使用的時候必須在請求數(shù)據(jù)上面添加接收返回值使用會想用一個事件事件當(dāng)請求被發(fā)送到服務(wù)器時,我們需要執(zhí)行一些基于響應(yīng)的操作。 AJAX 就是瀏覽器提供的一套API 可以通過javascript調(diào)用 從而實現(xiàn)通過代碼控制請求與響應(yīng) 實現(xiàn)網(wǎng)絡(luò)編程AJAX 在瀏覽器端進行網(wǎng)絡(luò)編程(發(fā)送請求 接受響應(yīng))的技術(shù)方案通過javascript直接獲取服務(wù)器的最新的內(nèi)容而不必重新加載頁面 讓...

    Donne 評論0 收藏0
  • JavaWEB開發(fā)14——ajax

    摘要:一概述什么是同步,什么是異步同步現(xiàn)象客戶端發(fā)送請求到服務(wù)器端,當(dāng)服務(wù)器返回響應(yīng)之前,客戶端都處于等待卡死狀態(tài)異步現(xiàn)象客戶端發(fā)送請求到服務(wù)器端,無論服務(wù)器是否返回響應(yīng),客戶端都可以隨意做其他事情,不會被卡死的運行原理頁面發(fā)起請求,會將請求發(fā)送 一、Ajax概述1.什么是同步,什么是異步同步現(xiàn)象:客戶端發(fā)送請求到服務(wù)器端,當(dāng)服務(wù)器返回響應(yīng)之前,客戶端都處于等待 卡死狀態(tài)異步現(xiàn)象:客戶...

    yearsj 評論0 收藏0

發(fā)表評論

0條評論

最新活動
閱讀需要支付1元查看
<