天天看點

JS入門到進階知識總結

一. 初始JavaScript

1.概念

JavaScript 是世界上最流行的語言之一,是一種運作在用戶端的腳本語言

  • 運作在用戶端浏覽器中的。每一個浏覽器都有JavaScript的解析引擎
  • 腳本語言:不需要編譯,直接就可以被浏覽器解析執行了

功能:

  • 可以來增強使用者和html頁面的互動過程,可以來控制html元素,讓頁面有一些動态的效果,增強使用者的體驗。

2.JS的組成

JS入門到進階知識總結

3. 與html結合方式

1.行内式

<input type="button" value="點我試試" οnclick="alert('Hello World')"      

注:

  • 可以将單行或少量 JS 代碼寫在HTML标簽的事件屬性中(以 on 開頭的屬性),如:onclick
  • 注意單雙引号的使用:在HTML中我們推薦使用雙引号, JS 中我們推薦使用單引号
  • 可讀性差, 在html中編寫JS大量代碼時,不友善閱讀;
  • 引号易錯,引号多層嵌套比對時,非常容易弄混;
  • 特殊情況下使用

2.内嵌 JS

<script>
alert('Hello World~!');      

注:

  • 可以将多行JS代碼寫到 <’‘script’’> 标簽中
  • 内嵌 JS 是學習時常用的方式

3.外部 JS檔案

<script src="my.js"></script>      
  • 利于HTML頁面代碼結構化,把大段 JS代碼獨立到 HTML 頁面之外,既美觀,也友善檔案級别的複用
  • 引用外部 JS檔案的 script 标簽中間不可以寫代碼
  • 适合于JS 代碼量比較大的情況

3.JS注釋

  1. 單行注釋
// 用來注釋單行文字( 快捷鍵 ctrl + / )      
  1. 多行注釋
/*
擷取使用者年齡和姓名
并通過提示框顯示出來
*/      

4.JS的輸入輸出語句

JS入門到進階知識總結

注:

  1. console.dir()可以輸出對象的屬性.

二. JS基礎文法

1. 變量

變量:一小塊存儲資料的記憶體空間

Java語言是強類型語言,而JavaScript是弱類型語言。

強類型:在開辟變量存儲空間時,定義了空間将來存儲的資料的資料類型。隻能存儲固定類型的資料

弱類型:在開辟變量存儲空間時,不定義空間将來的存儲資料類型,可以存放任意類型的資料。

文法:

;      

注:

  • typeof運算符:擷取變量的類型。
  • null運算後得到的是object

2.資料類型

JS 把資料類型分為兩類:

  • 簡單資料類型 (Number,String,Boolean,Undefined,Null)
  • 複雜資料類型 (object)

1.數字型 Number

數字型三個特殊值

Infinity ,代表無窮大,大于任何數值

-Infinity ,代表無窮小,小于任何數值

NaN ,Not a number,代表一個非數值

注:

isNaN()方法用來判斷一個變量是否為非數字的類型,傳回 true 或者 false

JS入門到進階知識總結
JS入門到進階知識總結

2.字元串型 String

字元串型可以是引号中的任意文本,其文法為 雙引号 “” 和 單引号’’

var strMsg = "我愛北京天安門~"; // 使用雙引号表示字元串
var strMsg2 = '我愛吃豬腳~'; // 使用單引号表示字元串
// 常見錯誤
var strMsg3 = 我愛大肘子;      

注:

  1. 因為 HTML 标簽裡面的屬性使用的是雙引号,JS 這裡我們更推薦使用單引号。
  2. JS 可以用單引号嵌套雙引号 ,或者用雙引号嵌套單引号 (外雙内單,外單内雙)
  3. 通過字元串的 length 屬性可以擷取整個字元串的長度。
  4. 多個字元串之間可以使用 + 進行拼接,其拼接方式為 字元串 + 任何類型 = 拼接之後的新字元串

3.布爾型 Boolean

  1. 布爾類型有兩個值:true 和 false ,其中 true 表示真(對),而 false 表示假(錯)。
  2. 布爾型和數字型相加的時候, true 的值為 1 ,false 的值為 0。
console.log(true + 1); // 2
console.log(false + 1);      

4.Undefined 和 Null

  1. 一個聲明後沒有被指派的變量會有一個預設值 undefined ( 如果進行相連或者相加時,注意結果)
