摘要:表示尚未存在的對象是一個有特殊意義的值。可以為變量賦值為,此時變量的值為已知狀態不是,即。用來初始化變量,清除變量內容,釋放內存結果為但含義不同。且它倆與所有其他值比較的結果都是。,需要兩個操作數同時轉為。
轉載請聲明出處 博客原文
隨手翻閱以前的學習筆記,順便整理一下放在這里,方便自己復習,也希望你有也有幫助吧
第一課時 入門基礎 知識點:操作系統就是個應用程序
只要是應用程序都要占用物理內存
瀏覽器本身也是一個應用程序
瀏覽器本身只懂得解析HTML
調用瀏覽器這個應用程序的一個功能繪制
1、javascript介紹JavaScript操作DOM的本質是=獲取+觸發+改變
目的:就是用來操作內存中的DOM節點
修改DOM節點的屬性
過javascript語法組織邏輯代碼操作DOM
BOM(window)它包含了DOM
DOM(document)
script腳本推薦放在最下邊好處:防止因網絡問題,頁面加載時間長,出現空白;即便網絡問題,瀏覽器也把DOM加載渲染完成,等待從服務端下載完js腳本,出現效果
css不放在最下面原因是:好比先穿好衣服在出去,瀏覽器先把css樣式準備好,在加載結構層,使得頁面有樣子;如果放在下面,因為頁面是從上往下加載,沒有css,就剩下裸露的標簽,很難看,使得用戶體驗不好
2、基于對象的內存管理
javascript就是來操作這些對象
通過邏輯組織對象之間的關系和行為
如何操作這些對象?通過變量引用
3、變量變量本質是一個空盒子,里面記錄了一個內存地址,使能找到內存中的對象,保存了指向具體的實在的東西的地址
變量存在棧中,對象存在堆中
變量的意義:方便我們去操作對象
變量的幾種引用方式
指針(C語言中叫法)
引用(Java)
變量
例如:
var b = document.body 含義:把body這個對象在內存中的地址放到b變量里面,變量b(b是內存地址的別名)本身也存在內存中,以后的操作是針對body這個地址
變量命名規范
由字母(a-zA-Z)數字(0-9)下劃線(_)以及美元符號($)
不能由數字開頭
命名盡量用英文并且具有一定的含義
如果有多個英文單詞,后面單詞的首字母大寫
不能使用關鍵字
首字母不要大寫,大寫是有特殊含義的
DOM在內存中的一些圖示 第二課時---
回顧上節:1、javascript介紹
2、基于對象的內存管理
javascript就是來操作這些對象
通過邏輯組織對象之間的關系和行為
如何操作這些對象?通過變量引用
3、變量
知識點: 1、window作用域只要在script標簽中定義的變量,默認就在window的作用域之下
默認就是window這個對象里面寫代碼
2、數據類型typeof、instanceof、 constructor、 prototype方法比較
如何判斷js中的類型呢,先舉幾個例子:
var a = "iamstring."; var b = 222; var c= [1,2,3]; var d = new Date(); var e = function(){alert(111);}; var f = function(){this.name="22";};
alert(typeof a) ------------> string alert(typeof b) ------------> number alert(typeof c) ------------> object alert(typeof d) ------------> object alert(typeof e) ------------> function alert(typeof f) ------------> function
其中typeof返回的類型都是字符串形式,需注意,例如:
alert(typeof a == "string") -------------> true alert(typeof a == String) ---------------> false
另外typeof 可以判斷function的類型;在判斷除Object類型的對象時比較方便。
alert(c instanceof Array) ---------------> true alert(d instanceof Date) alert(f instanceof Function) ------------> true alert(f instanceof function) ------------> false
注意:instanceof 后面一定要是對象類型,并且大小寫不能錯,該方法適合一些條件選擇或分支。
alert(c.constructor === Array) ----------> true alert(d.constructor === Date) -----------> true alert(e.constructor === Function) -------> true
注意: constructor 在類繼承時會出錯
例子:
function A(){}; function B(){}; A.prototype = new B(); //A繼承自B var aObj = new A(); alert(aobj.constructor === B) -----------> true; alert(aobj.constructor === A) -----------> false;
而instanceof方法不會出現該問題,對象直接繼承和間接繼承的都會報true:
alert(aobj instanceof B) ----------------> true; alert(aobj instanceof B) ----------------> true;
言歸正傳,解決construtor的問題通常是讓對象的constructor手動指向自己:
aobj.constructor = A; //將自己的類賦值給對象的constructor屬性 alert(aobj.constructor === A) -----------> true; alert(aobj.constructor === B) -----------> false; //基類不會報true了;
alert(Object.prototype.toString.call(a) === ‘[object String]’) -------> true; alert(Object.prototype.toString.call(b) === ‘[object Number]’) -------> true; alert(Object.prototype.toString.call(c) === ‘[object Array]’) -------> true; alert(Object.prototype.toString.call(d) === ‘[object Date]’) -------> true; alert(Object.prototype.toString.call(e) === ‘[object Function]’) -------> true; alert(Object.prototype.toString.call(f) === ‘[object Function]’) -------> true;
大小寫不能寫錯,比較麻煩,但勝在通用。
通常情況下用typeof 判斷就可以了,遇到預知Object類型的情況可以選用instanceof或constructor方法
Javascript的數據類型有六種(ES6新增了第七種Symbol)數值(number):整數和小數(比如1和3.14)
字符串(string):字符組成的文本(比如"Hello World")
布爾值(boolean):true(真)和false(假)兩個特定值
undefined:表示 未定義 或不存在,即此處目前沒有任何值
null:表示空缺,即此處應該有一個值,但目前為空
對象(object):各種值組成的集合
通常,我們將數值、字符串、布爾值稱為原始類型(primitive type)的值,即它們是最基本的數據類型,不能再細分了。而將對象稱為合成類型(complex type)的值,因為一個對象往往是多個原始類型的值的合成,可以看作是一個存放各種值的容器。至于undefined和null,一般將它們看成兩個特殊值
內存中一共分為幾種對象:變量
DOM對象
常量
自定義對象
數據類型轉換toString() 轉換為字符串,在JavaScript中所有數據類型都可以轉換為string類型
var n1 = 12; var n2 = true; var a = [1, 2, 3]; var o = {}; function f(){} n1.toString(); //"12" n2.toString(); //"true" a.toString(); //"1,2,3" o.toString(); //"[object Object]" f.toString(); //"function f(){}"
parseInt() 解析出一個string或者number類型的整數部分,如果沒有可以轉換的部分,則返回NaN(not a number)
var n1 = "12"; var n2 = "23hello"; var n3 = "hello"; parseInt(n1); //12 parseInt(n2); //23 parseInt(n3); //NaN
parseFloat() 解析出一個string的浮點數部分,如果沒有可以轉換的部分,則返回NaN(not a number)
var n1 = "1.2.3"; var n2 = "1.2hello" var n3 = "hello" parseFloat(n1); //1.2 parseFloat(n2); //1.2 parseFloat(n3); //NaN
Boolean(value)- 把給定的值轉換成Boolean型
Boolean(123); //true Boolean(""); //false Boolean([]); //true Boolean({}); //true Boolean(null); //false Boolean(undefined); //false
Number(value)-把給定的值轉換成數字(可以是整數或浮點數)
Number("123"); //123 Number("123h"); //NaN Number(true); //1 Number(false); //0 Number(undefined); //NaN Number(null); //0 Number([]); //0 Number({}); //NaN
String(value)- 把給定的值轉換成字符串
String(123); //"123" String([1,2]); //"1,2" String(undefined) //"undefined" String(null) //"null" String({}) //"[object Object]"
數字+字符串:數字轉換為字符串 console.log(12+"12"); //1212
數字+布爾值:true轉換為1,false轉換為0 console.log(12+true); //13
字符串+布爾值:布爾值轉換為true或false console.log("hello"+true); //hellotrue
布爾值+布爾值 console.log(true+true); //2
undefined 表示一種未知狀態,聲明了但沒有初始化的變量,變量的值時一個未知狀態。訪問不存在的屬性或對象window.xxx)方法沒有明確返回值時,返回值是一個undefined.當對未聲明的變量應用typeof運算符時,顯示為undefined。
null表示尚未存在的對象,null是一個有特殊意義的值。可以為變量賦值為null,此時變量的值為“已知狀態”(不是undefined),即null。(用來初始化變量,清除變量內容,釋放內存)
undefined==null //結果為true,但含義不同。 undefined===null //false,兩者類型不一致,前者為“undefined”,后者為“object”3、javascript腳本執行順序
第一步定義: 分為var定義 和函數定義function
第二步執行: 其他所有
先從上往下定義完所有的后,再從上往下執行 除了var function定義外的 其他都是執行 如:賦值 函數調用
在棧里面找到的,就不去堆里面找,因為棧空間小,就近原則【總之:先在棧里面找,找不到再去堆里面找】在棧里面開辟,就能找到堆里面的地址 如:var b = function(){}
總結一下==運算的規則:(隱式轉換)JS中的值有兩種類型:原始類型(Primitive)、對象類型(Object)。
原始類型包括:Undefined、Null、Boolean、Number和String等五種。
Undefined類型和Null類型的都只有一個值,即undefined和null;Boolean類型有兩個值:true和false;Number類型的值有很多很多;String類型的值理論上有無數個。
所有對象都有valueOf()和toString()方法,它們繼承自Object,當然也可能被子類重寫
undefined == null,結果是true。且它倆與所有其他值比較的結果都是false。
String == Boolean,需要兩個操作數同時轉為Number。
String/Boolean == Number,需要String/Boolean轉為Number。
Object == Primitive,需要Object轉為Primitive(具體通過valueOf和toString方法)
第三課時 上節回顧:
1、window作用域
只要在script標簽中定義的變量,默認就在window的作用域之下
默認就是window這個對象里面寫代碼
2、數據類型
number:數字
string:字符類型,必須用引號引起來
boolean:布爾類型 true false
null:變量引用了一塊堆中一個空的空間
object:引用對象類型(存在于堆里面)
array:數組類型
function:函數數據類型
對象數據類型: object,array,function
3、javascript腳本執行順序
定義 var function
執行 其他所有
知識點: 1、運算符
算術運算符(+,-,*,/,%,++,--)
如果引用所指的地方是null的話,那么在運算中就會自動變成0
%運算符 如:4%5取模 模是4 7%5取模 模是7-5=2
字符串和數字相加的情況:
左右都是數字:數字相加
左右有一個字符串:字符串拼接
左右邊有一個null:null看做0
左右邊有一個undefined:結果是NAN(not is number)
賦值運算符(=,-=,+=,*=,/=,%=)
比較運算符(==,===,!=,>,<,>=,<=)
先執行表達式計算再賦值
==和!=在比較之前首先讓雙方的值做隱士類型轉換,===不轉換
邏輯運算符(||,&&,!)
|| 在js中和PHP中是不一樣的 js中返回邏輯或的左邊或右邊的一個結果 PHP返回||或出來以后的結果即:true false
特殊性(注意)---一定要記住(這個特性和其他編程語言不一樣):在js里返回不是布爾值
|| 短路運算 第一個條件為真 后面不執行
&&把表達式最后一個值返回(注意這里)
表達式1?表達式2:表達式3 表達式1為真 返回表達式2 否則返回表達式3
三元運算符 可以多層次嵌套使用
2、在js中 有四種被認為是非:
undefined
null
false
例子:var age = prompt("溫馨提示:","請輸入您的年齡")||0
當點擊取消的時候,如果出現undefined null fasle 0 表示非的邏輯 那么||就會過濾,取右邊的值0
第四課時 上節回顧:
1、運算符
算術運算符(+,-,*,/,%,++,--)
如果+號左邊和右邊有一邊是字符串類型的數據的話,這個時候就變成字符串拼接
var str = "你好"+123;//你好123
var count = 2;
var str1 = "你叫了我第"-count+"次";//你叫了我第2次
如果引用所指的地方是null的話,那么在運算中就會自動變成0
2、賦值運算符**(=,-=,+=,*=,/=,%=)
3、 比較運算符(==,===,!=,>,<,>=,<=)
先執行表達式計算再賦值
==和!=在比較之前首先讓雙方的值做隱士類型轉換,===不轉換
4、邏輯運算符(||,&&,!)
5、條件運算符(1>2?3:4)
知識點:開發中大量使用這個 而不用alert
if
if...else
if...else if...else
當通過判斷返回某個值的時候,優先使用三元表達式
當通過判斷執行N段邏輯代碼的時候,只能用條件結構
第五課時 上節回顧:1、console.log調試程序
2、條件結構
if
if...else
if...else if...else
當通過判斷返回某個值的時候,優先使用三元表達式
當通過判斷執行N段邏輯代碼的時候,只能用條件結構
知識點:
switch case break default 條件 判斷 退出 默認
a.只要匹配上一個case,那么它下面的所有的case都會執行包括default
b.break的意思跳出當前結構
循環有三個要素
a.循環變量
b.判斷(循環體)
c.改變循環變量
d.continue的意思結束本次循環進入下次循環
continue 結束本次循環,繼續下一次循環 當前這次循環不做 直接做下面的
break 結束后面的循環不做了
第六課時 上節回顧:1、switch
switch case break default 條件 判斷 退出 默認
a.只要匹配上一個case,那么它下面的所有的case都會執行包括default
b.break的意思跳出當前結構
2、for
循環有三個要素
a.循環變量
b.判斷條件(循環體)
c.改變循環變量
d.continue的意思結束本次循環進入下次循環
知識點: 1、while/do...while 沒有誰好誰壞 只有適應場景不同比如:先吃飯 在買單 do..while 用戶體驗高 有風險 掃雷游戲也是先體驗 在問是否退出 提高體驗
比如:先買單 在吃飯 while 用戶體驗不高
一般情況下面,如果條件判斷是數字的比較==<>,for循環優先.
如果是非數值相關的比較循環,while優先
2、代碼內存解析a.程序永遠是先定義后執行
b.執行永遠從上到下
c.函數定義的話在堆(只是一個地址而已)
d.函數調用的時候,就會有自己的堆和棧(閉包)
記住:先定義var function 在從上往下執行
定義定義在自己的棧里面 執行在自己的堆里面
運行在運行的環境中
函數每調用前 只是一個地址
只要調用一次函數就會動態開辟一塊內存 創建一個封閉的空間 在自己的封閉的空間的棧中定義var 在執行
函數執行完 里面的東西全部銷毀
//alert(x);//9:執行彈出x,結果x沒定義,錯誤. alert(i);//9:執行彈出i,然而i之前已經定義,只不過沒地址,因此是undefiend var i = 10;//1:var i; 10:把常量池中10的地址賦給棧中的i var j = "你好";//2:var j; 11:把常量池中 你好 的地址復給棧中的j var k = z = null;//3:var k,z; 12:把堆中null的地址賦值給z和k var m = function(){//4:var m; 5:function匿名函數 13:把匿名函數在堆中的地址賦給棧中的m alert(2); } var b = document.body;//6:var b; 14:把堆中document.body對象的地址賦給棧中的b var f = true;//7:var f; 15:把常量池中true的地址賦給棧中的變量f function m(){//8:function m; alert(1); }
function m(){ c = 50;//在局部變量中找不到定義的c 沿著作用域鏈找到了全局變量的c alert("哈哈哈"); //var c; } var c = 150; // 函數m()還未執行到 還沒被銷毀 此時全局c的值c=50 m(); var c = 20;//到這里一步 m()已經執行完了 函數已經銷毀了 這里的c還是20 alert(c);//20
function m(){ c = 50;//在局部變量中找不到定義的c 沿著作用域鏈找到了全局變量的c alert("哈哈哈"); function inner(){ c = 30; alert("嘻嘻"); } inner();//c在函數內部找不到定義 所以沿著作用域鏈找到了全局的c } var c = 20;//到這里一步 m()還沒執行 函數沒被銷毀 這里的c是30 m(); alert(c);//304、object對象 5、面向對象的程序設計
a.function構造器
b.prototype原型
c.foreach
c.作用域
d.繼承
一些內存圖示 原型鏈的幾張圖解
擴展閱讀
Javascript的原型鏈圖詳解
第七課時 上節回顧:1.switch
2.while/do...while
一般情況下面,如果條件判斷是數字的比較==<>,for循環優先.
如果是非數值相關的比較循環,while優先
3.function函數
4.代碼內存解析
閉包
a.程序永遠是先定義后執行
b.執行永遠從上之下
c.函數定義的話在堆(只是一個地址而已)
d.函數調用的時候,就會有自己的堆和棧(閉包)
知識點: 1、object對象new關鍵字代表的是新開辟一塊內存空間
沒有被引用的內存空間,會在適當的時候被銷毀
兩句代碼含義等同
var person = new Object();
var person = {};
訪問對象的屬性除了用 對象引用.屬性 key以外,還可以使用對象引用[屬性key]
2、面向對象的程序設計
function構造器
共同點:
動態創建一塊內存空間,閉包
不同點:
函數調用是沒有辦法拿到空間的地址的,而且這塊地址是一塊臨時地址,執行完函數之后,就會銷毀
new開辟內存空間,把這塊空間的地址返回,這塊空間就有可能長期的被引用
prototype原型
通過原型使通過同樣一個構造器所new(創建)出來的對象具有相同的屬性和行為
prototype本質就是一個對象
foreach
this 指代當前創建的這塊內存 this.name=name 指代當前內存中的這個name屬性 接收外界傳過來的值
繼承
其他:函數調用后一定有返回值,沒有返回值就是undefined
一些內存圖示 第八課時 上節回顧: 1.object對象new關鍵字代表的是新開辟一塊內存空間
沒有被引用的內存空間,會在適當的時候被銷毀
兩句代碼含義等同
var person = new Object();
var person = {};
訪問對象的屬性除了用 對象引用屬性key以外,還可以使用對象引用[屬性key]
2.面向對象的程序設計
a.function構造器
共同點:
動態創建一塊內存空間,閉包
不同點:
函數調用是沒有辦法拿到空間的地址的,而且這塊地址是一塊臨時地址,執行完函數之后,就會銷毀
new開辟內存空間,把這塊空間的地址返回,這塊空間就有可能長期的被引用
b.prototype原型
通過原型使通過同樣一個構造器所new(創建)出來的對象具有相同的屬性和行為
prototype本質就是一個對象
c.foreach
c.this
d.繼承
知識點: 1.prototype內存解析prototype是原型,是一塊所有對應構造器創建的對象都共享的內存空間
在面向對象設計程序的時候,屬性應該是對應的空間的,而功能應該是prototype公共空間的
2.通過prototype擴展功能所有的構造器都是繼承于Object構造器的,因此只要Object的原型里有的功能,所有的對象都有
//多個對象的構造 以及 多個對象之間如何建立聯系 function Student(name,age,sex){ this.name = name; this.age = age; this.sex = sex; } function Bingqilin(name){ this.name = name; } function Game(name){ this.name = name; } function Hour(time){ this.time = time; } Student.prototype = { eat:function(b){ alert(this.name+"喜歡吃"+b.name); }, mess:function(){ alert(this.name+"的信息:"+this.age+","+this.sex); }, sleep:function(h){ alert(this.name+"每天睡,"+h.time+"小時"); }, work:function(h){ alert(this.name+"每天工作,"+h.time+"小時"); }, like:function(g){ alert(this.name+"喜歡打,"+g.name); } } var s = new Student("小明",22,"男"); var b = new Bingqilin("黑色的冰淇淋"); s.eat(b);//小明喜歡吃黑色的冰淇淋 var g = new Game("英雄聯盟"); s.like(g);//把對象的地址發送給like的參數即可訪問構造函數Game的name屬性 var h = new Hour(10); s.sleep(h); s.work(h);一些內存圖示 第九課時 回顧:
prototype是原型,是一塊所有對應構造器創建的對象都共享的內存空間
在面向對象設計程序的時候,屬性應該是對應的空間的,而功能應該是prototype公共空間的
所有的構造器都是繼承于Object構造器的,因此只要Object的原型里有的功能,所有的對象都有
構造器在定義的時候 就默認創建了一個空的原型
1:找對象 小頭爸爸 大頭兒子 飯
2:抽象(類,構造器)
3:創建對象并且建立關系(操作對象)
知識點:1.繼承
2.面向對象程序設計案例(猜拳)
一些內存圖示 第十課時 上節回顧: 1.繼承本質就是從一個prototype對象中把它的功能都copy到另一個prototype對象
繼承為什么要循環
2.call apply方法的使用func.call(obj):調用func的時候,以obj這個對象的作用域去調用
改變函數在調用的時候里面閉包的作用域
call(obj,arg1,arg2,arg3);call第一個參數傳對象,可以是null。參數以逗號分開進行傳值,參數可以是任何類型。
apply(obj,[arg1,arg2,arg3]);apply第一個參數傳對象,參數可以是數組或者arguments 對象
第一:遇到問題
第二:查資料或者學習 -> 解決問題
第三:記住有這個功能
第四:查資料(百度)
常用API1.String
2.Array
3.Math Math.random();
4.Date
//在這個最大的對象的原型上加一個extends方法 使得下面所有的原型 都有這個方法 //這個原型的作用是通過迭代 復制傳進來的構造器的所有的原型的方法 Object.prototype.extends = function(parent){ //console.log(parent.prototype); for(var prop in parent.prototype){ //console.log(prop);//eat extends this.prototype[prop] = parent.prototype[prop];//復制傳進來的構造器的所有的原型的方法給當前正在調用這個方法的對象 } } function Person(name){ this.name = name; } Person.prototype = { eat:function(){ alert(this.name+"在吃飯"); } }; function Father(name){ this.name = name; } Father.extends(Person);//extends方法是最大的對象Object加的方法 所有的子孫 構造器都有這個方法 var f = new Father("小頭爸爸"); f.eat();一些圖示 第十一課時 上節回顧:
1.String
2.Math Math.random()
知識點:1.Date 日期類
2.Array
3.Regex
a.[]一個字符的范圍
b.有順序要求的
c.w==[a-zA-Z0-9_] d==[0-9]
d.{count}設置匹配數量比如w{5}
e.//的正則表達式匹配局部,/^$/的正則表達式是匹配全部
f.()的作用就是為了分組匹配
簡單的封裝對象String.prototype.isEmail = function(){ email = this; if (email.indexOf("@")!=-1&&email.indexOf(".")!=-1) { if(email.indexOf("@") //===============================日歷練習(方法簡潔 高效)====================================== //var year = parseInt(prompt("請輸入日歷年份:")); //var month = parseInt(prompt("請輸入日歷月份:"))-1; Date.prototype.printCalendar = function(){ var year = this.getFullYear(),month = this.getMonth(); var date = new Date(year,month,1); //alert(date.toLocaleString()); document.write("第十二課時 上節回顧:"+year+"年"+(month+1)+"月"); document.write("日 一 二 三 四 五 六
"); var day = date.getDay(); for(var i=0;i"); } } } new Date(2012,2).printCalendar(); 1.Date 期類
2.Array
3.Regex
a.[]一個字符的范圍
b.有順序要求的
c.w==[a-zA-Z0-9_] d==[0-9]
d.{count}設置匹配數量比如w{5},{c1,c2}
e.//的正則表達式匹配局部,/^$/的正則表達式是匹配全部
f.()的作用就是為了分組匹配
新知識點:
1.Regex
g.+代表的是1-N個,*代表的是0-N個
h.?代表該字符要不沒有要不就有一個
i..代表的是任意字符
轉義符
2.BOM
第十三課時 上節回顧:
1.Regex
a.[]一個字符的范圍
b.有順序要求的
c.w==[a-zA-Z0-9_] d==[0-9]
d.{count}設置匹配數量比如w{5},{c1,c2}
e.//的正則表達式匹配局部,/^$/的正則表達式是匹配全部
f.()的作用就是為了分組匹配
g.+代表的是1-N個,*代表的是0-N個
h.?代表該字符要不沒有要不就有一個
i..代表的是任意字符
j.轉義符
新知識:window 是Window構造器造出來的一個對象 alert(window instanceof Window)
document 是Document構造器造出來的一個對象
任何對象在我們的內存中他都是由某個構造器創建出來的 也就是說 有構造器一定有對應的原型prototype
例如:div是由HTMLDivElement 這個構造器創建的一個實例 div = new HTMLDivElement() span = new HTMLSpanElement()
查看某個對象對應的構造器:console.log();
整個瀏覽器的實現就是一個面向對象的編程思想 一切皆是對象
1.BOM 瀏覽器對象模型
a.screen 指的不是瀏覽器的寬度,指的是整個電腦屏幕的分辨率
可以拿到屏幕可用分辨率
b.navigator
可以通過userAgent判斷當前瀏覽器信息
c.location
URL:統一資源定位符 Union Resource Location
可以通過href屬性重定向(改變)頁面的URL,進行頁面跳轉
d.history
go方法能夠讓我們進行歷史回退或者前進
e.frames
獲得當前窗體的子頁面(iframe)
f.document
DOM模型的核心對象
2.DOM 文檔對象模型
document
功能
getElementById $("#aaa")
getElementByTagName $("div")
getElementsByClassName $(".aaa")
getElementsByName 只用在表單元素中
document object
屬性:
className,style
id
name,value(表單元素)
href,src...(對應的元素)
innerHTML
children
parentNode
功能方法:
setAttribute/getAttribute
appendChild
第十四課時 上節回顧:
1.BOM 瀏覽器對象模型
a.screen 指的不是瀏覽器的寬度,指的是整個電腦屏幕的分辨率
可以拿到屏幕可用分辨率
b.navigator
可以通過userAgent判斷當前瀏覽器信息
c.location
URL:統一資源定位符 Union Resource Location
可以通過href屬性重定向(改變)頁面的URL,進行頁面跳轉
d.history
go方法能夠讓我們進行歷史回退或者前進
e.frames
獲得當前窗體的子頁面(`iframe`)
f.document
DOM模型的核心對象
所有的DOM對象都是在堆內存創建的 都是有一個構造器生成的
查看對象的構造器器方法:
step1:查看標簽的對象以及構造器var body = document.body;console.log(body.toString())
step2:查看對象是否是這個構造器創建出來的 console.log(body instanceof HTMLBodyElement)
新知識點: 1.DOM 文檔對象模型document
功能
getElementById:通過傳入的ID,返回標識了這個ID的唯一對象的內存地址
getElementsByTagName:通過傳入的標簽名字,返回所有該標簽對象(HTMLCollection)
getElementsByClassName:通過類的名字,返回所有該類的元素對象(HTMLCollection)
createElement:想要創建出來的元素能夠繪制在頁面中,那么它必須在DOM樹中
總結 document對象是DOM原型的核心對象,它是內存DOM樹的根,所以它提供了很多功能讓我們快速的找到DOM樹中的某些DOM節點(對象)
element
功能方法:(自定義屬性非常靈活好用)
setAttribute/getAttribute //getAttribute獲取標簽的屬性 --用來操作標簽的屬性
setAttribute設置標簽的屬性
appendChild:添加子元素
屬性:
id
className,style
name,value(只有表單元素有 其他是沒有的)
href,src...(對應的元素)
innerHTML/innerText innerText返回文本信息
children://子元素集合
parentNode//父元素
總結:元素的功能屬性直接可以通過元素對象點出來,除此意外的自定義屬性,請通過get/setAtribute去操作
DOM 操作:圖片切換的相冊效果
tab切換效果
表單驗證
特效就是DOM操作的具體應用 DOM操作就是用js來寫HTML代碼
節點/元素/標簽:
三種常用的節點類型:
元素節點
屬性節點
文本節點
操作DOM對象:修改:--找到這個節點
刪除:--找到這個節點
添加:--先造出一個節點 然后插入 插入到哪里?找節點來定位
這些都離不開節點的查找
節點的查找:(最重要)
1、document.getElementById---根據id查找節點 [返回的是節點本身]
2、document.getElementsByTagName--根據標簽名字來查找[返回的是數組]document.getElementsByTagName[i]
3、document.getElemenstByName--根據name屬性來查找節點(一般用在表單中)[返回的是數組]document.getElemenstByName[i]
注意:早期瀏覽器都認為name只出現在表單中
因此document.getElemenstByName只對表單中的元素發揮作用 后來部分瀏覽器把Name屬性擴展到一般的元素 如:div 但是IE瀏覽器還是只能對表單使用byName 因此處于兼容性 我們只能對表單使用 byName
DOM中查找節點的思路:(由大到小 個別情況 由子到父)
由大到小:(通過下面的來定位)
1、document.getElementById---根據id查找節點 [返回的是節點本身]
2、document.getElementsByTagName--根據標簽名字來查找[返回的是數組]document.getElementsByTagName[i]
3、document.getElemenstByName--根據name屬性來查找節點(一般用在表單中)[返回的是數組]document.getElemenstByName[i]
如果還沒有查到自己想要的節點,還可以繼續根據上面已經找到的節點再次定位來查找
怎么繼續定位?
答:childNodes/child
繼續查找:1、查找子元素 children[index]/childNodes
2、查找父元素 node.parentNode -->獲取父元素
3、查找兄弟元素 nextSibling previousSibling
4、nextSibling previousSibling firstChild lastChild 這四個屬性容易受到空白文本的影響 建議不用
//============給Object原型加一個方法 消除文本節點對DOM操作的影響 例如:nextSibling` `previousSibling` `firstChild` `lastChild (受到換行 和文本節點影響) Object.prototype.next = function(){ //NodeType == 3 text的代號 //NodeType == 1 tag的代號 if(this.nextSibling){//判斷下一個兄弟節點是否存在 switch(this.nextSibling.nodeType){ case 1: return this.nextSibling; case 3: return this.nextSibling.nextSibling; } }else{ return null; } console.log(div1.next().next().innerText);5、對于查到的某個元素里面的子元素非常多 這時候還可利用getElementsByTagname進一步篩選
注意 對于元素對象和document對象相比 元素對象只能利用getElementsByTagName函數 其他兩個不能用
節點查找也是通過由大到小來定位:找到大的元素進一步細化 完全可以找到頁面上任意一個元素控制他
子元素 不好找 就找他的父元素
要過濾空白文本節點,用children取他的文本節點
DOM與節點的關系:
node:
childNodes[]
parentNode
firstChild
getElementsByTagName("元素標簽")
lastchild
nextSibling
previousSibling
children[index] children 不是w3c標準 但是各大瀏覽器兼容性很好
通過給原型添加方法在元素后面創建標簽
啟示:在項目中,很多很多地方都需要一個方法但是系統沒提供,這時可以通過原型擴展
//var p = document.createElement("p"); //p.innerHTML = "this is a p"; //var child = document.getElementsByTagName("div"); //給Div的HTMLDivElement構造器原型加一個創建元素的方法 要所有的元素都有這個方法 改成 Object HTMLDivElement.prototype.createElement = function(tagName){ var child = document.createElement(tagName); this.appendChild(child); return child; } var child = document.getElementsByTagName("div")[2].createElement("p"); child.innerHTML = "pppppp";
擴展閱讀
DOM編程之API總結篇
第十五課時 上節回顧: 1.DOM 文檔對象模型document
功能
getElementById:通過傳入的ID,返回標識了這個ID的唯一對象的內存地址
getElementsByTagName:通過傳入的標簽名字,返回所有該標簽對象(HTMLCollection)
getElementsByClassName:通過類的名字,返回所有該類的元素對象(HTMLCollection)
createElement:想要創建出來的元素能夠繪制在頁面中,那么它必須在DOM樹中
總結: document對象是DOM原型的核心對象,它是內存DOM樹的根,所以它提供了很多功能讓我們快速的找到DOM樹中的某些DOM節點(對象)
element
功能方法:(自定義屬性非常靈活好用)
setAttribute/getAttribute //getAttribute獲取標簽的屬性 --用來操作標簽的屬性
setAttribute設置標簽的屬性
appendChild:添加子元素
屬性:
id
className,style
name,value(只有表單元素有 其他是沒有的)
href,src...(對應的元素)
innerHTML/innerText innerText返回文本信息
children://子元素集合
parentNode//父元素
總結:元素的功能屬性直接可以通過元素對象點出來,除此意外的自定義屬性,請通過get/setAtribute去操作
新知識點: 1.事件(事故)基礎
白話含義:就是當一個事物遇到某個事情的時候,要做的事情
(事件源)
(事件監聽名稱)
(事件處理程序)
2.常用事件onclick:當事件源被點擊的時候調用處理程序
onmouseover:鼠標進入事件
onmouseout:鼠標移出事件
onmousedown:鼠標按下去的時候
onmouseup:鼠標抬起來的時候
onscroll:當事件源滾動條滾動的時候
onkeydown:當鍵盤按下的時候
onkeypress:當鍵盤按下去的時候
onkeyup:當鍵盤彈上來的時候
onfocus:當事件源獲得光標
onblur:當事件源失去光標
onchange:當事件源blur的時候內容改變了的話
瀏覽器事件注意事項:1.以后我們不要把事件寫在標簽上,而使用js方式操作
2.js方式操作的話:
非IE瀏覽器第一個對象就會傳入event事件源對象
IE瀏覽器第一個對象就不會傳入event事件源對象(event = event||window.event;)
非IE瀏覽器的事件源屬性是target屬性(event.target = event.target||event.srcElement;)
IE瀏6覽器的事件源屬性是srcElement屬性
3.事件冒泡機制
4.案例
JS視頻Javascript第一季初級視頻教程【李炎恢老師】
JavaScript視頻教程 | 智能社
附錄一份大神總結的關于JS的導圖
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/87934.html
摘要:游戲開發實戰主要講解使用來開發和設計各類常見游戲的思路和技巧,在介紹相關特性的同時,還通過游戲開發實例深入剖析了其內在原理,讓讀者不僅知其然,而且知其所以然。HTML5 Canvas游戲開發實戰主要講解使用HTML5 Canvas來開發和設計各類常見游戲的思路和技巧,在介紹HTML5 Canvas相關特性的同時,還通過游戲開發實例深入剖析了其內在原理,讓讀者不僅知其然,而且知其所以然。在本書...
摘要:作者譚峰張文升出版日期年月頁數頁定價元本書特色中國開源軟件推進聯盟分會特聘專家撰寫,國內多位開源數據庫專家鼎力推薦。張文升中國開源軟件推進聯盟分會核心成員之一。 很高興《PostgreSQL實戰》一書終于出版,本書大體上系統總結了筆者 PostgreSQL DBA 職業生涯的經驗總結,本書的另一位作者張文升擁有豐富的PostgreSQL運維經驗,目前就職于探探科技任首席PostgreS...
閱讀 2954·2021-11-17 09:33
閱讀 3118·2021-11-16 11:52
閱讀 482·2021-09-26 09:55
閱讀 2975·2019-08-30 15:52
閱讀 1313·2019-08-30 15:44
閱讀 1257·2019-08-30 13:59
閱讀 796·2019-08-30 13:08
閱讀 1157·2019-08-30 10:50