# AJAX (with jQuery) ###### tags: `AJAX` 以傳統來說,送出表單後,會把資料丟給後端的server判斷有沒有錯誤,然後頁面會跳到下一頁告訴你結果(換頁): ![](https://i.imgur.com/AmkNltt.png) 但以AJAX來做的話,送出資料時會在背景偷偷做,再偷偷把判斷結果送回來,且會更新在同一個頁面(不換頁): ![](https://i.imgur.com/yv4JkPy.png) ## post & get get request 會把parameters帶進網址,而post request則不會把參數顯示在網址上: ![](https://i.imgur.com/DFdoRge.png) ## RESTful API 除了一般API的get、post之外,還另外衍生出了put與delete,等於是把CRUD直接用API來實作: ![](https://i.imgur.com/HBpBl4C.png) ![](https://i.imgur.com/AkKgu36.png) ![](https://i.imgur.com/hmTFXlq.png) ## $.ajax / $.post / $.get $.ajax主要在做3件事,給參數、要data、處理data,主要格式如下: ![](https://i.imgur.com/lwnjqFD.png) 上面的data是我們要給的參數(object type),下面的complete是當request有送出,success最重要,因為他會收到我們需要的data,我們就是要針對這個data做操作,error就是錯誤訊息,通常會把這個訊息給user看。 $.post就是簡化ajax內容而來的: ![](https://i.imgur.com/Of0GjUQ.png) 其中要給的參數前面也不用打data:,全部改以逗號分隔 $.get也一樣: ![](https://i.imgur.com/1MSVfP5.png) 範例,先準備好要傳遞的參數,再用post: ![](https://i.imgur.com/QlPcIJE.png) 另一種更簡略的方式,使用serialize,但只能用在form,會自動整理form裡面的元素,最後送出的格式有點像get,中間用&隔開: ![](https://i.imgur.com/3cTihyu.png) ## 資料型態 ### HTML 資料回傳就直接是HTML格式,可以直接塞進程式碼中。 ### JSON JS內建的格式,以物件的格式存放,中間也可以儲存list,或是多層物件: ![](https://i.imgur.com/odzd0l9.png) ![](https://i.imgur.com/t31YUen.png) ### JSONP 就是JSON with Padding,為什麼要有JSONP,這關於cross domain issue,也就是說,在不同網站的server,不能拿取對方的資料: ![](https://i.imgur.com/bc7BsW1.png) 因為有規定Same-orgin policy: ![](https://i.imgur.com/w6g6gEl.png) 範例: ![](https://i.imgur.com/3pResWM.png) 如果違反Same-orgin policy就會產生cross domain issue。 所以現在有很多網站有提供API,可以透過API拿資料,但是要如何解決cross domain issue?,答案就是使用JSONP。 也就是在外面包一個padding,這個padding就是一個js的程式,等於是跟別的網站要一個js的程式: ![](https://i.imgur.com/uvdytBP.png) 那要如何使用呢? 必須要使用在ajax裡面,因為會使用到不同的參數,也只有ajax才能寫那麼多參數,request形態要用GET,Type要設定為jsonp,jsonCallback就是要看對方的api文件來決定要回傳的內容,就可以把data拿來使用: ![](https://i.imgur.com/ZzBDC9w.png) ## 實際操作instegram API 透過Instegram的API來利用jsonp讀取popular的資料,此範例不須寫callback function,成功回傳data後,利用$each功能針對每一個資料做處理,後面的function裡的參數是index與內容(photo),宣告一個DOM(li),然後把每個圖片的網址放進去,最後再append回id="photos"的位置: ![](https://i.imgur.com/R4yGMVb.jpg) ## MAMP MAMP是一個可以把電腦變成執行apache server的工具,透過MAMP可以把我們的網站透過http protocol來執行網頁,才能使ajax順利執行。 MAMP -> https://www.mamp.info/en/windows/ ![](https://i.imgur.com/f7wEicx.png) 測試(port80): ![](https://i.imgur.com/aazOdsh.png) ## 透過AJAX做到只換內容不換頁 html架構: ![](https://i.imgur.com/G4mR9kI.png) ![](https://i.imgur.com/xSdpzZN.png) ![](https://i.imgur.com/YHmFgel.jpg) 我們希望點擊之後只更換內容,而不是刷新整個頁面。 所以透過ajax來做,首先docoment ready之後,當點擊navigation的a時,就觸發事件,先把他的預設動作(切換頁面)擋下來,然後抓這個a連結到的網址,然後再使用ajax的.get function,針對目標網址,然後傳參數(但因這邊不需任何參數,所以傳一個空物件),然後再寫一個callback function來接收傳回的data,回傳回來的格式則是設定html,成功取到data後,在把他寫回content的html內: ![](https://i.imgur.com/AAMHG09.png) 補強:因為一開始的內容是Intro haha,那如果我們一開始就想顯示Home的內容呢,有一個比較直觀的做法是直接把Home.php的內容複製一分到html裡面,但是這樣做等於把同樣的東西放在兩個不同的地方,而且,萬一更改Home.php裡的內容時,預設頁面的內容卻還是沒有更改,所以我們的補強方法是,透過js在一開始時就抓取home.php的內容: ![](https://i.imgur.com/Xeddltg.png) 再進化:因為讀取data再把內容再進html這一段的code幾乎一模一樣,所以單獨寫成function: ![](https://i.imgur.com/8lKyQEY.png) ## 範例練習Random User Generator Random user generator是一個工具來製作假資料(類似lorem) -> https://randomuser.me/ 這邊不需要用jsonp的原因是這網站用一些特殊的手法不需要另外包padding來偽裝成js,因為這本來就是做假資料的,沒有甚麼安全疑慮: ![](https://i.imgur.com/bLyTe2N.png) 實作: ![](https://i.imgur.com/RLfDTX1.png) 把data內容製作成DOM物件: ![](https://i.imgur.com/ZpcXlbq.png) 將DOM塞回去: ![](https://i.imgur.com/aq8JqQg.png) 改取多位user,根據document來加入帶參數: ![](https://i.imgur.com/NR6FraU.png) ![](https://i.imgur.com/jR27zGt.png) 利用jQuery的$each功能針對每一個來做: ![](https://i.imgur.com/O8PAa1B.png) ## 範例練習todo list ### Creat部分 假設透過PHP來接收傳進來的todo content,然後儲存進DB,之後再以POST回傳結果,然後打包成JSON檔: ![](https://i.imgur.com/qlXpXWb.png) 配合前端AJAX,改為把內容先送到後端,再從回傳值取資料(data),最後再加上一個簡單的判斷是否success: ![](https://i.imgur.com/xOQaHAB.png) ### Update部分 正常來說,會給每一個item對應的id,這樣在更新DB的時候才能知道要更新哪一個內容: ![](https://i.imgur.com/QvmNRbb.png) 配合前端AJAX: ![](https://i.imgur.com/ZlBf5mf.png) 但是並沒有成功: ![](https://i.imgur.com/gJvjCap.png) 問題就出在this,因為之前的this是指事件發生(input)的當下環境,若放到ajax call裡面則是代表ajax,就不是原本的環境了: ![](https://i.imgur.com/nC9VmQ5.png) 所以要把this改為e.currentTarget,因為e沒有被取代掉: ![](https://i.imgur.com/3Bt3bQB.png) ### delete部分 php: ![](https://i.imgur.com/QSFEBD2.png) ajax: ![](https://i.imgur.com/rtMxjmt.png) ![](https://i.imgur.com/JbMJsjz.png)
×
Sign in
Email
Password
Forgot password
or
By clicking below, you agree to our
terms of service
.
Sign in via Facebook
Sign in via Twitter
Sign in via GitHub
Sign in via Dropbox
Sign in with Wallet
Wallet (
)
Connect another wallet
New to HackMD?
Sign up