- JavaScript書寫位置
<!-- 直接寫在HTML标簽裡 --> <button οnclick="alert('點選彈出一句話')"></button> <a href="javascript:alert('彈出一句話,不跳轉')" target="_blank" rel="external nofollow" > <a href="javascript:;" target="_blank" rel="external nofollow" > <!-- 寫在<script>标簽裡 --> <script type="text/javascript"> alert("彈出對話框"); </script> <!-- 寫在外部檔案,并連結進來 --> <!-- 這個script标簽内部不能寫js,會被忽略 --> <script type="text/javascript" src="js檔案位置"></script>
- 資料類型(6種)
- 基本資料類型
- String 字元串
- Number 數字(整數和浮點數)
- Number.MAX_VALUE 最大值
- Number.MIN_VALUE 最小值
- Infinity 正無窮 計算結果超過最大值就是 Infinity
- NaN 不是一個數字 計算結果不是數字就會傳回NaN
- Boolean 布爾值
- Null 空對象(typeof null 傳回的是object)
- Undefined 未定義
- 引用資料類型
- Object
- typeof 變量 可以檢視變量的類型
- 基本資料類型
- 類型轉換
- 其他轉字元串
// 1. 調用toString方法 var a = 10; var b = a.toString() // 2. 調用String()方法 var a; var b = String(a); // b的結果就是undifined
- 其他轉數字
// 1. 調用Number()方法 // 不是數字就傳回NaN // 空串或者全是空格的字元串轉為0 // 布爾true 1, false 0 // null 0 // undefined NaN var a = “123”; var b = Number(a); // 2. parseInt()、parseFloat() var a; var b = parseInt(a);
- 其他轉布爾
// 調用Boolean()方法 // 1. 除了0和NaN,其餘數字都是true // 2. 除了空串,其餘字元串都是false // 3. null false // 4. undefined false // 5. 對象也會轉換為true var a = 123; var b = Boolean(a);
- 其他轉字元串
- 運算符
- == 和 != 會自動轉換類型并比較
- === 和 !== 不會自動轉換類型比較
- NaN和任何值都不相等,包括本身。是以使用isNaN來判斷
- 對象
- 内建對象
- 由ES标準中定義的對象,在任何ES的實作中都可以使用
- Math String Number Boolean Function Object
- 宿主對象
- 由JS的運作環境提供的對象(比如:document,console)
- BOM DOM
- 自定義對象,自己建立的對象
// 使用構造器建立對象 var obj = new Object(); // 添加屬性 obj.name = "tom"; // 這種方式更加靈活 obj["str"] = 99; // 删除屬性 delete obj.name; // in 檢查對象中是否包含指定的屬性 // 在原型對象中的屬性也會傳回true // 隻檢查本身有沒有,用hasOwnProperty("屬性名") "age" in obj; // 使用字面量建立對象 var obj1 = {name:"tom", age:12}
- 内建對象
- 函數
- 函數也是一個對象
// 可以将要封裝的代碼傳給函數的構造函數 // 這種方式不常用 var fun = new Function("console.log('print')"); fun(); // 常用方法 funtion fun1(); fun1(); // 立即執行函數 (function(a,b){ alert(a+b); })(10,20);
- 函數也是一個對象
- this
- 解析器在調用函數時會傳遞一個隐含參數(this),this指向一個對象
- this稱為函數執行的上下文對象
- 根據函數的調用方式不用,this會指向不同的對象
- 以函數調用,this就是window
- 以方法調用,this就是調用方法的那個對象
- 構造方法
function Person(name, age, gender) { this.name = name; this.age = age; this.gender = gender; this.sayName = fun; } // 将構造函數中的方法定義放在構造函數外部 // 這樣可以避免,每次建立的對象都有一個函數執行個體,10000個對象有10000個函數對象執行個體 // 但這樣會污染全局作用域,因為是定義在全局作用域中的 function fun() { alert(this.name); }
- 原型對象prototype
- 我們建立的每一個函數,解析器都會向函數中添加一個屬性prototype(函數也是對象,可以添加屬性)
- 如果作為普通函數調用,原型對象沒有任何作用
- 當函數以構造函數的形式調用時,它所建立的每一個對象中都會有一個隐含的屬性指向這個原型對象
function MyClass(){} var mc = new MyClass(); console.log(mc.__proto__);
- __proto__相當于一個公共區域,所有同一個類的執行個體都可以通路到這個原型對象,可以将對象中共有的内容,放到原型對象中
function Person(name, age, gender) { this.name = name; this.age = age; this.gender = gender; } Person.prototype.sayName = function() { alert(this.name); }; // 添加toString() 方法就可以直接列印對象 Person.prototype.toString = function() { return "name: " + this.name + ", age: " + this.age + ", gender: " + this.gender; }
- 尋找一個屬性或者方法時
- 自身有,直接使用
- 自身沒有去原型對象中尋找
- 2沒有再去原型對象中的原型對象中尋找,直到直到Object對象的原型
- Object對象的原型沒有原型,如果在Object原型中沒有找到,則傳回undefined
- 數組(内建對象)
- 建立方式
var arr = new Array(); var arr1 = new Array(5); var arr2 = new Array(5, 6, 7); var arr3 = []; var arr4 = [1, "abc", true];
- 常用方法
- push() 向末尾添加元素,傳回新數組長度
- pop() 删除末尾元素,傳回被删除的元素
- unshift() 向頭部添加元素,傳回新數組長度
- shift() 删除第一個元素,傳回被删除的元素
- forEach(function(self, index, arr){}, this)
- self 周遊的值
- index 周遊的索引
- arr 被周遊的整個數組
- 不會改變原數組
- break、continue沒有作用
- return 傳回值不能傳回出去
- slice(start, end) 截取指定位置的數組(不包含end索引的元素),傳回截取結果不會影響數組本身
- splice(start, count, newProperty) 删除數組中指定位置的元素,并替換。傳回被删除的元素,會直接影響數組
- concat() 連接配接兩個或更多的數組,并傳回結果,不會對影響數組本身
- join(seperate) 把數組的所有元素放入一個字元串,元素通過指定的分隔符分隔。不會對影響數組本身
- reverse() 反轉數組中的元素,會直接影響數組
- sort(function(a,b)) 對數組的元素進行排序(可以傳入函數自定義排序規則),會直接影響數組
- 建立方式
- 函數的方法(函數也是對象)
- call()和apply(),這兩個方法時函數對象的方法,需要通過函數對象調用
- 調用這兩個方法,都會使得函數執行
- 調用這兩個方法可以将一個對象指定為第一個參數,此時這個對象會成為函數執行時的this
var obj = {}; function fun() { alert(this); } // alert(this) this就變成obj // fun() 這樣調用 this 是window fun.call(obj); fun.apply(obj);
- 傳遞參數的時候
var obj = {}; function fun(a, b) { alert(a + " " + b); } // call直接傳 fun.call(obj, 2, 3); // apply需要封裝到數組裡再傳 fun.apply(obj, [2, 3]);
- this的情況
- 以函數形式調用時,this永遠是window
- 以方法形式調用時,this是調用方法的對象
- 以構造函數的形式調用,this是新建立的對象
- 使用call和apply調用時,this是指定的那個對象
- arguments 函數的參數清單
- 調用函數時,浏覽器每次都會傳遞兩個隐含的參數
- 函數的上下文 this
- 封裝實參的對象 arguments
- arguments是一個類數組對象,但是不是數組
- 調用函數時,傳遞的實參都會在arguments中儲存
- 它有一個屬性 callee 這個屬性對應一個函數對象,就是目前正在指向的函數對象
- 調用函數時,浏覽器每次都會傳遞兩個隐含的參數
- Date對象
- 建立方式
var d = new Date(); // 月/日/年 建立指定日期的日期對象 var d1 = new Date("12/31/2021 11:11:11");
- 常用方法
- getDate() 擷取哪一号
- getDay() 擷取星期幾(0-6,0是星期天)
- getMonth() 擷取月(0-11,0是1月份)
- getFullYear() 擷取年份
- getTime() 傳回197011到日期的毫秒數
- Date.now() 現在的時間戳,毫秒
- 建立方式
- Math對象(工具類,不用new出來)
- 常用方法
- ceil() 向上取整,小數位有值就自動進1
- floor() 向下取整,不管小數位有沒有值,保留整數部分原值
- round() 四舍五入取整
- random() 生成0-1之間的任意小數,不包含0-1
- 常用方法
- 包裝類
- String() Number() Boolean();
- String 常用方法
- charAt(index) 傳回指定位置的字元
- concat() 連接配接兩個或多個字元串
- indexOf(str, index) 傳回指定字元串第一次出現的位置,可以指定查找位置
- lastIndexOf(str, index) 傳回指定字元串最後一次出現的位置,可以指定查找位置
- slice(start, end) 截取字元串,不包括end
- substring(start, end) 截取字元串,不包括end,這個方法不接受負值
- subStr(strat, count) 截取字元串
- split(seperate) 将字元串拆分成數組
- 可以傳遞正則去拆
- search(regex) 檢索字元串中正則比對的值,傳回第一次出現的索引
- match(regex) 提取正則比對的字元串,預設情況下隻會傳回第一個,開啟全局比對就能傳回所有結果。傳回結果放在數組中
- replace(regex, newStr) 替換,設成全局比對模式才會替換所有,預設隻替換第一個
- 正規表達式
- 基本使用
var reg = new RegExp("正規表達式", "比對模式"); // 字面量建立正規表達式對象 var reg1 = /a/i; // 比對模式 // i 忽略大小寫 // g 全局比對模式 reg.test(str); 測試str是否滿足定義的正則
- 基本規則
/*---------------------------------- {n} 正好n次 {m, n} 正好m~n次,包括中間次 {m, } m次以上,包括m + 至少1個 * 0或多個 ? 0或1個 ^ 開頭 $ 結尾 \w 任意字母、數字、下劃線 \W 除了字母、數字、下劃線 \d 任意的數字 \D 除了數字以外 \s 空格 \S 除了空格 \b 單詞邊界 \B 除了單詞邊界 ----------------------------------*/
- 基本使用
- DOM
- 在加載完文檔之後再執行 window.onload = function(){};
- DOM查詢
- 通過document調用
- getElementById() 根據ID擷取一個元素
- getElementsByTagName() 根據标簽名擷取一組元素
- getElementsByName() 根據name屬性擷取一組元素
- getElementsByClassName() 根據class擷取一組元素
- querySelector() 傳入一個選擇器,傳回選擇的元素,隻會傳回第一個
- querySelectorAll() 傳入一個選擇器,傳回選擇的元素,傳回全部
- 通過元素節點調用,擷取元素節點的子節點
- 擷取子節點
- getElementsByTagName() 根據标簽名擷取一組元素 包括孫子節點
- childNodes 所有子節點 不包括孫子節點,小心文本節點
- children 所有子節點 不包括孫子節點,也不包括文本節點
- firstChild 第一個子節點,小心文本節點
- lastChild 最後一個子節點,小心文本節點
- 擷取父節點和兄弟節點
- parentNode 父節點
- previousSibling 前一個兄弟節點,小心文本節點
- nextSibling 後一個兄弟節點,小心文本節點
- 擷取子節點
- 通過document調用
- DOM增删改
- appendChild(新節點) 把新的子節點添加到指定節點
- removeChild(待删除子節點) 删除子節點
- replaceChild(新節點,舊節點) 替換子節點
- insertBefore(新節點,指定的子節點) 在指定的子節點前插入新的子節點
- createElement(“節點名”) 建立元素節點 不是傳進一段完整的HTML代碼,如createElement(“li”)
- createTextNode(“文本内容”) 建立文本節點
- 操作内聯樣式,用style屬性
- 修改元素樣式 元素.style.樣式名 = 樣式值,直接設定到元素上的内聯樣式
- 讀取元素樣式 元素.style.樣式名,直接讀取内聯樣式(帶機關)
- 讀取元素正在生效的樣式(隻讀,不能修改)
- 用currentStyle(隻有IE支援)。讀取元素樣式 元素.currentStyle.樣式名,擷取正在生效的樣式
- 用getComputedStyle(元素, null)
- 第一個參數是要擷取樣式的元素
- 第二個參數,可以傳遞一個僞元素,一般傳null
- 這個方法會傳回一個封裝了元素樣式的對象
var box = document.getElementById("box"); var obj = getComputedStyle(box, null); alert(obj.widt);
- 節點相關屬性
- clientWidth 元素可見寬度(不帶機關,隻讀,内容+内邊距)
- clientHeight 元素可見高度(同上)
- offsetWidth 元素寬度(不帶機關,隻讀,内容+内邊距+外邊距)
- offsetHeight 元素高度(同上)
- offsetParent 擷取目前元素的定位父元素,擷取到離目前元素最近的開啟了定位的祖先元素,沒有就傳回body
- offsetLeft 目前元素相對于其定位父元素的水準偏移量
- offsetTop 目前元素相對于其定位父元素的垂直偏移量
- scrollWidth 擷取到整個滾動區域的寬度
- scrollHeight 擷取到整個滾動區域的高度
- scrollLeft 擷取水準滾動條滾動的距離
- scrollTop 擷取垂直滾動條滾動的距離
- 事件對象
- 當事件的響應函數被觸發時,浏覽器每次都會将一個事件對象作為實參傳遞到響應函數中
box.onclick = function(event){} // event就是事件對象
- 事件對象中封裝了目前事件相關一切資訊
- 在IE8中,響應函數被觸發時,浏覽器不會傳遞事件對象,在IE8及以下的浏覽器中,是将事件對象作為window對象的屬性儲存的
var x = window.event.clientX; // 用window擷取event對象
- 事件對象中的相關屬性
- clientX 擷取滑鼠指針的水準坐标
- clientY 擷取滑鼠指針的垂直坐标
- target 傳回觸發事件的目标元素
- wheelDelta 滾輪滾動的方向,向上是正,向下是負值(火狐不支援)
- event.datail 可以解決上述問題,向上是負,向上是負值
- keyCode 擷取按鍵的編碼
- 基本的一些事件
- onblur 元素失去焦點
- onclick 當使用者點選某個對象時調用的事件句柄
- ondblclick 當使用者輕按兩下某個對象時調用的事件句柄
- onfocus 元素獲得焦點
- onkeydown 某個鍵盤按鍵被按下
- onkeypress 某個鍵盤按鍵被按下并松開
- onkeyup 某個鍵盤按鍵被松開
- onmousedown 滑鼠按鈕被按下
- onmousemove 滑鼠被移動
- onmouseout 滑鼠從某元素移開
- onmouseover 滑鼠移到某元素之上
- onmouseup 滑鼠按鍵被松開
- 當事件的響應函數被觸發時,浏覽器每次都會将一個事件對象作為實參傳遞到響應函數中
- 事件冒泡Bubble
- 後代元素事件被觸發時,其祖先元素的相同僚件也會觸發
- 用事件對象取消冒泡
event.cancelBubble = true;
- 事件的委派
- 将事件統一綁定給元素的共同祖先元素,這樣當後代元素上的事件觸發時,會一緻冒泡到祖先元素,進而通過祖先元素的響應函數來處理事件
- 事件委派是利用了冒泡,通過委派可以減少事件綁定的次數,提高程式的性能
- 這樣做了之後,所有的子元素都會觸發事件,可以通過event.target來進一步限制觸發事件的條件解決
- 事件的綁定
- 使用 對象.事件 = 函數 的形式綁定響應函數,隻能同時為一個元素的一個事件綁定一個響應函數。綁定多個,後面會覆寫前面的。
- 通過方法 addEventListener(事件的字元串(沒on),回調函數,是否在捕獲階段觸發事件(一般是false))。按綁定順序執行 IE8不支援
- IE8解決 attachEvent(事件的字元串(有on),回調函數)。後綁定,先執行
function bind(obj, eventStr, callback) { // addEventListener的this是綁定事件的對象 // attachEvent的this是window if (obj.addEventListener) { obj.addEventListener(eventStr, callback, false); } else { obj.attachEvent("on" + eventStr, function(){ // this指向由方法的調用方式來決定 // call方法可以調整this的指向 callback.call(obj); }); } }
- 事件的傳播
- 事件的傳播,網景和微軟有不同的了解
- 微軟
- 事件應該是由内向外傳播,事件觸發時,先觸發目前元素上的事件,再是祖先元素的事件
- 事件應該在冒泡階段執行
- 網景
- 事件應該是由外向内傳播,先祖先,後元素本身
- W3C将事件傳播分成了三個階段
- 捕獲階段:在捕獲階段時,從祖先元素向目标元素進行事件捕獲,預設此時不會觸發事件
- 目标階段:事件捕獲到目标元素,捕獲結束開始觸發事件
- 冒泡階段:事件向祖先元素冒泡,并執行
- IE8及以下沒有事件捕獲階段
- 滾輪事件
- onmousewheel滑鼠滾輪滾動事件,會在滾輪滾動時觸發
- 火狐不支援,用DOMMouseScroll解決,需要通過addEventListner綁定
- onmousewheel滑鼠滾輪滾動事件,會在滾輪滾動時觸發
- 鍵盤事件
- onkeydown 按鍵被按下
- onkeyup 按鍵松開
- 鍵盤事件一般綁定給可以擷取到焦點的對象或者document
- BOM 浏覽器對象模型
- Window 代表整個浏覽器的視窗,同時也是網頁中的全局對象
- Navigator 代表目前浏覽器的資訊,可以通過該對象識别不同的浏覽器,不太行,用userAgent
- Location 代表目前浏覽器的位址欄資訊
- History 代表浏覽器的曆史記錄(隐私問題,隻能擷取到當次通路前進或後退的曆史記錄)
- Screen 代表使用者的螢幕資訊,該對象可以擷取到使用者的顯示器的相關資訊、
- 上述内容,都可以通過window擷取
- 定時器 setInterval(function(){}, time)
- 定時調用,可以将一個函數,每隔一段時間(time毫秒)執行一次
- 傳回值是一個Number型的資料,這個數字用來辨別唯一的定時器
- clearInterval(定時器的傳回值) 關閉定時器
- 延時調用 setTimeout(function(){}, time)
- 延時用,将一個函數在指定時間(time毫秒)後執行一次
- 傳回值是一個Number型的資料,這個數字用來辨別唯一的延時調用
- clearTimeout(延時調用的傳回值)
- JSON
- JSON就是一個特殊的字元串,這個字元串可以被任意的語言識别,以及轉換
- 用來進行資料傳遞
- JavaScript用JSON對象來做JS對象和JSON字元串的互相轉換
- JSON.parse(jsonStr) JSON字元串轉JS對象
- JSON.stringify(jsObject) JS對象轉JSON字元串
Tips
- 取消綁定事件的預設行為。
- 在綁定的回調函數中return false;
- return對addEventListener不好用,用event.preventDefault(); 調用一下就可以(IE8不支援)
- 通過style屬性來修改元素的樣式,每修改一個樣式,浏覽器就重新渲染一次頁面,性能差。可以修改class去替換樣式
- 取消輸入框按鍵按下的預設行為,就輸入不進去了
- 擷取滾動條
- chrome認為是body的
- document.body.scrollTop
- document.body.scrollLeft
- 火狐認為是html的
- document.documentElement.scrollTop
- document.documentElement.scrollLeft
- chrome認為是body的
- setCaputer() 在處理一個 mousedown 事件過程中調用這個方法來把全部的滑鼠事件重新定向到這個元素,直到滑鼠按鈕被釋放或者 document.releaseCapture() 被調用。
- releaseCapture() 如果該 document 中的一個元素之上目前啟用了滑鼠捕獲,則釋放滑鼠捕獲。
- className 屬性擷取元素class值
- innerHTML擷取元素内部的HTML代碼
- innerText元素内部的文本内容
- 變量聲明提前,使用var聲明的變量,會先執行,在聲明前輸出不會出錯,會傳回undefined
// var a; 提前了,但是指派10并沒有提前 console.log(a); // 會輸出undefined var a = 10;
- var result = confirm() 确認框,确認和取消。确認傳回true,取消傳回false
- var str = prompt(); 會彈出一個帶有文本輸入框的提示框,輸入後可以取得值