<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                ??碼云GVP開源項目 12k star Uniapp+ElementUI 功能強大 支持多語言、二開方便! 廣告
                ### 一、AJAX 簡介 AJAX即“Asynchronous Javascript And XML”(異步JavaScript和XML),是指一種創建交互式網頁應用的網頁開發技術。 AJAX 是一種用于創建快速動態網頁的技術。 通過在后臺與服務器進行少量數據交換,AJAX 可以使網頁實現異步更新。這意味著可以在不重新加載整個網頁的情況下,對網頁的某部分進行更新。傳統的網頁(不使用 AJAX)如果需要更新內容,必須重載整個網頁頁面。AJAX 技術的廣泛使用,對B/S模式應用慢慢取代了桌面軟件起到了很大的推動作用。 ### 二、同步、異步傳輸的區別 異步傳輸是面向字符的傳輸,它的單位是字符;而同步傳輸是面向比特的傳輸,它的單位是楨,它傳輸的時候要求接受方和發送方的時鐘是保持一致的。 **異步傳輸** 具體來說,異步傳輸是將比特分成小組來進行傳送。一般每個小組是一個8位字符,在每個小組的頭部和尾部都有一個開始位和一個停止位,它在傳送過程中接收方和發送方的時鐘不要求一致,也就是說,發送方可以在任何時刻發送這些小組,而接收方并不知道它什么時候到達。 一個最明顯的例子就是計算機鍵盤和主機的通信,按下一個鍵的同時向主機發送一個8比特位的ASCII代 碼,鍵盤可以在任何時刻發送代碼,這取決于用戶的輸入速度,內部的硬件必須能夠在任何時刻接收一個鍵入的字符。這是一個典型的異步傳輸過程。 異步傳輸存在 一個潛在的問題,即接收方并不知道數據會在什么時候到達。在它檢測到數據并做出響應之前,第一個比特已經過去了。這就像有人出乎意料地從后面走上來跟你說 話,而你沒來得及反應過來,漏掉了最前面的幾個詞。因此,每次異步傳輸的信息都以一個起始位開頭,它通知接收方數據已經到達了,這就給了接收方響應、接收 和緩存數據比特的時間;在傳輸結束時,一個停止位表示該次傳輸信息的終止。按照慣例,空閑(沒有傳送數據)的線路實際攜帶著一個代表二進制1的信號。步傳輸的開始位使信號變成0,其他的比特位使信號隨傳輸的數據信息而變化。最后,停止位使信號重新變回1,該信號一直保持到下一個開始位到達。例如在鍵盤上數字“1”,按照8比特位的擴展ASCII編碼,將發送“00110001”,同時需要在8比特位的前面加一個起始位,后面一個停止位。 **同步傳輸** 同步傳輸的比特分組要大得多。它不是獨立地發送每個字符,每個字符都有自己的開始位和停止位,而是把它們組合起來一起發送。我們將這些組合稱為數據幀,或簡稱為幀。 數據幀的第一部分包含一組同步字符,它是一個獨特的比特組合,類似于前面提到的起始位,用于通知接收方一個幀已經到達,但它同時還能確保接收方的采樣速度和比特的到達速度保持一致,使收發雙方進入同步。 幀的最后一部分是一個幀結束標記。與同步字符一樣,它也是一個獨特的比特串,類似于前面提到的停止位,用于表示在下一幀開始之前沒有別的即將到達的數據了。 同步傳輸通常要比異步傳輸快速得多。接收方不必對每個字符進行開始和停止的操作。一旦檢測到幀同步字符,它就在接下來的數據到達時接收它們。另外,同步傳輸的開銷也比較少。例如,一個典型的幀可能有500字節(即4000比特)的數據,其中可能只包含100比特的開銷。這時,增加的比特位使傳輸的比特總數增加2.5%,這與異步傳輸中25 %的增值要小得多。隨著數據幀中實際數據比特位的增加,開銷比特所占的百分比將相應地減少。但是,數據比特位越長,緩存數據所需要的緩沖區也越大,這就限制了一個幀的大小。另外,幀越大,它占據傳輸媒體的連續時間也越長。在極端的情況下,這將導致其他用戶等得太久。 了解了同步和異步的概念之后,大家應該對ajax為什么可以提升用戶體驗應該比較清晰了,它是利用異步請求方式的。打個比方,如果現在你家里所在的小區因 某種情況而面臨停水,現在有關部門公布了兩種方案,一是完全停水8個小時,在這8個小時內完全停水,8個小時后恢復正常。二是不完全停水10 個小時,在這10個小時內水沒有完全斷,只是流量比原來小了很多,在10個小時后恢復正常流量,那么,如果是你你會選擇哪種方式呢?顯然是后者。 ### 三、AJAX 所包含的技術 大家都知道ajax并非一種新的技術,而是幾種原有技術的結合體。它由下列技術組合而成。 1.使用CSS和XHTML來表示。 2\. 使用DOM模型來交互和動態顯示。 3.使用XMLHttpRequest來和服務器進行異步通信。 4.使用javascript來綁定和調用。 在上面幾中技術中,除了XmlHttpRequest對象以外,其它所有的技術都是基于web標準并且已經得到了廣泛使用的,XMLHttpRequest雖然目前還沒有被W3C所采納,但是它已經是一個事實的標準,因為目前幾乎所有的主流瀏覽器都支持它。 ### 四、XMLHttpRequest 對象 Ajax的原理簡單來說通過XmlHttpRequest對象來向服務器發異步請求,從服務器獲得數據,然后用javascript來操作DOM而更新頁面。這其中最關鍵的一步就是從服務器獲得請求數據。要清楚這個過程和原理,我們必須對 XMLHttpRequest有所了解。 XMLHttpRequest是ajax的核心機制,它是在IE5中首先引入的,是一種支持異步請求的技術。簡單的說,也就是javascript可以及時向服務器提出請求和處理響應,而不阻塞用戶。達到無刷新的效果。? 所以我們先從XMLHttpRequest講起,來看看它的工作原理。? 首先,我們先來看看XMLHttpRequest這個對象的屬性。? 它的屬性有: ~~~ onreadystatechange 每次狀態改變所觸發事件的事件處理程序。 responseText 從服務器進程返回數據的字符串形式。 responseXML 從服務器進程返回的DOM兼容的文檔數據對象。 status 從服務器返回的數字代碼,比如常見的404(未找到)和200(已就緒) status Text 伴隨狀態碼的字符串信息 readyState 對象狀態值   0 (未初始化) 對象已建立,但是尚未初始化(尚未調用open方法)   1 (初始化) 對象已建立,尚未調用send方法   2 (發送數據) send方法已調用,但是當前的狀態及http頭未知   3 (數據傳送中) 已接收部分數據,因為響應及http頭不全,這時通過responseBody和responseText獲取部分數據會出現錯誤,   4 (完成) 數據接收完畢,此時可以通過通過responseXml和responseText獲取完整的回應數據 ~~~ **創建 XMLHttpRequest 對象** 所有現代瀏覽器 (IE7+、Firefox、Chrome、Safari 以及 Opera) 都內建了 XMLHttpRequest 對象。? 通過一行簡單的 JavaScript 代碼,我們就可以創建 XMLHttpRequest 對象。? 創建 XMLHttpRequest 對象的語法: ~~~ xmlhttp=new XMLHttpRequest(); ~~~ 老版本的 Internet Explorer (IE5 和 IE6)使用 ActiveX 對象: ~~~ xmlhttp=new ActiveXObject("Microsoft.XMLHTTP"); ~~~ **實例一** ~~~ <html> <head> <script type="text/javascript"> var xmlhttp; function loadXMLDoc(url) { xmlhttp=null; if (window.XMLHttpRequest) {// code for IE7, Firefox, Opera, etc. xmlhttp=new XMLHttpRequest(); } else if (window.ActiveXObject) {// code for IE6, IE5 xmlhttp=new ActiveXObject("Microsoft.XMLHTTP"); } if (xmlhttp!=null) { xmlhttp.onreadystatechange=state_Change; xmlhttp.open("GET",url,true); xmlhttp.send(null); } else { alert("Your browser does not support XMLHTTP."); } } function state_Change() { if (xmlhttp.readyState==4) {// 4 = "loaded" if (xmlhttp.status==200) {// 200 = "OK" document.getElementById('A1').innerHTML=xmlhttp.status; document.getElementById('A2').innerHTML=xmlhttp.statusText; document.getElementById('A3').innerHTML=xmlhttp.responseText; } else { alert("Problem retrieving XML data:" + xmlhttp.statusText); } } } </script> </head> <body> <h2>Using the HttpRequest Object</h2> <p><b>Status:</b> <span id="A1"></span> </p> <p><b>Status text:</b> <span id="A2"></span> </p> <p><b>Response:</b> <br /><span id="A3"></span> </p> <button onclick="loadXMLDoc('/example/xdom/note.xml')">Get XML</button> </body> </html> ~~~ 執行結果: ![](https://box.kancloud.cn/2016-03-15_56e77dba9feb1.jpg) 注釋:onreadystatechange 是一個事件句柄。它的值 (state_Change) 是一個函數的名稱,當 XMLHttpRequest 對象的狀態發生改變時,會觸發此函數。狀態從 0 (uninitialized) 到 4 (complete) 進行變化。僅在狀態為 4 時,我們才執行代碼。? 為什么使用 Async=true ?? 我們的實例在 open() 的第三個參數中使用了 “true”。? 該參數規定請求是否異步處理。? True 表示腳本會在 send() 方法之后繼續執行,而不等待來自服務器的響應。? onreadystatechange 事件使代碼復雜化了。但是這是在沒有得到服務器響應的情況下,防止代碼停止的最安全的方法。? 通過把該參數設置為 “false”,可以省去額外的 onreadystatechange 代碼。如果在請求失敗時是否執行其余的代碼無關緊要,那么可以使用這個參數。 **XML / ASP實例** 您也可以把 XML 文檔打開并發送到服務器上的 ASP 頁面,分析此請求,然后傳回結果。 ~~~ <html> <body> <script type="text/javascript"> xmlHttp=null; if (window.XMLHttpRequest) {// code for IE7, Firefox, Opera, etc. xmlHttp=new XMLHttpRequest(); } else if (window.ActiveXObject) {// code for IE6, IE5 xmlHttp=new ActiveXObject("Microsoft.XMLHTTP"); } if (xmlHttp!=null) { xmlHttp.open("GET", "note.xml", false); xmlHttp.send(null); xmlDoc=xmlHttp.responseText; xmlHttp.open("POST", "demo_dom_http.asp", false); xmlHttp.send(xmlDoc); document.write(xmlHttp.responseText); } else { alert("Your browser does not support XMLHTTP."); } </script> </body> </html> ~~~ ASP 頁面,由 VBScript 編寫: ~~~ <% set xmldoc = Server.CreateObject("Microsoft.XMLDOM") xmldoc.async=false xmldoc.load(request) for each x in xmldoc.documentElement.childNodes if x.NodeName = "to" then name=x.text next response.write(name) %> ~~~ 通過使用 response.write 屬性把結果傳回客戶端。 執行結果: ~~~ <to> : George ~~~ ### 五、AJAX 的缺點 AJAX的優點不言而喻。 下面所闡述的ajax的缺陷都是它先天所產生的。? 1、ajax干掉了back按鈕,即對瀏覽器后退機制的破壞。后退按鈕是一個標準的web站點的重要功能,但是它沒法和js進行很好的合作。這是ajax所帶來的一個比較嚴重的問題,因為用戶往往是希望能夠通過后退來取消前一次操作的。那么對于這個問題有沒有辦法?答案是肯定的,用過Gmail的知道,Gmail下面采用的ajax技術解決了這個問題,在Gmail下面是可以后退的,但是,它也并不能改變ajax的機制,它只是采用的一個比較笨但是有效的辦法,即用戶單擊后退按鈕訪問歷史記錄時,通過創建或使用一個隱藏的IFRAME來重現頁面上的變更。(例如,當用戶在Google Maps中單擊后退時,它在一個隱藏的IFRAME中進行搜索,然后將搜索結果反映到Ajax元素上,以便將應用程序狀態恢復到當時的狀態。)? 但是,雖然說這個問題是可以解決的,但是它所帶來的開發成本是非常高的,和ajax框架所要求的快速開發是相背離的。這是ajax所帶來的一個非常嚴重的問題。 2、安全問題? 技術同時也對IT企業帶來了新的安全威脅,ajax技術就如同對企業數據建立了一個直接通道。這使得開發者在不經意間會暴露比以前更多的數據和服務器邏輯。ajax的邏輯可以對客戶端的安全掃描技術隱藏起來,允許黑客從遠端服務器上建立新的攻擊。還有ajax也難以避免一些已知的安全弱點,諸如跨站點腳步攻擊、SQL注入攻擊和基于credentials的安全漏洞等。 3、對搜索引擎的支持比較弱。 4、破壞了程序的異常機制。至少從目前看來,像ajax.dll,ajaxpro.dll這些ajax框架是會破壞程序的異常機制的。關于這個問題,我曾經在開發過程中遇到過,但是查了一下網上幾乎沒有相關的介紹。后來我自己做了一次試驗,分別采用ajax和傳統的form提交的模式來刪除一條數據……給我們的調試帶來了很大的困難。 5、另外,像其他方面的一些問題,比如說違背了url和資源定位的初衷。例如,我給你一個url地址,如果采用了ajax技術,也許你在該url地址下面看到的和我在這個url地址下看到的內容是不同的。這個和資源定位的初衷是相背離的。 6、一些手持設備(如手機、PDA等)現在還不能很好的支持ajax,比如說我們在手機的瀏覽器上打開采用ajax技術的網站時,它目前是不支持的,當然,這個問題和我們沒太多關系。 注:”二、同步、異步傳輸的區別“、”三、ajax所包含的技術“和”五、AJAX 的缺點“主要來自于文章:? [http://www.cnblogs.com/mingmingruyuedlut/archive/2011/10/18/2216553.html](http://www.cnblogs.com/mingmingruyuedlut/archive/2011/10/18/2216553.html)
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看