###### tags:`AJAX` # AJAX - 5.傳統表單輸入-Methods:post 以下紀錄範例是申請帳號,去申請網站資料庫比對,帳號已經被使用還是還可以申請的方式.驗證資料庫是使用六角學院提供的[教學檔](https://github.com/hexschool/nodejs_ajax_tutorial)串接使用, #### 申請帳號 如果已被其他人使用,回傳**此帳號已被使用**,如果可以使用回傳**帳號註冊成功** #### 登入 登入一個已存在的帳號,帳號密碼正確跳出**登入成功**,帳號密碼有錯,跳出**此帳號不存在或帳號密碼錯誤** #### 重點講解 1. 關於表單輸入 2. methods:'post',setRequestHeader 2.1 application/x-www-form-urlencoded(預設值) 2.2 application/json 3. 實作:申請帳號/登入表-使用application/x-www-form-urlencoded格式 3.1 send data方式 5. 實作:申請帳號/登入表-使用application/json格式 4.1 send data方式 ### 關於表單輸入 step1.在html貼上表單語法 注意一.form action="" 注意二.送出的btn使用<kbd><input type="submit" value="Submit" class="btn btn-primary"></kbd> ``` <div class="container w-50 mt-5"> <h3 class="d-flex justify-content-center">Creat an new account</h3> <form action="loginPage.html" class="mt-5 "> <div class="form-group"> <label for="exampleInputEmail1">Account</label> <input type="email" name="account" class="form-control" id="exampleInputEmail1" aria-describedby="emailHelp" placeholder="Enter email"> </div> <div class="form-group"> <label for="exampleInputPassword1">Password</label> <input type="password" name="password" class="form-control" id="exampleInputPassword1" placeholder="Password"> </div> <div class="d-flex "> <input type="submit" value="Sign up " class="btn btn-primary mr-2"> <input type="submit" value="Login in " class="btn btn-success"> </div> </form> </div> ``` step2.畫面輸入資料,先輸入一個我們設計假資料 account: adobe@gmail.com password:adobe1234 ![](https://i.imgur.com/DGbgV6n.jpg) step3.點擊submit,url地方會得到以下資料 `loginPage.html?account=adobe%40gmail.com&password=adobe1234` <kbd>iloginPage.html</kbd>是form action=""接的網址,後面繼續連接的中間是一個問號<kbd>?</kbd> 之後接續<kbd>account=填入帳號</kbd>,後面繼續連接的中間是一個and符號<kbd>&</kbd>,在接著<kbd>password=填入密碼</kbd> ### methods:'post',setRequestHeader #### application/x-www-form-urlencoded(預設值) 如AJAX - [2.同步&非同步](https://hackmd.io/KxaZa7V0SLebq2cPvi3kWA) 在js檔宣告抓Json,和過往使用<kbd>get</kbd>接收資料不同,這次使用<kbd>post</kbd>提交表單 ``` var xhr = new XMLHttpRequest(); xhr.open('post','https://hexschool-tutorial.herokuapp.com/api/signup',true); ``` step4.接著宣告提交表單方式 根據mozilla上[XMLHttpReques](https://)有四種提交方式,這裡使用的是 > 方法:POST;編碼類型:application/x-www-form-urlencoded(預設值): > > Content-Type: application/x-www-form-urlencoded > > foo=bar&baz=The+first+line.%0D%0AThe+second+line.%0D%0A 使用怎樣提交方式視後端要求而定. 所以我們編寫為 ``` var xhr = new XMLHttpRequest(); xhr.open('post','https://hexschool-tutorial.herokuapp.com/api/signup',true); xhr.setRequestHeader('Content-type','application/w-www-form-urllencoded'); ``` #### application/json 如果是使用這種格式提交方式為 ``` var xhr = new XMLHttpRequest(); xhr.open('post','https://hexschool-tutorial.herokuapp.com/api/signup',true); xhr.setRequestHeader('Content-type','application/json'); ``` ### 3.實作:申請帳號/登入表-使用application/x-www-form-urlencoded格式 <style> .red{ color:red; } .blue{ color:blue; } </style> #### 注意事項 <span class="red">1.送出的button,注意type="button" , 如果是其他狀態如:type="submit", function無法執行</span> <span class="blue"> 2.sign up和 login 申請帳號和登入兩組的new XMLHttpRequest();大多數程式碼都相同,因此只要帶入對應的參數就可以省略很多相同的程式碼的撰寫 </span> <span class="red"> 3.sign up和 login 兩個function使用的Dom 取得id以及new XMLHttpRequest() 和系統尋應訊息轉字串都應該是同一個代號 ,不然執行會出問題,會點擊sign up button但是接著執行login button function 如sign up和 login的account dom取值都是 </span> ``` var emailStr = document.querySelector('.account').value; ``` 不需要另外取一個<kbd>emailStr2= document.querySelector('.account').value;</kbd>來區別sign up和 login. #### 3.1 send data方式 送出帳號密碼後url呈現 `email=adobe%40gmail.com&password=adovbe345` 用程式碼方式寫給Javascript看的方式為 ``` var emailStr = document.querySelector('.account').value; var passwordStr = document.querySelector('.password').value; "email=" + emailStr + "&password=" + passwordStr ``` #### 3.2 [event.onload = function()](https://developer.mozilla.org/zh-CN/docs/Web/API/GlobalEventHandlers/onload) 要看send到new XMLHttpRequest();資料配對後結果 用 <kbd>event.onload = function()</kbd> ``` xhr.onload = function(){ .......... } ``` #### 3.3 JSON.parse()將XMLHttpRequest()回傳物件格是訊息轉回文字再取到畫面上 [JSON.parse()解說](https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/JSON/parse) ``` xhr.onload = function(){ // 回傳訊息是字串格式,要把它轉成物件才能透過指令取出來 var callbackData = JSON.parse(xhr.responseText); console.log(callbackData); alert(callbackData.message); } ``` 試試看自己創新帳號或登入以下已經存在帳號看結果 email: 'lovef2e@hexschool.com', password: '12345678' <iframe height="448" style="width: 100%;" scrolling="no" title="Ajax表單驗證-w-www-form-urllencoded格式" src="https://codepen.io/corly74/embed/oNBYdoN?height=448&theme-id=dark&default-tab=js,result" frameborder="no" loading="lazy" allowtransparency="true" allowfullscreen="true"> See the Pen <a href='https://codepen.io/corly74/pen/oNBYdoN'>Ajax表單驗證-w-www-form-urllencoded格式</a> by peiyun (<a href='https://codepen.io/corly74'>@corly74</a>) on <a href='https://codepen.io'>CodePen</a>. </iframe>