var variable;
console.log(variable); // undefined
console.log('你好' + variable); // 你好undefined
console.log(11 + variable); // NaN
console.log(true + variable);      
  1. 一個聲明變量給 null 值,裡面存的值為空(學習對象時,我們繼續研究null)
var vari = null;
console.log('你好' + vari); // 你好null
console.log(11 + vari); // 11
console.log(true + vari);      

5.資料類型轉換

JS入門到進階知識總結
  • toString() 和 String() 使用方式不一樣。
  • 三種轉換方式,我們更喜歡用第三種加号拼接字元串轉換方式, 這一種方式也稱之為隐式轉換。
  1. 轉換為數字型
  2. JS入門到進階知識總結

3. 運算符

  1. 一進制運算符:隻有一個運算數的運算符
  1. ++,-- , +(正号)
  2. ++ --: 自增(自減)
  3. ++(–) 在前,先自增(自減),再運算
  4. ++(–) 在後,先運算,再自增(自減)
  5. +(-):正負号

注意:在JS中,如果運算數不是運算符所要求的類型,那麼js引擎會自動的

  1. 算數運算符
+ - * / % ...      
  1. 指派運算符
= += -+…
  1. 比較運算符
< >= <= == ===(全等于)

比較方式

  1. 類型相同:直接比較

    字元串:按照字典順序比較。按位逐一比較,直到得出大小為止。

  2. 類型不同:先進行類型轉換,再比較

    ===:全等于。在比較之前,先判斷類型,如果類型不一樣,則直接傳回false

  1. 邏輯運算符

    && || !

    * 其他類型轉boolean:

​ 1. number:0或NaN為假,其他為真 2. string:除了空字元串(""),其他都是true 3. null&undefined:都是false 4. 對象:所有對象都為true ​

  1. 三元運算符

? : 表達式

var a = 3;

var b = 4;

​ var c = a > b ? 1:0; ​

文法:

表達式? 值1:值2;

判斷表達式的值,如果是true則取值1,如果是false則取值2;

4. 流程控制語句:

  1. f…else…
  2. switch:
  3. 在java中,switch語句可以接受的資料類型: byte int shor char,枚舉(1.5) ,String(1.7)

    switch(變量):

    case 值:

    在JS中,switch語句可以接受任意的原始資料類型

  4. while
  5. do…while
  6. for

5. JS特殊文法:

​ 1. 語句以;結尾,如果一行隻有一條語句則 ;可以省略 (不建議) 2. 變量的定義使用var關鍵字,也可以不使用 用: 定義的變量是局部變量 不用:定義的變量是全局變量(不建議) ​

三.基本對象

1.數組

數組是指一組資料的集合,其中的每個資料被稱作元素,在數組中可以存放任意類型的元素。數組是一種将一組資料存儲在單個變量名下的優雅方式

1.建立數組

  1. 利用 new 建立數組
var 數組名 = new Array() ;
var arr = new Array(); // 建立一個新的空數組      
  1. 利用數組字面量建立數組
//1. 使用數組字面量方式建立空的數組
var 數組名 = [];
//2. 使用數組字面量方式建立帶初始值的數組
var 數組名 = ['小白','小黑','大黃','瑞奇']      

注:

  • 聲明數組并指派稱為數組的初始化
  • 這種字面量方式也是我們以後最多使用的方式

2.周遊數組

var arr = ['red','green', 'blue'];
for(var i = 0; i < arr.length; i++){
  console.log(arrStus[i]);
}      

注意:

  1. 使用“數組名.length”可以通路數組元素的數量(數組長度)。
  2. 當我們數組裡面的元素個數發生了變化,這個 length 屬性跟着一起變化。

2.函數對象

函數:就是封裝了一段可被重複調用執行的代碼塊。通過此代碼塊可以實作大量代碼的重複使用。

1.函數的使用

函數在使用時分為兩步:聲明函數和調用函數。

  1. 聲明函數
// 聲明函數
function 函數名() {
//函數體代碼
}      
  1. 調用函數
函數名();      

注意:聲明函數本身并不會執行代碼,隻有調用函數時才會執行函數體代碼。

2.函數的傳回值

return 語句的文法格式如下:

// 聲明函數
function 函數名(){
...
return 需要傳回的值;
}
// 調用函數
函數名(); // 此時調用函數就可以得到函數體内return 後面的值      

注意:

  • 在使用 return 語句時,函數會停止執行,并傳回指定的值
  • 如果函數沒有 return ,傳回的值是 undefined

break ,continue ,return 的差別

break :結束目前的循環體(如 for、while)

