js總結
技術標籤:js
JavaScript學習總結
Js的概述
JavaScript簡稱js,是一種直譯式、弱型別的、基於事件驅動的語言。它的直譯器(js引擎)屬於瀏覽器的一部分,因此js是一種廣泛用於客戶端的指令碼語言
強型別與弱型別的區別
- 強型別語言-java:java中的任何變數在使用前都必須宣告其資料型別,而且變數一旦確定型別就無法更改。
- 弱型別語言-js:由於沒有編譯的過程,js中的所有變數型別都是在執行期間動態確定的,而且可以隨時修改其資料型別。
java是一門服務端語言(有編譯過程,執行速度更快,支援多執行緒環境),js是一門客戶端語言(無需編譯,單執行緒)
Js的組成
- EXMAScript核心語法:提供核心語言功能
- 瀏覽器物件模型(BOM):提供與瀏覽器互動的方法和介面
- 文件物件模型(DOM):提供訪問和操作網頁內容的方法和介面
Js的基礎語法
常見的引入方式
- 直接在html頁面中使用內聯的script標籤內編寫
- 引入外部指令碼檔案(js檔案)
- 直接在html元素中用內嵌的方式使用
標籤中href和src的區別
- href關聯的資源會與頁面同步載入
- src關聯的資源是執行時,瀏覽器停止對頁面的渲染,先讀取src關聯的資源,再將資源替換到該位置
Js的資料型別
雖然js是一門弱型別語言,但它也支援很多不同型別的資料,不同型別之間也有不同區別
- 數值型別(包含浮點)number
- 字元型別(包含字串和字元)string
- 布林型 boolean
- 陣列 object引用型別
- 物件 object
- null 同樣屬於object
- undefined
null和undefined
- null:表示空物件,即在記憶體申請了空間,但沒有為其賦值
- undefined:未定義,它表示的是未申請空間的型別,即表示該變數不存在
Js的運算子
-
算數運算:+、-、 *、 /、 %、++、–
由於js中沒有單獨劃分浮點型,所以無論是整數還是小數,使用除法時都會獲取到最精確的值
-
關係運算:>、<、<=、>=、/=、!=/!==
==:自動進行型別轉換的比較
===:區分型別的比較
-
邏輯運算:&&、||、!
-
位運算:<<、<<<、>>、^、&、!
-
三目運算:布林表示式?結果1:結果2
-
其他運算子:+(正號)
string型別前加上+,字串會被強制轉換成數字,如果無法強轉就會輸出NaN(not a number)
Js流程控制
與java相同,分為:
- 順序語句
- 分支語句
- 迴圈語句
分支語句
-
If/else
因為js中的任何型別都可以轉換成布林型別,所以if括號內的表示式可以是任意型別的表示式
其他型別轉換成boolean型別的規律:
- 對於number型別,任何非0值都是true
- null和undifined都會被轉換成false
- 非空物件會被轉成ture
- 非空字串(’ ')會被轉成true,‘false’也是true,’'空字串會被轉成false
-
switch
js中的switch支援任意型別的比較
迴圈語句
-
普通for迴圈(idea快捷表達是fori)
-
while迴圈
-
do-while迴圈
-
forin迴圈
語法:
for (var key in object){ //迴圈體 }
當object是陣列時,key表示該陣列元素索引
當object是物件時,key表示物件中的屬性名,通過object[key]獲取該物件屬性名為key的屬性值
Js的函式
由於js是弱型別語言,所以js中的函式與java的方法相比較來說,js函式的引數列表不需要也不能標記引數型別,而且也不需要宣告返回值型別,如果需要返回值,直接在函式體內return即可。
函式定義
與java一樣包含4種類型
function print(msg) {
console.log(msg)
}
function msg() {
return new Date();
}
function max(a, b) {
return a > b ? a : b;
}
function show(){
console.log("無引數方法")
}
Arguments
arguments用來獲取呼叫函式時的傳參個數(arguments.lenght),從而可以實現可變引數列表的函式
function add(a,b,c,d,e){
console.log(c)//如果未傳參,c為undefined,五個引數相加的結果會變成NaN(not a number)
var len = arguments.length//傳入引數個數
if(len === 1){
console.log(a);
}else if (len ===2){
console.log(a+b)
}else if (len ===3){
console.log(a+b+c)
}else if (len ===4){
console.log(a+b+c+d)
}else if (len >=5){
console.log(a+b+c+d+e);
}
}
add();
add(10,20);
add(10,20,30,40,50,60,70,80);
函式呼叫
js的函式呼叫不需要像java一樣通過物件呼叫,只需要在script語句塊中直接呼叫即可,或者通過html元素中的相關事件進行呼叫
匿名函式
//將匿名函式變成有名字的函式(把函式儲存到變數中)--->這時已經不是匿名函數了
var add = function (a, b) {
console.log(a + b);
}
add(1, 2);
//自呼叫函式(不僅針對匿名函式,有名字的函式也可以進行自呼叫)
var value = (function (a, b) {
let r = a > b ? a : b;
console.log('匿名函式被執行')
return r;
})(10, 20);
console.log(value)
閉包
- 閉包:即在一個函式內部定義的函式
- 閉包功能:提供了在函式外部對函式內部區域性變數的訪問能力
Js中的變數作用域
i = 20;
(function a(){
j = 10;
//以var標識的變數是區域性變數,無法在作用域(方法體)外呼叫
var n = '方法體中的變數';
})();
console.log(i+','+j);
console.log(n)//Uncaught ReferenceError: n is not defined
//非函式的語句塊無法形成作用域,因此該區域定義的變數,在外部可以被呼叫(變數汙染)
if(i > 10){
var num = '非函式語句塊中的變數';
//es6新增,為防止變數汙染而存在的關鍵字,let宣告的變數只能在宣告區域使用
let m = '非函式語句塊中的區域性變數';
}
console.log(num);
console.log(m);//Uncaught ReferenceError: m is not defined
Js事件
js是一門基於事件驅動的語言,大多數時候js的程式碼不是主動執行,而是被html介面中或瀏覽器的某些動作影響導致程式碼執行,而且觸發這些動作的操作被稱為事件
常見的事件主要包含:
- 視窗事件
- 滑鼠事件
- 鍵盤事件
- 文件事件
- 物件(音訊、視訊等)事件
事件繫結
-
直接在html元素中通過事件名繫結(不推薦)
<標籤 on事件名='function() {}'></標籤>
-
在js中獲取元素呼叫元素的事件名
元素物件.on事件(function() {})
-
獲取物件後使用addEcentListener()方法將事件與元素繫結
元素物件.addEcentListener('事件',function() {})
事件流
事件冒泡&事件捕獲
var d1 = document.getElementById('d1');
var d2 = document.getElementById('d2');
var d3 = document.getElementById('d3');
/*
當addEventListener的第三個引數全部都設定為true(預設為false)時,事件執行會從冒泡變成捕獲
事件捕獲:從外到內依次執行事件
事件冒泡:從內到外依次執行事件
*/
d1.addEventListener('click',function (){
console.log('外');
},true)
d2.addEventListener('click',function (){
console.log('中');
},true)
d3.addEventListener('click',function (){
console.log('內');
},true)
取消事件傳播
只需要呼叫事件物件的stopPropagation()方法即可,無論是事件冒泡還是事件捕獲,只要在事件中呼叫stopPropagation(),它的事件就不會再向外(向內)傳播
d1.addEventListener('click',function (){
console.log('外');
})
d2.addEventListener('click',function (){
console.log('中');
})
d3.addEventListener('click',function (e){
console.log('內');
//取消事件傳播
e.stopPropagation();
})
Js面向物件
自定義物件(json/JS物件)
js中有一種固定的物件表達形式,即json物件。json物件是一種以鍵值對為標準的物件表達形式(類似java中的Map);
var user = {
id : 1,
name : '張三',
class : ['java','js','c++'],
study : function(){
//函式體
}
}
隨著網際網路技技術的發展以及前後端分離技術的出現,根據js的json物件演變出了一種特殊的資料格式json字串,用於實現前端資料傳遞。
{
"id" :1,
"name" : '張三'
"group" :['java','js','c++'],
"study" : function(){
//函式體
}
}
全域性函式
- parseInt 將字串轉換成整數型別並返回
- parseFloat 將字串轉換成浮點數型別並返回
- eval 將字串轉換成可以執行的程式碼(不建議使用)
- encodeURI 將目標字串轉碼為URL編碼
- decodeURI 將url編碼的字串解碼為原始字串值
type of n :獲取n的資料型別
n istanceof Number:判斷n是否是Number型別
Number
- 工廠模式創造Number物件 var n = Number()
- 指定保留小數點位數(四捨五入):n.toFixed(2)
- 根據本地資料格式(local:最大保留3位小數),並轉換成String:n.toLocaleString()
String
與java中的String類高度相似,內部包含的方法也基本一致,String物件同Number一樣也擁有兩種創造方式(new、工廠模式)
var s = new String('TestWord');
console.log('字串長度:',s.length);
console.log(s.big());// 相當於在字串外部新增<big>標籤
console.log(s.bold());//加粗:<b>TestWord</b>
console.log(s.link());//新增連結:<a href="undefined">TestWord</a>
//正則驗證
//使用String的match方法會返回正則匹配到的字串
console.log('15807146843'.match(/^1[3578]\d{9}$/));
console.log('ab,cd,ef'.split(','));//使用指定字串分割,返回陣列
console.log('a.txt'.endsWith('.txt'));//是否以指定字串結尾
console.log(' ada '.trim());//去除前後空格
Array
Array是js中的陣列物件,建立(空陣列)方式包含以下:
var a1 = [];
var a2 = new Array();
常用方法
- 陣列排序 arr.sort([可使用λ表示式或匿名函式設定比較器])
- 陣列反轉 arr.reverse()
- 向陣列末尾追加元素 arr.push()
- 向陣列頭部追加元素 arr.unshift()
- 返回陣列末尾元素,並移除 arr.pop()
- 返回陣列頭部元素,並移除 arr.shift()
- 獲取指定元素索引(如果存在多個相同元素,會返回最小的索引) arr.indexOf()
- 獲取指定元素索引(如果存在多個相同元素,會返回最大的索引) arr.lastIndexOf()
- 從指定索引開始(index),刪除指定個數(2)的元素 arr.splice(index,2)
- join:指定指定的符號把陣列中的每個元素拼接成一個字串 arr.join(",");
Math
Math物件類似java的Math類,Math也無法按照普通方法建立物件,所有方法都像靜態方法一樣可以直接呼叫
Date
建立Date物件
- Date(毫秒數)
- Date(能被Date.parse()識別的字串)
- Date(year, month[, day[, hour[, minutes[, seconds[, milliseconds]]]]])
常用函式
- 獲取當前日期(距離1900.1.1)的時間:var date = Date.now();
- 獲取年:date.getFullYear();
- 獲取月(-1):date.getMonth()
- 獲取日期在月中的天數:date.getDate()
- 獲取時:date.getHours()
- 獲取分鐘:date.getMinutes()
- 獲取秒:date.getSeconds()
RegExp
//構造器建立(需要注意轉移符號)
//方法一
var regex = new RegExp('\\d{3,5}');
//方法二:工廠方法
regex = /\d{3,5}/;//該構造方法與上面效果相同
//判斷給定的字串是否匹配正則表示式
console.log(regex.test('12345'))
//拿到匹配到的資料(陣列)
console.log(regex.exec('da12312321dsdzw12')[0]);
var phone = 'czxe312dxfgaw313797773410123dq1582698130012312';
regex = /1[3578]\d{9}/g;//g表示全域性匹配
var arr ;
//使用while迴圈可以取到多個符合要求的字串
while ((arr = regex.exec(phone))!== null){
console.log(arr[0]);
}
console.log(/world/i.test('HelloWorld'))//i表示忽略大小寫匹配
Dom與Bom
Dom(文件物件模型)
js支援DOM程式設計,DOM即Document Object Model,可以通過js的dom操作對html整個文件樹中的任意節點進行訪問(增刪改查),倒置的文件樹如下:
名詞解釋:
- 元素(element):html任意一個標籤開始IDAO結束,之間的內容(包括標籤本身)都稱之為元素,一個元素也被稱為一個節點
- 屬性(Attribute):屬性是開始標籤中的屬性名和屬性值構成的一個鍵值對結構
Dom的獲取
-
獲取所有的元素(陣列)
let alls = document.all; console.log(alls);
-
通過標籤名獲取元素(陣列)
let titles = document.getElementsByTagName('h1'); console.log(titles);
-
根據class獲取元素(陣列),存在相容問題(IE不支援),謹慎使用
let rows = document.getElementsByClassName('row'); console.log(rows);
-
根據元素的name屬性獲取元素集合(一般只有表單元素才有name屬性)
let arr = document.getElementsByName('lang');//取到所有name為lang的元素
-
根據元素id獲取元素(唯一)
let selectAll = document.getElementById('selectAll');
以上是比較常規的獲取dom的方式,同時js也提供了可以通過css選擇器獲取匹配元素的方式
-
document.querySelector:獲取指定選擇器選中的單個元素
let h2 = document.querySelector('h2');
-
document.querySelectorAll:獲取指定選擇器選中的多個元素
//查詢選擇器:根據css的選擇器獲取指定選擇器選中的多個元素 let nodeListOf = document.querySelectorAll('td'); console.log(nodeListOf); //獲取所有的class='row',h1,h2元素 let listOf = document.querySelectorAll('.row,h1,h2'); console.log(listOf);
插入Dom
js的document向指定節點插入元素的方法主要包含:
-
節點.appendChild(dom物件) /節點.append(dom物件)
appendChild向指定節點中插入子元素(子元素是一個dom物件,可以通過createElement(‘標籤名’)建立)
append與appendChild的不同之處在與,前者無返回值,後者會同時返回插入節點
-
節點.insertBefore(newNode , redNode)
向當前節點的子節點redNode之前加入newNode
-
innerHTML/innerText
直接插入整段html程式碼,多行程式碼用es6的新特性書寫
更新Dom
- innerText:將文字內容插入到指定節點
- innerHTML:將html程式碼插入到指定節點
刪除Dom
- removeChild(childNode):刪除當前節點下指定的子節點
- remove():刪除當前節點物件
DOM補充
- children: dom元素通過該屬性可以獲取當前節點下的所有的子節點(集合)
- parentNode:dom元素通過該屬性可以獲取當前節點的父節點(唯一)
Bom(瀏覽器物件模型)
Bom全稱Brower Object Model,js中所有關於瀏覽器操作的頂層元素都是來自window物件,window物件對外界提供了一個用於操作瀏覽器的訪問結構,通過bom可以獲取window相關資訊,比如螢幕尺寸、瀏覽器的詳細版本(版本、核心、配置等),頁面跳轉、歷史記錄、定位、本地儲存,對移動裝置來說還可以獲取與本機硬體裝置互動的介面(位置資訊、藍芽、攝像頭、陀螺儀等等)
window
window物件是BOM的頂層物件,一般來說全域性的this指的都是window物件,雖然一般情況下呼叫dom時是直接呼叫,並沒有寫它的父元素bom,但document物件也是屬於window物件的
window的常見屬性
- innerWidth 瀏覽器可視區域寬度
- innerHeight 瀏覽器可視區域高度
- outerWidth 瀏覽器視窗寬度
- outerHeight 瀏覽器視窗高度
基於window物件的彈窗函式
- alter():警告框
- confirm():確認框
- prompt():訊息輸入框,輸入訊息後該彈窗會返回一個儲存了輸入內容的變數
- open():自定義視窗
使用layUI的獨立彈窗外掛可以更輕鬆的實現好看的彈窗效果,詳情檢視官網或本地外掛包中的文件,在使用前需要匯入:
- jq包
- layer.js包
//警告框 document.getElementById('win1').addEventListener('click',function () { // window.alert('這是一個警告彈窗') layer.alert("這是一個警告彈窗"); });
基於window的定時器
-
setTimeout():定時任務,延遲指定時間,執行一次回撥函式(一次執行)
//setTimeout() 延時3000ms執行任務(定時任務,僅執行一次),會返回該動畫序號(從1開始) let flag = window.setTimeout(function () { console.log('hello',flag); //清除定時任務 window.clearInterval(flag); },3000);
-
setInterval():定時任務,每隔指定時間執行一次回撥函式(反覆執行)
使用案例:實時電子時鐘、幀動畫等…
navigator
用於獲取瀏覽器的資訊,但navigator容易被使用者篡改,所以js獲取到的navigator也不是一定是真實的瀏覽器資訊
- navigator.appName:瀏覽器名稱;
- navigator.appVersion:瀏覽器版本;
- navigator.language:瀏覽器設定的語言;
- navigator.platform:作業系統型別;
- navigator.userAgent:瀏覽器設定的
User-Agent
字串。
screem
- screen.width:螢幕寬度,以畫素為單位
- screen.height:螢幕高度
- screen.availHeight:可用高度
- screen.availWidth:可用寬度
- screen.colorDepth:色深,返回顏色位數,如8、16、24
location
常用的location跳轉方式
<button onclick="location.href = 'http://www.baidu.com'">location頁面跳轉方式</button>
<button onclick="location.reload()">頁面重新整理</button>
<!--頁面替換後不同於跳轉,它會完全替換當前頁面地址,沒有後退選項-->
<button onclick="location.replace('http://www.bootcss.com')">頁面替換</button>
location物件的屬性
var local = location.href;
console.log('當前頁面連結',local);
console.log('獲取連線協議',location.protocol)
console.log('請求資源',location.pathname)
console.log('查詢地址',location.search)
console.log('hash',location.hash)
完整URL的組成
- 協議(http://|https://)
- 主機地址(域名/ip):計算機在網路中的位置
- 埠號(0~65535(2個位元組)):該計算機中網路應用程式的對外訪問埠(門牌號)
- 請求資源
- 查詢路徑: 指提交到後臺的資料 ?useranme=admin&pwd=789guyti78…
- hash值(可能沒有)
history
history物件儲存了瀏覽器的歷史記錄,JavaScript可以呼叫
history物件的
back()或
forward (),相當於使用者點選了瀏覽器的“後退”或“前進”按鈕。這個物件屬於歷史遺留物件,對於現代Web頁面來說,由於大量使用AJAX和頁面互動,簡單粗暴地呼叫
history.back()`可能會讓使用者體驗不好。
新手開始設計Web頁面時喜歡在登入頁登入成功時呼叫history.back()
,試圖回到登入前的頁面。這是一種錯誤的方法。
localStorage&sessionStorage
h5新增了2個前端儲存機制
- localStorage
- sessionStorage
其中本地儲存(localStorage)可以將資料(服務/客戶端資料)快取到本地瀏覽器中,可以在不通過後臺的方式把一個頁面的資料帶到另一個頁面中,無論頁面如何重新整理,甚至電腦重啟都不會影響指定資料的儲存。
sessionStorage中儲存的資料在一次會話中可以一直存在,一旦瀏覽器關閉或者session有效期(一般是20min)到達之後會自動清理。
兩種儲存機制的操作API都是一致的,快取中儲存的資料都是以鍵值對結構存在的。
在瀏覽器中的儲存位置
[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片儲存下來直接上傳(img-hVoZY8XE-1609677291464)(file:///Users/zhangping/Library/Application Support/typora-user-images/image-20201228140813957.png?lastModify=1609660861)]
常用函式
- setItem(key,value):向快取物件中新增一個元素,鍵和值都是string型別
- getItem(key):根據鍵從快取物件中取出一個元素
- remove(key):根據鍵從快取物件中刪除一個元素
- clear():清空快取物件中的所有元素
localStorage和sessionStorage之間的區別
儲存位置和時長
localStorage和sessionStorage的應用場景
- localStorage適合於網站首頁資料的快取,比如購物網站、入口網站等安全性不高的資料
- sessionStorage適合於臨時儲存一次會話的資訊,比如使用者的登入密碼等(安全性要求較高)
Json資料格式詳解
通過對localStorage和sessionStorage儲存機制的瞭解,html5中的這兩種儲存機制都只能儲存字串資料,無法儲存物件等複雜資料,但是真實專案中的快取往往會是複雜資料(物件、集合等),此時可以考慮使用一種特殊的資料交換格式:JSON
JSON字串概述
JSON(JavaScript Object Notation)字串:是源於JavaScript物件改編而來的字串形式的物件、陣列表達形式,但作為一種資料表達格式,json字串基本上可以被所有型別的語言識別,因此常常會把json字串作為資料傳輸的媒介,JSON(重量級:XML)是一種輕量級的資料交換格式,廣泛應用於各種語言之間的資料交換,目前各大服務端語言也都提供了相當豐富的用於解析和轉換json字串的工具。
json只表示數值本身,無法表示函式
JSON資料格式的分類
-
標量(一個值)
-
序列(陣列)
['admin','json'] ↓ [ { "id":1, "name":"admin", "age":18 },{ "id":1, "name":"json", "age":18 } ]
-
對映(物件)
{ "id":1, "name":admin, "age":18, "group":{ "gid": 1001, "gname":"vip1" } }
JS中JSON序列化與反序列化
- JSON序列化:JSON.stringify(指定物件),返回一個json字串
- JSON反序列化:JSON.parse(指定json字串),返回一個js物件
json = `[
{
"id":1,
"name":"admin",
"age":18,
"group":{
"gid": 1001,
"gname":"vip1"
}
},
{
"id":2,
"name":"json,
"age":35,
"group":{
"gid": 1005,
"gname":"vip5"
}
}
]`;
//json字串反序列化(解析成js物件)
json = JSON.parse(json);
//取到指定資料
console.log(json[0].group.gname);//vip1
//js物件序列化(格式化成成json字串)
console.log(JSON.stringify(json))
Ajax基礎
Ajax全稱Asynchronous JavaScript and XML(非同步的js和XML,由於時代的發展,ajax和xml的關係已經不大了,稱作aj或許更合適)。
之前所有的頁面跳轉都是全域性的頁面刷新技術,比如:
- a 超連結
- form 表單提交
- location.href js跳轉
上述程式碼的執行都會導致整個頁面重新整理,受到服務端或客戶端網路頻寬的影響,可能會導致頁面資料顯示緩慢,影響使用者體驗。但實際專案中的許多資料更新是不需要進行全域性重新整理的,比如使用者註冊時檢測該賬號是否可用、或頁面資料展示時部分資料的更改更新。區域性刷新技術Ajax的出現解決了這一問題。
Ajax並不算新技術,它基於js的一項能夠與服務端互動的物件(XMLHttpRequast)實現
Ajax的優勢(非同步)
- 改善表單驗證方式,驗證時不需要提交整個表單,也不需要開啟新頁面
- 頁面可以按需獲取資料,以減少大量資料的請求
- 客戶端請求資料無需重新整理整個頁面,減少使用者的等待時間,提高使用者的體驗
Ajax使用步驟
一個標準的ajax請求分為以下幾個步驟:
-
獲取XMLHttpRequest物件
ie使用new ActiveXObject()建立物件
-
開啟一個到服務端的連線
-
傳送連線
-
當請求狀態改變時,需要接受來自服務端的響應資料
請求狀態readState
http協議
分為請求頭(Request Head)和響應頭(Respond Head)
請求頭中包含的重要部分為-請求方式
GET | POST
響應頭中包含的重要狀態為-響應狀態碼:
- 200:ok響應成功
- 404:not found請求資源不存在
- 500:internal error內部伺服器錯誤
案例
Ajax傳送GET資料
- get(html中表單methond屬性值為get(預設))
- 1.1獲取與伺服器的連線物件
let xmlHttpRequest = new XMLHttpRequest(); - 1.2獲取表單資料
let form = document.getElementById(‘login-form’);
// let m = form.method.value;//隱藏域一般來說是固定的,所以下方的url可以寫死,不用通過變數獲取
let uname = form.uname.value;
let pwd = form.pwd.value; - 1.3拼接url請求地址(將獲取到的表單資料拼接到地址中)
- 2.開啟一個連線
xmlHttpRequest.open(‘GET’,url) - 3.傳送請求
xmlHttpRequest.send(null)//因為要傳送的資料已經寫在位址列裡了,所以傳送的資料依舊是null
//2.開啟一個連線
xmlHttpRequest.open('GET',url)
//3.傳送請求
xmlHttpRequest.send(null)//因為要傳送的資料已經寫在位址列裡了,所以傳送的資料依舊是null
xmlHttpRequest.onreadystatechange = function () {
if (xmlHttpRequest.readyState === 4 && xmlHttpRequest.status === 200){
//4.獲取服務端傳送過來的資料
let responseText = xmlHttpRequest.responseText;
// alert(responseText);
let data = JSON.parse(responseText);
//code屬性: 登入失敗,code為0-false 登入成功,code!=0
if (data.code){
//code不為0,跳轉
location.href = 'main.html';
}else {
//code為0,顯示data的錯誤資訊屬性
alert(data.msg);
}
}
}
Ajax傳送POST資料
- html中表單methond屬性值為get(預設)
- enctype編碼格式屬性為"application/x-www-form-urlencoded"
document.getElementById('login-btn').addEventListener('click',function () {
//1.1獲取與伺服器的連線物件
//1.2獲取表單資料
//1.3設定url地址
//2.開啟一個連線
xmlHttpRequest.open('POST',url)
//3.傳送請求
//3.1post請求必備:設定請求頭
xmlHttpRequest.setRequestHeader("Content-Type","application/x-www-form-urlencoded")
//3.2選用post方式傳送,需要帶上需要傳送的資料
xmlHttpRequest.send(`method=login&sno=${uname}&password=${pwd}`)
xmlHttpRequest.onreadystatechange = function () {
if (xmlHttpRequest.readyState === 4 && xmlHttpRequest.status === 200){
//4.獲取服務端傳送過來的資料
let responseText = xmlHttpRequest.responseText;
// alert(responseText);
let data = JSON.parse(responseText);
//code屬性: 登入失敗,code為0-false 登入成功,code!=0
if (data.code){
//code不為0,跳轉
location.href = 'main.html';
}else {
//code為0,顯示data的錯誤資訊屬性
alert(data.msg);
}
}
}
})
GET請求和POST請求的區別
get和post都是客戶端向服務端傳送請求的方式
- GET:一般用於獲取服務端資料,並且可以向服務端提交少量資料(不超過1kb),而且提交的資料會通過查詢路徑被直接拼接在位址列中
- POST:一般用於向服務端提交資料,提交的資料會經過封裝不會直接在位址列中顯示,所以提交的資料沒有大小限制