以前公司的ajax學習分享,作一點總結,加深記憶php
異步的的js和xml,用js異步形式操做xml,工做主要是數據交互html
oBtn.onclick = function () { // 打開瀏覽器 var xhr = new XMLHttpRequest(); // 打開地址 xhr.open('get', './1.txt', true); // 提交 xhr.send(); // 等待服務器返回內容 xhr.onreadystatechange = function () { if(xhr.readyState === 4) { alert(xhr.responseText); } } }
不兼容ie6一下,須要寫判斷 window.XMLHttpRequestajax
try { } catch(e) { } // 代碼嘗試執行這個`try`塊中的內容,若是有錯誤,則會執行catch{}不會影響程序執行
xhr = new XMLHttpRequest();
參數 打開的方式,數據地址,是否異步json
異步: 非阻塞 前面的代碼不會影響後面代碼的執行 setTimeout true 通常用異步的形式
同步: 阻塞 當前面的工做沒有作完,後面會阻塞 好比jq庫的加載 false 後續的內容須要前面掛鉤,後端
action: 數據提交的地址,默認的當前頁面
method: 數據提交的方式,默認get方式跨域
get
把數據名稱和數據值用=鏈接,若是有多個數據,會用&進行鏈接,而後把數據放到url?後面
不要經過get傳遞過多的數據,數據多少根據各個瀏覽器決定瀏覽器
post
數據在請求頭,發送數據是串聯形式,可是位置不同,理論上沒有限制
enctype: 提交的數據格式,默認application/x-www-form-urlencoded
須要在表格中 method="post"
緩存
get請求和post通常用於何種需求安全
get 方式的歷史記錄會被記錄,影響用戶隱私,不太安全,只能傳字符串服務器
post 經過請求頭,能夠用於多種數據類型
怎麼獲得ajax 返回的數據
xhr.responseText
: 返回的數據會放在這個屬性,類型是字符串類型
readyState
: ajax工做狀態 0 1 2 3 4
xhr.send()
onreadychange
當狀態值改變的時候觸發
xhr.onreadystatechange = function() { if(xhr.readyState = 4) { // code } }
請求資源的時候,服務器會返回一個狀態值
能夠作更好的容錯處理
xhr.onreadystatechange = function() { if(xhr.readyState = 4) { if(xhr.status === 200) { // 請求正確 } else { alert('error'); } } }
var oBtn = document.getElementById('btn'); oBtn.onclick = function () { var xhr = new XMLHttpRequest(); xhr.open('get','form.get.php?username=may&age=30',true); xhr.send(); xhr.onreadystatechange = function () { if(xhr.readyState === 4) { if (xhr.status === 200) { alert(xhr.responseText) } else { alert('error') } } } }
注意:
1 若是不想存在緩存問題 能夠給請求後面加隨機數或者時間戳
xhr.open('get','form.get.php?username=may&age=30&' + new Date(),true);
2 中文亂碼問題,能夠用編碼 encodeURI
xhr.open('get','form.get.php?username='+encodeURI('文件') +'&age=30&' + new Date(),true);
數據做爲參數放在send方法裏面,而且設置請求頭
var oBtn = document.getElementById('btn'); oBtn.onclick = function (){ var xhr = new XMLHttpRequest(); xhr.open('post', 'form.post.php', true); xhr.setRequestHeader('content-type', 'application/x-www-form-urlencoded'); // 須要告訴後端發送數據的類型 xhr.send('username=may&age=30'); xhr.onreadystatechange = function () { if(xhr.readyState === 4) { if(xhr.status = 200) { alert(xhr.responseText); } } } }
post沒有緩存問題,它自己就是提交數據
post沒有轉碼的問題
var oBtn = document.getElementById('btn'); var oul = document.getElementById('ul'); oBtn.onclick = function () { var xhr = new XMLHttpRequest(); xhr.open('get', 'getNew.php', true); xhr.send(); xhr.onreadystatechange = function () { if(xhr.readyState === 4) { if(xhr.status === 200) { var data = JSON.parse(xhr.responseText); var html = ''; for (var i = 0; i < data.length; i++) { html += '<li><a href="">' + data[i].title + '</a><span>' + data[i].date+ '</span></li>' } oul.innerHTML = html; } } } }
計算最短的li的高度 + top值 < 可視區的高度 + 滾動條的高度 document.documentElement.scrollTop || document.body.scrollTop
數據加載完的時候
應該對每次取到的數據進行判斷,若是沒有數據, return 出去
後端傳值寬高 若是寬度肯定 200 高度就是
element.height * (200/element.width) document.createElement('li');
一個域名的文件去請求和它不同的域名下的資源文件,就會產生跨域請求
瀏覽器由於安全問題不容許跨域請求,能夠採用
從另外的域名,把資源拿取過來
在資源加載進來以前定義好一個函數,這個函數接收一個參數(數據),函數利用這個參數作一些事情
而後須要的時候經過script標籤加載對應遠程文件資源,當遠程的問價資源被加載進來的時候,就會去執行咱們前面定義好的函數,而且把數據當作這個函數的參數傳入進來
若是想實現按需加載,好比當用戶點擊的時候?
當用戶點擊的時候建立 script
標籤,加載到 body
標籤後面,從而實現按需加載