continue :跳出本次循環,繼續執行下次循環(如for、while)

return :不僅可以退出循環,還能夠傳回 return 語句中的值,同時還可以結束目前的函數體内的代碼

3.arguments的使用

JS中所有函數都内置了一個 arguments 對象,arguments 對象中存儲了傳遞的所有實參。

arguments展示形式是一個僞數組,是以可以進行周遊。僞數組具有以下特點:

  • 具有 length 屬性
  • 按索引方式儲存資料
  • 不具有數組的 push , pop 等方法

4. 函數的兩種聲明方式

  1. 自定義函數方式

    利用函數關鍵字 function 自定義函數方式。

// 聲明定義方式
function fn() {...}
// 調用
fn();      

注:

  • 因為有名字,是以也被稱為命名函數
  • 調用函數的代碼既可以放到聲明函數的前面,也可以放在聲明函數的後面
  1. 函數表達式方式(匿名函數)
// 這是函數表達式寫法,匿名函數後面跟分号結束
var fn = function(){...};
// 調用的方式,函數調用必須寫到函數體下面
fn();      

注:

  • 因為函數沒有名字,是以也被稱為匿名函數
  • 這個fn 裡面存儲的是一個函數

3.自定義對象

在 JavaScript 中,對象是一組無序的相關屬性和方法的集合,所有的事物都是對象,例如字元串、數值、數組、函數等。

對象是由屬性和方法組成的。

  • 屬性:事物的特征,在對象中用屬性來表示(常用名詞)
  • 方法:事物的行為,在對象中用方法來表示(常用動詞)

1.建立對象的三種方式

在 JavaScript 中,現階段我們可以采用三種方式建立對象(object):

  1. 利用字面量建立對象
  2. 利用 new Object 建立對象
  3. 利用構造函數建立對象
  1. 利用字面量建立對象

    對象字面量:就是花括号 { } 裡面包含了表達這個具體事物(對象)的屬性和方法。

    { } 裡面采取鍵值對的形式表示

var star = {
name : 'pink',
age : 18,
sex : '男',
sayHi : function(){
alert('大家好啊~');
}
};      
  1. 利用new Object建立對象
var andy = new Obect();
andy.name = 'pink';
andy.age = 18;
andy.sex = '男';
andy.sayHi = function(){
alert('大家好啊~');
}      
  1. 利用構造函數建立對象

在 js 中,使用構造函數要時要注意以下兩點:

  1. 構造函數用于建立某一類對象,其首字母要大寫
  2. 構造函數要和 new 一起使用才有意義
function Person(name, age, sex) {
this.name = name;
this.age = age;
this.sex = sex;
this.sayHi = function() {
alert('我的名字叫:' + this.name + ',年齡:' + this.age + ',性别:' + this.sex);
}
}
var bigbai = new Person('大白', 100, '男');
var smallbai = new Person('小白', 21, '男');
console.log(bigbai.name);
console.log(smallbai.name);      

注意:

  1. 構造函數約定首字母大寫。
  2. 函數内的屬性和方法前面需要添加 this ,表示目前對象的屬性和方法。
  3. 構造函數中不需要 return 傳回結果。
  4. 當我們建立對象的時候,必須用 new 來調用構造函數。

2.周遊對象屬性

for…in 語句用于對數組或者對象的屬性進行循環操作。

其文法如下:

for (變量 in 對象名字) {
// 在此執行代碼
}      

舉例:

for (var k in obj) {
console.log(k); // 這裡的 k 是屬性名
console.log(obj[k]); // 這裡的 obj[k] 是屬性值
}      

4.JS内置對象

JavaScript 中的對象分為3種:自定義對象 、内置對象、 浏覽器對象

前面兩種對象是JS 基礎 内容,屬于 ECMAScript; 第三個浏覽器對象屬于我們JS 獨有的, 具體見JS API 部分

内置對象就是指 JS 語言自帶的一些對象,這些對象供開發者使用,并提供了一些常用的或是最基本而必要的功能(屬性和方法)

1.Math對象

JS入門到進階知識總結

随機數方法 random()

random() 方法可以随機傳回一個小數,其取值範圍是 [0,1)

舉例:得到一個兩數之間的随機整數,包括兩個數在内

function getRandom(min, max) {
  return Math.floor(Math.random() * (max - min + 1)) + min;
}      

2.Date對象

Date 對象和 Math 對象不一樣,他是一個構造函數,是以我們需要執行個體化後才能使用

  1. Date()方法的使用

    擷取目前時間必須執行個體化

var now = new Date();
console.log(now);      
  1. Date() 構造函數的參數

    如果括号裡面有時間,就傳回參數裡面的時間。例如日期格式字元串為‘2019-5-1’,可以寫成new Date(‘2019-5-1’)或者 new Date(‘2019/5/1’)

注意:

  • 如果Date()不寫參數,就傳回目前時間
  • 如果Date()裡面寫參數,就傳回括号裡面輸入的時間
  1. 日期格式化
  2. JS入門到進階知識總結

3.數組對象

1.數組對象的建立

建立數組對象的兩種方式

  1. 字面量方式
  2. new Array()

2.添加删除數組元素的方法

JS入門到進階知識總結

3.數組排序

JS入門到進階知識總結

4.數組索引方法

JS入門到進階知識總結

5.數組轉換為字元串

JS入門到進階知識總結

其他:

JS入門到進階知識總結

4.字元串對象

1.根據字元傳回位置

JS入門到進階知識總結

2.根據位置傳回字元(重點)

JS入門到進階知識總結

3.字元串操作方法(重點)

JS入門到進階知識總結

其他:

  1. replace() 方法用于在字元串中用一些字元替換另一些字元。

    其使用格式如下:

replace(被替換的字元串, 要替換為的字元串);      
  1. split()方法

    split()方法用于切分字元串,它可以将字元串切分為數組。在切分完畢之後,傳回的是一個新數組。

var str = 'a,b,c,d';
console.log(str.split(',')); // 傳回的是一個數組 [a, b, c, d]      
  1. toUpperCase() //轉換大寫
  2. toLowerCase() //轉換小寫

四.DOM

文檔對象模型(Document Object Model,簡稱 DOM),是 W3C 組織推薦的處理可擴充标記語言(HTML或者XML)的标準程式設計接口。

W3C 已經定義了一系列的 DOM 接口,通過這些 DOM 接口可以改變網頁的内容、結構和樣式。

DOM樹

JS入門到進階知識總結

注:

  • 文檔:一個頁面就是一個文檔,DOM 中使用 document 表示
  • 元素:頁面中的所有标簽都是元素,DOM 中使用 element 表示
  • 節點:網頁中的所有内容都是節點(标簽、屬性、文本、注釋等),DOM 中使用 node 表示

1.擷取元素

①.根據ID擷取

使用 getElementById() 方法可以擷取帶有 ID 的元素對象。

document.getElementById('id')      

②根據标簽名擷取

使用 getElementsByTagName() 方法可以傳回帶有指定标簽名的對象的集合。

document.getElementsByTagName('标簽名');      

注:還可以擷取某個元素(父元素)内部所有指定标簽名的子元素.

element.getElementsByTagName('标簽名');      

③通過 HTML5 新增的方法擷取

1. document.getElementsByClassName(‘類名’);// 根據類名傳回元素對象集合
2. document.querySelector('選擇器'); // 根據指定選擇器傳回第一個元素對象
3. document.querySelectorAll('選擇器'); // 根據指定選擇器傳回      

注意:

  • querySelector 和 querySelectorAll裡面的選擇器需要加符号,比如:document.querySelector(’#nav’);

④擷取特殊元素(body,html)

1. doucumnet.body // 傳回body元素對象
2. document.documentElement // 傳回html元素對象      

2.事件基礎

事件三要素

  1. 事件源 (誰)
  2. 事件類型 (什麼事件)
  3. 事件處理程式 (做啥)

執行事件的步驟

  1. 擷取事件源
  2. 注冊事件(綁定事件)
  3. 添加事件處理程式(采取函數指派形式)

常見的滑鼠事件

JS入門到進階知識總結

4.操作元素

DOM 操作可以改變網頁内容、結構和樣式,我們可以利用 DOM 操作元素來改變元素裡面的内容 、屬性等

1.改變元素内容

element.innerText()//從起始位置到終止位置的内容, 但它去除 html 标簽, 同時空格和換行也會去掉
element.innerHTML()//起始位置到終止位置的全部内容,包括 html 标簽,同時保留白格和換行      

2.常用元素的屬性操作

1. innerText、innerHTML 改變元素内容
2. src、href
3.      

3.表單元素的屬性操作

type、value、checked、selected、disabled      

4.樣式屬性操作

我們可以通過 JS 修改元素的大小、顔色、位置等樣式。

1. element.style 行内樣式操作
2. element.className 類名樣式操作      

注意:

1.JS 裡面的樣式采取駝峰命名法 比如 fontSize、 backgroundColor

2.JS 修改 style 樣式操作,産生的是行内樣式,CSS 權重比較高

操作元素總結

JS入門到進階知識總結

5.自定義屬性的操作

擷取屬性值

  • element.屬性 擷取屬性值。
  • element.getAttribute(‘屬性’);

差別:

  1. element.屬性 擷取内置屬性值(元素本身自帶的屬性)
  2. element.getAttribute(‘屬性’); 主要獲得自定義的屬性 (标準) 我們程式員自定義的屬性

設定屬性值

  • element.屬性 = ‘值’ 設定内置屬性值。
  • element.setAttribute(‘屬性’, ‘值’);

差別:

  1. element.屬性 設定内置屬性值
  2. element.setAttribute(‘屬性’); 主要設定自定義的屬性 (标準)

移除屬性

  • element.removeAttribute(‘屬性’);

5.節點操作

網頁中的所有内容都是節點(标簽、屬性、文本、注釋等),在DOM 中,節點使用 node 來表示

HTML DOM 樹中的所有節點均可通過 JavaScript 進行通路,所有 HTML 元素(節點)均可被修改,也可以建立或删除。

JS入門到進階知識總結

1.概述

一般地,節點至少擁有nodeType(節點類型)、nodeName(節點名稱)和nodeValue(節點值)這三個基本屬性。

  • 元素節點 nodeType 為 1
  • 屬性節點 nodeType 為 2
  • 文本節點 nodeType 為 3 (文本節點包含文字、空格、換行等)

注:我們在實際開發中,節點操作主要操作的是元素節點

2.節點層級

利用 DOM 樹可以把節點劃分為不同的層級關系,常見的是父子兄層級關系。

  1. 父級節點
node.parentNode      

注:

  • parentNode 屬性可傳回某節點的父節點,注意是最近的一個父節點
  • 如果指定的節點沒有父節點則傳回 null
  1. 子節點
(1) parentNode.childNodes (标準)      

parentNode.childNodes 傳回包含指定節點的子節點的集合,該集合為即時更新的集合。

注意:傳回值裡面包含了所有的子節點,包括元素節點,文本節點等。

如果隻想要獲得裡面的元素節點,則需要專門處理。 是以我們一般不提倡使用childNodes

var ul = document. querySelector(‘ul’);
for(var i = 0; i < ul.childNodes.length;i++) {
  if (ul.childNodes[i].nodeType == 1) {
    // ul.childNodes[i] 是元素節點
    console.log(ul.childNodes[i]);
  }
}      
(2) parentNode.children (非标準)      

parentNode.children 是一個隻讀屬性,傳回所有的子元素節點。它隻傳回子元素節點,其餘節點不傳回 。

雖然children 是一個非标準,但是得到了各個浏覽器的支援,是以我們可以放心使用

(3) parentNode.firstChild
firstChild 傳回第一個子節點,找不到則傳回null。同樣,也是包含所有的節點。
(4) parentNode.lastChild
lastChild 傳回最後一個子節點,找不到則傳回null。同樣,也是包含所有的節點。
(5) parentNode.firstElementChild
firstElementChild 傳回第一個子元素節點,找不到則傳回null。
(6) parentNode.lastElementChild
lastElementChild 傳回最後一個子元素節點,找不到則傳回null。      
  1. 兄弟節點
(1)node.nextElementSibling
nextElementSibling 傳回目前元素下一個兄弟元素節點,找不到則傳回null。
(2) node.previousElementSibling
previousElementSibling 傳回目前元素上一個兄弟節點,找不到則傳回null。      

注:實際開發中使用的很少,了解即可

  1. 建立節點
document.createElement('tagName')      

document.createElement() 方法建立由 tagName 指定的 HTML 元素。因為這些元素原先不存在,是根據我們的需求動态生成的,是以我們也稱為動态建立元素節點。

  1. 添加節點
node.appendChild(child)//将一個節點添加到指定父節點的子節點清單末尾。類似于 CSS 裡面的after 僞元素。
node.insertBefore(child, 指定元素)//将一個節點添加到父節點的指定子節點前面。類似于 CSS 裡面的 before      
  1. 删除,複制節點
node.removeChild(child)//從 DOM 中删除一個子節點,傳回删除的節點
node.cloneNode()//傳回調用該方法的節點的一個副
   1. 如果括号參數為空或者為 false ,則是淺拷貝,即隻克隆複制節點本身,不克隆裡面的子節點。
   2. 如果括号參數為 true      

五.事件進階

1.注冊事件(綁定事件)

注冊事件有兩種方式:傳統方式和方法監聽注冊方式

傳統注冊方式

利用 on 開頭的事件 onclick

<button onclick=“alert('hi~')”></button>
btn.onclick = function() {}      

特點: 注冊事件的唯一性

同一個元素同一個事件隻能設定一個處理函數,最後注冊的處理函數将會覆寫前面注冊的處理函數

addEventListener 事件監聽方式

.addEventListener(type, listener[, useCapture])      

eventTarget.addEventListener()方法将指定的監聽器注冊到eventTarget(目标對象)上,當該對象觸發指定的事件時,就會執行事件處理函數。

該方法接收三個參數:

  • type:事件類型字元串,比如 click 、mouseover ,注意這裡不要帶 on
  • listener:事件處理函數,事件發生時,會調用該監聽函數
  • useCapture:可選參數,是一個布爾值,預設是 false。學完 DOM 事件流後,我們再進一步學習

attachEvent 事件監聽方式

eventTarget.attachEvent(eventNameWithOn, callback)      

eventTarget.attachEvent()方法将指定監聽器注冊到eventTarget(目标對象)上,當該對象觸發指定的事件時,指定的回調函數就會被執行。

這個知道就行,現在幾乎不用.

2. 删除事件(解綁事件)

  1. 傳統注冊方式
eventTarget.onclick = null;      
  1. 方法監聽注冊方式
① eventTarget.removeEventListener(type, listener[, useCapture]);
② eventTarget.detachEvent(eventNameWithOn, callback);      

3.DOM事件流

事件流描述的是從頁面中接收事件的順序。

事件發生時會在元素節點之間按照特定的順序傳播,這個傳播過程即 DOM 事件流。

比如我們給一個div 注冊了點選事件:

DOM 事件流分為3個階段:

  1. 捕獲階段
  2. 目前目标階段
  3. 冒泡階段
  • 事件冒泡: IE 最早提出,事件開始時由最具體的元素接收,然後逐級向上傳播到到 DOM 最頂層節點的過程。
  • 事件捕獲: 網景最早提出,由 DOM 最頂層節點開始,然後逐級向下傳播到到最具體的元素接收的過程。
  • JS入門到進階知識總結
  • 注意
1. JS 代碼中隻能執行捕獲或者冒泡其中的一個階段。
2. onclick 和 attachEvent 隻能得到冒泡階段。
3. addEventListener(type, listener[, useCapture])第三個參數如果是 true,表示在事件捕
獲階段調用事件處理程式;如果是 false(不寫預設就是false),表示在事件冒泡階段調用事件處理
程式。
4. 實際開發中我們很少使用事件捕獲,我們更關注事件冒泡。
5. 有些事件是沒有冒泡的,比如 onblur、onfocus、onmouseenter、onmouseleave
6.      

4.事件對象

官方解釋:event 對象代表事件的狀态,比如鍵盤按鍵的狀态、滑鼠的位置、滑鼠按鈕的狀态。

簡單了解:事件發生後,跟事件相關的一系列資訊資料的集合都放到這個對象裡面,這個對象就是事件對象event,它有很多屬性和方法。

比如:

  1. 誰綁定了這個事件。
  2. 滑鼠觸發事件的話,會得到滑鼠的相關資訊,如滑鼠位置。
  3. 鍵盤觸發事件的話,會得到鍵盤的相關資訊,如按了哪個鍵。

事件對象的使用文法

.onclick = function(event) {
// 這個 event 就是事件對象,我們還喜歡的寫成 e 或者 evt
}
eventTarget.addEventListener('click', function(event) {
// 這個 event 就是事件對象,我們還喜歡的寫成 e 或者 evt
})      

這個 event 是個形參,系統幫我們設定為事件對象,不需要傳遞實參過去。

e.target 和 this 的差別:

this 是事件綁定的元素, 這個函數的調用者(綁定這個事件的元素) e.target 是事件觸發的元素。

事件對象的常見屬性和方法

JS入門到進階知識總結

5.阻止事件冒泡

事件冒泡:開始時由最具體的元素接收,然後逐級向上傳播到到 DOM 最頂層節點。

事件冒泡本身的特性,會帶來的壞處,也會帶來的好處

阻止事件冒泡的裡昂中方式

  1. 标準寫法:利用事件對象裡面的 stopPropagation()方法
e.stopPropagation()      
  1. 非标準寫法:IE 6-8 利用事件對象 cancelBubble 屬性
e.cancelBubble = true;      

6.事件委托(代理、委派)

7.常用的滑鼠事件

JS入門到進階知識總結
  1. 禁止滑鼠右鍵菜單

    contextmenu主要控制應該何時顯示上下文菜單,主要用于程式員取消預設的上下文菜單

document.addEventListener('contextmenu', function(e) {
e.preventDefault();
})      
  1. 禁止滑鼠選中(selectstart 開始選中)
document.addEventListener('selectstart', function(e) {
e.preventDefault();
})      
  1. 滑鼠事件對象

    event對象代表事件的狀态,跟事件相關的一系列資訊的集合。現階段我們主要是用滑鼠事件對象MouseEvent 和鍵盤事件對象 KeyboardEvent。

  2. JS入門到進階知識總結

8.常用的鍵盤事件

事件除了使用滑鼠觸發,還可以使用鍵盤觸發.

JS入門到進階知識總結

注意: onkeypress 和前面2個的差別是,它不識别功能鍵,比如左右箭頭,shift 等。鍵盤事件對象

JS入門到進階知識總結

注意: onkeydown 和 onkeyup不區分字母大小寫,onkeypress 區分字母大小寫。

六.BOM對象

BOM(Browser Object Model)即浏覽器對象模型,它提供了獨立于内容而與浏覽器視窗進行互動的對象,其核心

對象是 window。

BOM 由一系列相關的對象構成,并且每個對象都提供了很多方法與屬性。

DOM和BOM比較

JS入門到進階知識總結

1.BOM的構成

BOM 比 DOM 更大,它包含 DOM。

JS入門到進階知識總結

window 對象是浏覽器的頂級對象,它具有雙重角色。

  1. 它是 JS 通路浏覽器視窗的一個接口。
  2. 它是一個全局對象。定義在全局作用域中的變量、函數都會變成 window 對象的屬性和方法。

在調用的時候可以省略 window,前面學習的對話框都屬于 window 對象方法,如 alert()、prompt() 等。

2.window 對象的常見事件

1.視窗加載事件

window.onload 是視窗 (頁面)加載事件,當文檔内容完全加載完成會觸發該事件(包括圖像、腳本檔案、CSS

檔案等), 就調用的處理函數。

.onload = function(){}
或者
window.addEventListener("load",function(){});      

注意:

  1. 有了 window.onload 就可以把 JS 代碼寫到頁面元素的上方,因為 onload 是等頁面内容全部加載完畢, 再去執行處理函數。
  2. window.onload 傳統注冊事件方式 隻能寫一次,如果有多個,會以最後一個 window.onload 為準。
  3. 如果使用 addEventListener 則沒有限制

補充:

document.addEventListener('DOMContentLoaded',function(){})      

DOMContentLoaded 事件觸發時,僅當DOM加載完成,不包括樣式表,圖檔,flash等等。

2.調整視窗大小事件

window.onresize 是調整視窗大小加載事件, 當觸發時就調用的處理函數。

window.onresize = function(){}
window.addEventListener("resize",function(){});      

注意:

  1. 隻要視窗大小發生像素變化,就會觸發這個事件。
  2. 我們經常利用這個事件完成響應式布局。 window.innerWidth 目前螢幕的寬度

3.兩種定時器

window 對象給我們提供了 2 個非常好用的方法-定時器。

  • setTimeout()
  • setInterval()

1.setTimeout()方法

window.setTimeout(調用函數, [延遲的毫秒數]);      

setTimeout() 方法用于設定一個定時器,該定時器在定時器到期後執行調用函數。

注意:

  1. window 可以省略。
  2. 這個調用函數可以直接寫函數,或者寫函數名或者采取字元串‘函數名()'三種形式。第三種不推薦
  3. 延遲的毫秒數省略預設是 0,如果寫,必須是毫秒。
  4. 因為定時器可能有很多,是以我們經常給定時器指派一個辨別符。
window.setTimeout(調用函數, [延遲的毫秒數]);
window.clearTimeout(timeoutID)//取消了先前通過調用 setTimeout() 建立的定時器。      

setTimeout() 這個調用函數我們也稱為回調函數 callback

普通函數是按照代碼順序直接調用。而這個函數,需要等待時間,時間到了才去調用這個函數,是以稱為回調函數。

  1. 簡單了解: 回調,就是回頭調用的意思。上一件事幹完,再回頭再調用這個函數。
  2. 我們學習過的 element.onclick = function(){} 或element.addEventListener(“click”, fn); 裡面的 函數也是回調函數。

2.setInterval() 定時器

window.setInterval(回調函數, [間隔的毫秒數]);
window.clearInterval(intervalID);//停止 setInterval() 定時器      

setInterval() 方法重複調用一個函數,每隔這個時間,就去調用一次回調函數。

注意:

  1. window 可以省略。
  2. 這個調用函數可以直接寫函數,或者寫函數名或者采取字元串 ‘函數名()’ 三種形式。
  3. 間隔的毫秒數省略預設是 0,如果寫,必須是毫秒,表示每隔多少毫秒就自動調用這個函數。
  4. 因為定時器可能有很多,是以我們經常給定時器指派一個辨別符。
  5. 第一次執行也是間隔毫秒數之後執行,之後每隔毫秒數就執行一次。

補充:關于this

  1. 全局作用域或者普通函數中this指向全局對象window(注意定時器裡面的this指向window)
  2. 方法調用中誰調用this指向誰

    3.構造函數中this指向構造函數的執行個體

4.JS執行隊列

…此處省略

5.location 對象

window 對象給我們提供了一個 location 屬性用于擷取或設定窗體的 URL,并且可以用于解析 URL 。 因為這個屬性傳回的是一個對象,是以我們将這個屬性也稱為 location 對象。

1.URL

統一資源定位符 (Uniform Resource Locator, URL) 是網際網路上标準資源的位址。網際網路上的每個檔案都有一個唯一的 URL,它包含的資訊指出檔案的位置以及浏覽器應該怎麼處理它。

URL 的一般文法格式為:

protocol://host[:port]/path/[?query]#fragment
http://www.itcast.cn/index.html?name=andy&age=18#link      
JS入門到進階知識總結

2.location 對象的屬性

JS入門到進階知識總結

重點記住: href 和 search

3.location 對象的方法

JS入門到進階知識總結

6.history 對象

window 對象給我們提供了一個 history 對象,與浏覽器曆史記錄進行互動。該對象包含使用者(在浏覽器視窗中)通路過的 URL。

JS入門到進階知識總結

七.PC端網頁特效

1. 元素偏移量 offset 系列

offset 翻譯過來就是偏移量, 我們使用 offset 系列相關屬性可以動态的得到該元素的位置(偏移)、大小等。

  • 獲得元素距離帶有定位父元素的位置
  • 獲得元素自身的大小(寬度高度)
  • 注意: 傳回的數值都不帶機關
  1. offset 系列常用屬性:
  2. JS入門到進階知識總結
  3. offset 與 style 差別
  4. JS入門到進階知識總結

offset 翻譯過來就是偏移量, 我們使用 offset 系列相關屬性可以動态的得到該元素的位置(偏移)、大小等。

  • 獲得元素距離帶有定位父元素的位置
  • 獲得元素自身的大小(寬度高度)
  • JS入門到進階知識總結

2. 元素可視區 client 系列

client 翻譯過來就是用戶端,我們使用 client 系列的相關屬性來擷取元素可視區的相關資訊。通過 client 系列的相關屬性可以動态的得到該元素的邊框大小、元素大小等。

JS入門到進階知識總結

client 翻譯過來就是用戶端,我們使用 client 系列的相關屬性來擷取元素可視區的相關資訊。通過 client 系列

的相關屬性可以動态的得到該元素的邊框大小、元素大小等。

JS入門到進階知識總結

3. 元素滾動 scroll 系列

scroll 翻譯過來就是滾動的,我們使用 scroll 系列的相關屬性可以動态的得到該元素的大小、滾動距離等。

JS入門到進階知識總結

如圖:

JS入門到進階知識總結

頁面被卷去的頭部

如果浏覽器的高(或寬)度不足以顯示整個頁面時,會自動出現滾動條。當滾動條向下滾動時,頁面上面被隐藏

掉的高度,我們就稱為頁面被卷去的頭部。滾動條在滾動時會觸發 onscroll 事件。

三大系列總結

JS入門到進階知識總結
  1. offset系列 經常用于獲得元素位置 offsetLeft offsetTop
  2. client 經常用于擷取元素大小 clientWidth clientHeight
  3. scroll 經常用于擷取滾動距離 scrollTop scrollLeft
  4. 注意頁面滾動的距離通過 window.pageXOffset 獲得

繼續閱讀