摘要:當(dāng)以非構(gòu)造函數(shù)形式被調(diào)用時,等同于。并且,函數(shù)執(zhí)行完畢后,其活動對象不會被銷毀,因為匿名函數(shù)的作用域鏈仍然在引用這個活動對象。知道閉包被銷毀,創(chuàng)建函數(shù)的活動對象才會被回收。
本著盡可能多的完善基礎(chǔ)知識,打好基礎(chǔ),做一條有夢想的咸魚。1.數(shù)據(jù)類型
基本數(shù)據(jù)類型:Undefined,Null,Boolean,Number,String,一種復(fù)雜數(shù)據(jù)類型Object2.typeof操作符檢測變量的數(shù)據(jù)類型:
undefined // 如果值未定義或者不存在 boolean // boolean string // string number // number object // 對象或者null,null被認(rèn)為是一個空對象的引用 function // 函數(shù),函數(shù)也是對象,但其存在特殊性,故此定義為function類型3.NaN
typeof NaN //number // ecmascript 定義了isNaN()函數(shù)來檢測是否為數(shù)值4.相等操作符遵循的基本規(guī)則
1.**如果有一個數(shù)是布爾值,則比較之前將其轉(zhuǎn)換為數(shù)值: false => 0 true=> 1,再與其他數(shù)進(jìn)行比較** 2.字符串與數(shù)值。字符串轉(zhuǎn)化為數(shù)值 3.對象執(zhí)行valueOf 4.null == undefined //true 5.比較相等性之前,不能將null、undefined轉(zhuǎn)換成其他的任何值 NaN不等于任何值 對象必須是同一個對象的引用
5.JavaScript沒有塊級作用域
在if、for語句中定義的變量(var)可以在{}外面訪問到,即使if未執(zhí)行。也會被定義(聲明提升)6.檢測數(shù)組
Object.prototype.toString.call(arr) //"[object Array]" Object原生toString()方法,會返回一個[object NativeConstructorName]格式的字符串 value instanceof Array //如果來自不同全局執(zhí)行環(huán)境將無法真確解析 Array.isArray(arr) //IE9+ sort()//傳遞一個比較函數(shù)作為參數(shù),默認(rèn)字符串排序,比較函數(shù)傳遞兩個參數(shù),用來設(shè)定比較規(guī)則,(默認(rèn)第一個參數(shù)代表小值,第二個參數(shù)代表大值)compare(min, max) min-max 返回正數(shù)表示降序排列。返回負(fù)數(shù)表示升序排列,0表示兩數(shù)相等 兼容性有限制的方法:isArray,indexOf,lastIndexOf,every,some,filter,forEach,map,reduce,reduceRight IE9+、Firefox 3+、Safari 4+、Open 10.5+、Chrome7.正則表達(dá)式
1.定義方式:
// 對象字面量 var expreession = / pattern / flags; //pattern可以是任何形式的正則表達(dá)式,flags標(biāo)簽,表示匹配遵循的模式。g=>全局多次匹配; i=> 忽略大小寫; m=>多行匹配 // 構(gòu)造函數(shù) var expression = new RegExp(string, flags) //es3中正則表達(dá)式始終共享一個RegExp實例,構(gòu)造函數(shù)則會創(chuàng)建新的實例,es5做出了修正,使每次都會創(chuàng)建行實例,IE9+、Firefox、Chrome都據(jù)此做出了修改。
2.實例方法
// exec()接受字符串作為參數(shù),返回包含第一個匹配項信息的數(shù)組,或者null(無匹配) // 數(shù)組包含額外兩個屬性: index/input // test()接受字符串作
3.詳細(xì)
字符^ 匹配一個字符串開始。與[合用,[^]表示選擇[]之外的某一個元素。
字符$ 匹配一個字符串結(jié)尾
? 匹配0或1次 + 匹配1或者多次 * 匹配0或者多次
{n, m} 匹配n~m次
+? 非貪婪式匹配。匹配一個滿足條件的字符就結(jié)束
+? 重復(fù)1次或更多次,但盡可能少重復(fù)
*? 重復(fù)任意次,但盡可能少重復(fù)
?? 重復(fù)0次或1次,但盡可能少重復(fù)
//非貪婪匹配模式 //?? 匹配一次或者0次但是盡可能少的次數(shù) var test1 = "acdcsfsdc".match(/(a.??c)/i); console.log(test1); // ["ac", "ac", index: 0, input: "acdcsfsdc"] //匹配一次或者多次,盡可能少重復(fù) var test2 = "acdcsfsdc".match(/(a.+?c)/i); console.log(test2); // ["acdc", "acdc", index: 0, input: "acdcsfsdc"] //匹配任意次,盡可能少 var test3 = "acdcsfsdc".match(/(a.*?c)/i); console.log(test3); // ["ac", "ac", index: 0, input: "acdcsfsdc"]
預(yù)定義字符集
// 水平制表符 // 空格 v // 垂直制表符 f // 換頁符 // 回車 // 換行符 cA: cZ // 控制符 u000-uFFFF // 十六進(jìn)制Unicode編碼 x00: xFF // 十六進(jìn)制ASCII編碼 . // 匹配任意字符。 除外 d // 匹配任意數(shù)字 D // 匹配任意非數(shù)字 w // [a-zA-Z0-9_] W // [^a-zA-Z0-9_] s // 匹配空白符 S // 匹配非空白符 // 匹配單詞邊界 B // 匹配非單詞邊界
反向引用number 數(shù)字代表捕獲組序號
/<(w+)>(.+)1>/ // 可以匹配類似balala
正則表達(dá)式的捕獲
利用String對象的match()方法,使用局部正則表達(dá)式會返回一個包含匹配信息的數(shù)組,此時該方法與正則表達(dá)式的exec()結(jié)果一致,但是使用全局匹配的時候,則返回的是全局匹配的匹配結(jié)果。
var html = "hello world!"; var results = html.match(/<(/?)(w+)([^>]*?)>/); var all = html.match(/<(/?)(w+)([^>]*?)>/g); var exec = /<(/?)(w+)([^>]*?)>/g.exec(html); console.log(results); // ["", "", "div", " class="test"", index: 0, input: "hello world!"] //["匹配正則表達(dá)式的字符串", "捕獲組"+, index: number, input:str] console.log(all); // ["", "", "", "", "", ""] console.log(exec); // ["", "", "div", " class="test"", index: 0, input: "hello world!"]捕獲組的引用,利用replace()替換
"fontFamily".replace(/([A-Z])/g, -$1).toLowerCase() // font-family非捕獲性捕獲組
(?: )replace利用函數(shù)進(jìn)行替換
當(dāng)替換值是一個函數(shù)的時候。每個匹配都會調(diào)用該函數(shù)并帶有一串參數(shù)列表
匹配的完整文本 匹配的捕獲,一個捕獲對應(yīng)一個參數(shù) 匹配索引 源字符串function upper(all, letter) { return letter.toUpperCase(); } var elem = "border-bottom-width".replace(/-(w)/g, upper); console.log(elem); // borderBottomWidth// foo=1&foo=2&blah=a&blah=b&foo=3轉(zhuǎn)換成foo=1,2,3&blah=a,b function compress(source) { var keys = {}; source.replace(/([^=&]+)=([^=&]*)/g, function (full, match1, match2) { keys[match1] = (keys[match1] ? keys[match1] + "," : "") + match2; return ""; }); var result = []; for (var key in keys) { result.push(key + "=" + keys[key]); } return result.join("&"); } compress("foo=1&foo=2&blah=a&blah=bc&foo=3"); // foo=1,2,3&blah=a,bc// 利用正則表達(dá)式修剪字符串---為了兼容低版本瀏覽器如IE8不支持.trim() // 方案1,適用短字符串 function trim(str) { return (str || "").replace(/^s+|s+$)/g, ""); } // 方案2, 適用長字符串 function trim(str) { var str = str.replace(/^ss*/, ""), ws = /s/, i = str.length; while (ws.test(str.charAt(--i))); return str.slice(0, i+1); }8.Function類型函數(shù)本質(zhì)上是對象,所以函數(shù)名實際上也是一個指向函數(shù)對象的指針,不會與某個函數(shù)綁定,因此,一個函數(shù)可以有多個名字(指針)。
1.聲明方式:
function fn(arg1, arg2) { // TODO 字面量聲明方式會使函數(shù)聲明提升,即即使聲明在后面,也可以在前面訪問到該函數(shù)。 } var fn = function (arg1, arg2) { // TODO 函數(shù)表達(dá)式聲明,必須聲明后才可以訪問 } what(); // 函數(shù)聲明 var what = function () { console.log("函數(shù)表達(dá)式"); } what(); // 函數(shù)表達(dá)式 function what() { console.log("函數(shù)聲明"); } console.log("3") what(); // 函數(shù)表達(dá)式2.內(nèi)部屬性
(1)arguments // 包含callee屬性,指向arguments所有者function factorial(num) { if (num<=1) { return 1; } else { return num * arguments.callee(num - 1) } }(2)this // 引用函數(shù)據(jù)以執(zhí)行的環(huán)境對象
(3)caller // 調(diào)用當(dāng)前函數(shù)的函數(shù)的引用,如果在全局調(diào)用,caller值為null; 嚴(yán)格模式不支持function outer () { inner(); } function inner () { alert(arguments.callee.caller); } outer(); // 顯示outer函數(shù)的源代碼3.prototype屬性 保存引用類型的實例方法。不可枚舉。
4.call(),apply()
這兩個方法屬于函數(shù)非繼承方法,接受2+參數(shù),第一個參數(shù)為函數(shù)將要運行的作用域,函數(shù)將在這個參數(shù)代表的作用域下運行,剩下的(apply只接受兩個參數(shù),第二個參數(shù)為參數(shù)數(shù)組或者arguments對象)參數(shù)為函數(shù)的參數(shù)。window.color = "red"; var o = {color: "blue"}; function sayColor () { alert(this.color); } sayColor(); // red sayColor.call(this); // red sayColor.call(window); // red sayColor.call(o); // blue5.bind()方法,會創(chuàng)建一個函數(shù)實例,this會被綁定到傳給bind()函數(shù)的值。即使在全局調(diào)用這個函數(shù)實例,this也會指向參數(shù)所給出的作用域。
toString(),toLocalString(), valueOf()均會返回函數(shù)的代碼。
9.基本包裝類型Boolean,Number,String這三個基本類型都存在包裝類型,表現(xiàn)類似對象,在基本類型上調(diào)用方法時,會將基本類型轉(zhuǎn)換成基本包裝類型,執(zhí)行完又銷毀。
10.global對象
----常用的字符串操作方法
replace()參數(shù)為字符串時,替換一個,參數(shù)為正則表達(dá)式時,指定g會替換所有匹配子串。encodeURI() // 針對整個uri編碼 decodeURI() // 解碼encodeUEI encodeURIComponent() // 替換所有非字母數(shù)字字符 decodeURIComponent() // 解碼encodeURIComponent11.Math對象產(chǎn)生隨機(jī)數(shù)var num = Math.floor(Math.random() * count + minNum) // 產(chǎn)生總數(shù)為count的范圍為minNum ~ minNum+count12.理解對象1.理解原型
構(gòu)造函數(shù)的原型,相當(dāng)于創(chuàng)建新的對象實例的時候從Object對象繼承過來的屬性和方法,實例對象可以保存原型對象中屬性的引用,創(chuàng)建同名屬性也和Object對象一樣,只會覆蓋原型上的相應(yīng)的屬性和方法,而不會改變他們。實例的[[prototype]]指針指向的是構(gòu)造器的原型,當(dāng)重寫原型后,實例就不再能夠訪問到新原型的方法屬性了。function Person() { this.name = "吳豆腐"; this.age = 23; } Person.prototype.job = "Web Developer"; Person.prototype.sayName = function () { console.log(this.name); } console.log(Person); // function () {this.name = "吳豆腐"; this.age = 23}; 無法訪問到j(luò)ob屬性和sayName方法。類似直接訪問Object對象。 var person = new Person(); console.log(person); // {age: 23, name: "吳豆腐", __proto__: {constructor: Person(), job: "Web Developer", sayName: function () {console.log(this.name)}}} **chrome瀏覽器會將prototype里面的屬性展現(xiàn)在__proto__屬性下**。 var person1 = new Person(); person1.name = "LChing"; person1.job = "student"; console.log(person.sayName === person1.sayName); // true指向同一個函數(shù)對象。 var keys = Object.keys(person); // 返回一個包含所有可枚舉屬性的字符串?dāng)?shù)組。 console.log(keys); // ["name", "age"]原型模式存在的問題:如果prototype中包含引用類型,那么實例中所做的修改將反映到其他實例上。故此,引用類型均使用構(gòu)造函數(shù)模式創(chuàng)建
補充說明引用類型:基本類型的值(Undefined,Null,Number,String,Boolean)的訪問是按值訪問。引用類型的值的訪問是按引用訪問,JavaScript不允許直接訪問內(nèi)存中的位置,也就是說不能直接操作對象的內(nèi)存空間。在操作對象時,實際上是操作對象的指針。(更嚴(yán)密的說法是:當(dāng)復(fù)制保存著對象的某個變量時,操作的是對象的引用,但是在為對象添加屬性時,操作的是實際的對象。)鑒于此,prototype中包含的引用類型也是一個指向內(nèi)存的指針,改變它的值就會反映到其他的引用上面。2.理解繼承
function SuperType() { this.color = ["red", "blue", "green"]; } function SubType() { } SubType.prototype = new SuperType(); var instance1 = new SubType(); instance1.color.push("yellow"); console.log(instance1.color); // ["red", "blue", "green", "yellow"] var instance2 = new SubType(); console.log(instance2.color); // ["red", "blue", "green", "yellow"] var instance3 = new SuperType(); instance3.color.push("black"); console.log(instance3.color); // ["red", "blue", "green", "black"] var instance4 = new SuperType(); console.log(instance4.color); // ["red", "blue", "green"] //借用構(gòu)造函數(shù)來解決原型中引用類型的問題 //通過apply()和call()方法可以在將來創(chuàng)建的對象上執(zhí)行構(gòu)造函數(shù)SuperType function SubType1() { SuperType.call(this); } var instance5 = new SubType1(); console.log(instance5); //SubType1({color: [...], __proto__: Object})組合繼承,結(jié)合構(gòu)造函數(shù)和原型繼承的優(yōu)勢,避免引用類型污染,發(fā)揮函數(shù)復(fù)用優(yōu)勢。
function SuperType(name) { this.name = name; this.color = ["red", "blue", "yellow"]; } SuperType.prototype.sayName = function () { alert(this.name); } function SubType(name, age) { SuperType.call(this, name); this.age = age; } SubType.prototype = new SuperType(); SubType.prototype.constructor = SubType; SubType.prototype.sayAge = function () { alert(this.age); } var instance1 = new SubType("吳豆腐", 23); console.log(instance1);
組合繼承的缺點是,無論在什么情況下,我們都會調(diào)用兩次超類型構(gòu)造函數(shù)。一次在創(chuàng)建子類型原型的時候,一次是在子類型構(gòu)造函數(shù)的內(nèi)部。
因此形成了寄生組合式繼承范式:// 創(chuàng)建函數(shù)構(gòu)造器 // 第一次讀這個的時候,是剛剛?cè)腴T的時候,當(dāng)時感覺玄而又玄,但是現(xiàn)在卻能有一個較深刻的體會 // 此方式不過是常見的優(yōu)化方式,創(chuàng)造者看到原型中存在一些不必要的屬性,就自己封裝一個函數(shù)去剔除這些屬性。 // 改寫subType的原型。 // 當(dāng)以非構(gòu)造函數(shù)形式被調(diào)用時,Object 等同于 new Object()。 function inHeritPrototype(subType, superType) { var prototype = Object(superType.prototype); prototype.constructor = subType; subType.prototype = prototype; } function SuperType(name) { this.name = name; this.colors = ["red", "blue", "green"]; } SuperType.prototype.sayName = function () { alert(this.name); } function SubType(name, age) { // 在創(chuàng)建子類實例屬性的時候,調(diào)用超類型構(gòu)造函數(shù)。此時超類型的作用域指向新的實例屬性。而子類型的原型指針依然指向的是子類構(gòu)造器,不會繼承超類型的原型。 SuperType.call(this, name); this.age = age; } // 下面這個函數(shù)的調(diào)用重寫了子類型的原型,使其繼承了超類型的原型,創(chuàng)建子類型的實例時,實例的原型指針指向這里。 inHeritPrototype(SubType, SuperType); var instance = new SubType("LChing", 23); console.log(instance);13.函數(shù)表達(dá)式內(nèi)聯(lián)命名函數(shù)
內(nèi)聯(lián)命名函數(shù)
閉包
閉包是指那些能夠訪問獨立(自由)變量的函數(shù) (變量在本地(全局)使用,但定義在一個封閉的作用域中)。換句話說,這些函數(shù)可以“記憶”它被創(chuàng)建時候的環(huán)境。
閉包類似于作用域鏈的效果,但區(qū)別在于,閉包包含的是創(chuàng)建環(huán)境下面的所有變量,并且是變量的最后一個值。其原因在于在閉包被調(diào)用時,原函數(shù)的作用域鏈已經(jīng)不存在了,所有變量都已經(jīng)走完流程,保存了其最后存在的值。function fn1() { var result = new Array(); for (var i = 0; i < 10; i++) { result[i] = function () { return i ; }; } return result; } var arr = fn1(); console.log(arr[1]()); // 10在匿名函數(shù)從fn1()中返回后,它的作用域鏈被初始化為包含fn1()函數(shù)的活動對象和全局變量對象。這樣,匿名函數(shù)就可以訪問在fn1()中定義的所有變量。并且,函數(shù)fn1()執(zhí)行完畢后,其活動對象不會被銷毀,因為匿名函數(shù)的作用域鏈仍然在引用這個活動對象。換句話說,當(dāng)函數(shù)fn1()執(zhí)行完畢后,其執(zhí)行環(huán)境的作用域鏈會被銷毀,但它的活動對象任然在內(nèi)存中,匿名函數(shù)在執(zhí)行時就會訪問這個活動對象,故此此時訪問到的是一個靜態(tài)的活動對象,所有變量值將是它最終存在在活動對象中的值。 知道閉包被銷毀,創(chuàng)建函數(shù)的活動對象才會被回收。
this
this對像是在運行時基于函數(shù)的執(zhí)行環(huán)境綁定的。
全局上下文:this指向全局對象;
函數(shù)上下文:直接調(diào)用,非嚴(yán)格模式下,指向全局,嚴(yán)格模式下,在未指定請況下,為undefinedfunction f2(){ "use strict"; // 這里是嚴(yán)格模式 return this; } f2() === undefined; // true對象方法中的this:
var o = { prop: 37, f: function() { return this.prop; } };當(dāng) o.f() 被調(diào)用時,函數(shù)內(nèi)的this將綁定到o對象。this的指向取決于函數(shù)被調(diào)用的方式和調(diào)用者。
原型鏈中的this
相同的概念在定義在原型鏈中的方法也是一致的。如果該方法存在于一個對象的原型鏈上,那么this指向的是調(diào)用這個方法的對象,表現(xiàn)得好像是這個方法就存在于這個對象上一樣。var o = { f : function(){ return this.a + this.b; } }; var p = Object.create(o); p.a = 1; p.b = 4; console.log(p.f()); // 5在這個例子中,對象p沒有屬于它自己的f屬性,它的f屬性繼承自它的原型。但是這對于最終在o中找到f屬性的查找過程來說沒有關(guān)系;查找過程首先從p.f的引用開始,所以函數(shù)中的this指向p。也就是說,因為f是作為p的方法調(diào)用的,所以它的this指向了p。這是JavaScript的原型繼承中的一個有趣的特性。
構(gòu)造函數(shù)中的 this
當(dāng)一個函數(shù)被作為一個構(gòu)造函數(shù)來使用(使用new關(guān)鍵字),它的this與即將被創(chuàng)建的新對象綁定。
構(gòu)造函數(shù)的返回問題,如果未指定return,則返回通過this設(shè)定的對象值。指定擇只返回return里面的值。
call 和 apply
使用 call 和 apply 函數(shù)的時候要注意,如果傳遞的 this 值不是一個對象,JavaScript 將會嘗試使用內(nèi)部 ToObject 操作將其轉(zhuǎn)換為對象。因此,如果傳遞的值是一個原始值比如 7 或 "foo" ,那么就會使用相關(guān)構(gòu)造函數(shù)將它轉(zhuǎn)換為對象,所以原始值 7 通過new Number(7)被轉(zhuǎn)換為對象,而字符串"foo"使用 new String("foo") 轉(zhuǎn)化為對象,例如:function bar() { console.log(Object.prototype.toString.call(this)); } bar.call(7); // [object Number]bind 方法
ECMAScript 5 引入了 Function.prototype.bind。調(diào)用f.bind(someObject)會創(chuàng)建一個與f具有相同函數(shù)體和作用域的函數(shù),但是在這個新函數(shù)中,this將永久地被綁定到了bind的第一個參數(shù),無論這個函數(shù)是如何被調(diào)用的。function f(){ return this.a; } var g = f.bind({a:"azerty"}); console.log(g()); // azerty var o = {a:37, f:f, g:g}; console.log(o.f(), o.g()); // 37, azertyDOM事件處理函數(shù)中的 this
當(dāng)函數(shù)被用作事件處理函數(shù)時,它的this指向觸發(fā)事件的元素(一些瀏覽器在使用非addEventListener的函數(shù)動態(tài)添加監(jiān)聽函數(shù)時不遵守這個約定)。// 被調(diào)用時,將關(guān)聯(lián)的元素變成藍(lán)色 function bluify(e){ console.log(this === e.currentTarget); // 總是 true // 當(dāng) currentTarget 和 target 是同一個對象是為 true console.log(this === e.target); this.style.backgroundColor = "#A5D9F3"; } // 獲取文檔中的所有元素的列表 var elements = document.getElementsByTagName("*"); // 將bluify作為元素的點擊監(jiān)聽函數(shù),當(dāng)元素被點擊時,就會變成藍(lán)色 for(var i=0 ; i內(nèi)聯(lián)事件處理函數(shù)中的 this
當(dāng)代碼被內(nèi)聯(lián)處理函數(shù)調(diào)用時,它的this指向監(jiān)聽器所在的DOM元素:模仿塊級作用域
javascript從來不會告訴你是否多次聲明了同一個變量;遇到這種情況,它會對后續(xù)的聲明視而不見,但是卻會執(zhí)行后續(xù)聲明中的變量初始化。function outputNumbers(count) { for (var i=0; i < count; i++) { console.log(i); } var i; console.log(i); } outputNumbers(5); // 0,1,2,3,4,514.BOM窗口位置
var leftPos = (typeof window.screenLeft == "number") ? window.screenLeft : window.screenX; var topPos = (typeof window.screenTop == "number") ? window.screenTop : screenY;但是各個瀏覽器對窗口位置的表現(xiàn)不一致。
移動窗口
window.moveTo(x, y) // 移動至(x,y)
window.moveBy(x, y) // 向x,y方向移動
窗口位置
各個瀏覽器對窗口大小的解析不一致,但是視口卻表現(xiàn)基本一致var pageWidth = window.innerWidth; var pageHeight = window.innerHeight; if (typeof pageWidth != "number") { if (document.compatMode == "CSS1Compat") { pageWidth = document.documentElement.clientWidth; pageHeight = document.documentElement.clientHeight; } else { pageWidth = document.body.clientWidth; pageHeight = document.body.clientHeight; } } }移動設(shè)備有差別
location對象
保存當(dāng)前文檔信息,并將它的url解析為獨立的片段。
查詢字符串參數(shù)數(shù)組:function getQueryStringArgs() { var qs = (location.search.length > 0 ? location.search.substring(1) : ""), args = {}, items = qs.length ? qs.split("&") : [], item = null, name = null, value = null, i = 0, len = items.length; for (i=0; ihistory對象
history.go(); // num, str
history.back();
history.forward();
檢測當(dāng)前頁是否為第一個頁面if(history.length == 0) { //這應(yīng)該是用戶打開窗口的第一個頁面 }15.DOM文檔的子節(jié)點
元素。
document.documentElement屬性始終指向頁面的元素。
document.body屬性指向
document.doctype屬性指向元素>(瀏覽器支持不一致)
文檔信息
document.title當(dāng)前頁面的標(biāo)題
document.URL顯示地址欄中完整的信息
document.domain 包含頁面的域名
document.referrer 包含鏈接到當(dāng)前頁面的頁面URL
這些信息都存在于請求的http頭部
域名設(shè)置有限制必須同域且只能取交集。
查找元素
document.getElementById()根據(jù)元素id獲取元素引用,返回元素的引用或者null。
document.getElementsByTagName(),返回HTMLCollection對象
document.getElementsByName(),返回HTMLCollection對象,如單選按鈕具有相同name屬性,不同id,根據(jù)name獲取單選按鈕。
element類型
1.獲取特性
getAttribute(),setAtrribute(),removeAttribute(),特性名不區(qū)分大小寫,自定義屬性加上"data-"前綴區(qū)分;一般更推薦通過屬性來設(shè)置特性,如elem.class = "my-class";
2.創(chuàng)建元素
document.createElement("tagName");
3.元素子節(jié)點elem.childNodes,IE與其他瀏覽器表現(xiàn)不一致,IE以外其他瀏覽器會將tag之間的空白作為一個節(jié)點。在節(jié)點執(zhí)行操作之前,需要檢測節(jié)點類型for (var i=0, len=elem.childNodes.length; i < len; i++) { if (elem.childNodes[i].nodeType === 1) { // 是元素節(jié)點則執(zhí)行某些操作 } }4.DocumentFragment類型,可以包含和控制節(jié)點,但不會像完整的文檔那樣占用額外的資源??梢宰鳛閭}庫使用,給文檔一次添加多個子元素
var fragment = document.createDocumentFragment(), ul = document.getElementById("my-lists"), li = null, i; for (i=0; i < 10; i++) { li = document.createElement("li"); li.appendChild(document.createTextNode("Item " + (i + 1))); fragment.appendChild(li); } ul.appendChild(fragment); console.log(fragment.childNodes); // []文檔片段繼承了Node的所有方法,如果將文檔中的節(jié)點添加到文檔片段中,就會從文檔樹中移除該節(jié)點,如果將文片段中的子節(jié)點添加到文檔樹中,文檔片段中也不會再存在相應(yīng)的子節(jié)點。
選擇符API
兼容性IE 8+、Firefox 3.5+、Safari 3.1+、Chrome、Opera 10+
1.queryseSelector()接受一個css選擇符,返回與該模式匹配的第一個元素,如果沒有則返回null。var body = document.querySelector("body"), // 取得body元素 myDiv = document.querySelector("#my-div"), // 取得id為my-div的元素 selected = document.querySelector(".selected"), // 取得類為.selected的第一個元素 img = document.querySelector("img.button"); // 取得類為"button"的第一個圖像元素通過Document類型調(diào)用querySelector()方法時,會在文檔元素的范圍內(nèi)查找匹配的元素;通過Element類型調(diào)用querySelector()方法時,只會在該元素后代元素范圍內(nèi)查找匹配的元素。
2.querySelectorAll()接受一個css選擇符,返回一個NodeList的實例。
3.元素遍歷,為了彌補ie瀏覽器對元素間的空白節(jié)點不返回文本節(jié)點,而其他瀏覽器返回的差異,新定義了一組元素選擇屬性(IE9+)
childElementCount 返回子元素(不包含文本節(jié)點和注釋)的個數(shù);
firstElementChild 指向第一個子元素
lastElementChild 指向最后一個元素
previousElementSibling: 指向前一個同輩元素
nextElementSibling: 指向后一個同輩元素HTML5(DOM)
1.getElementsByClassName();根據(jù)元素名獲取元素可以在元素或者document對象上調(diào)用該方法。只會檢索調(diào)用者后代。
2.classList屬性(Firefox 3.6+ Chrome)
包含aad(value),contains(value),remove(value),toggle(value)方法。焦點管理
document.activeElement保存當(dāng)前頁面獲得了焦點的元素,元素獲取焦點的方式有頁面加載、用戶輸入和在代碼中調(diào)用focus()。文檔剛加載完成是,document.activeElement中保存的是document.body元素的引用。在加載過程中,為null
document.hasFocus()方法確認(rèn)文檔是否獲取了焦點。通過檢測文檔是否獲取了焦點,可以確認(rèn)用戶是不是正在與頁面交互。字符集屬性
document.charset,可以通元素、響應(yīng)頭部或者直接設(shè)置charset屬性修改這個值。自定義數(shù)據(jù)屬性
data- 目的是為了給元素提供與渲染無關(guān)的信息,或者提供語義信息(firefox 6+ ,Chrome),可以通過dataset屬性訪問。插入標(biāo)記
innerHTML, outerHTML內(nèi)存與性能問題,在替換原有節(jié)點時,并沒有刪除原有節(jié)點上面的事件處理程序或者引用了其他JavaScript對象子樹,需要手動清除scrollIntoView()
通過滾動瀏覽器窗口或者某個容器元素,調(diào)用元素就會出現(xiàn)在視口中IE文檔模式
// 決定ie瀏覽器可以使用哪個版本所支持的功能Edge:始終以最新的文檔模式來渲染頁面children屬性
DOM2 和 DOM3
返回元素的元素節(jié)點,兼容性IE5+(包含注釋節(jié)點)、IE9+訪問元素樣式
style對象修改元素樣式,包含通過html的style特性指定的所有樣式信息,css設(shè)置的無法取得
element.style.cssText屬性一次可以設(shè)置多個屬性值,并覆蓋原css屬性
dom2增強(qiáng)了document.defaultView,提供getComputedStyle屬性獲取元素的css樣式,但是IE不支持
提供元素的currentStyle屬性來獲取,均為只讀屬性元素大小
1.偏移量
offsetHeight:元素垂直方向占用空間大小
offsetWidth: 元素水平方向占用空間大小
offsetLeft: 元素左邊框至包含元素左內(nèi)邊框之間的像素距離
offsetTop:元素上邊框至包含元素上邊框的像素距離
2.客戶區(qū)大小
clientWidth 和 clientHeight不包含邊框
3.滾動大小
scrollHeight:在沒有滾動條的情況下,元素內(nèi)容的高度
scrollWidth: 在沒有滾動條的情況下,元素內(nèi)容的寬度
scrollLeft: 被隱藏在內(nèi)容區(qū)域左側(cè)的像素
scrollTop: 被隱藏在內(nèi)容區(qū)域上方的像素文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/82286.html
相關(guān)文章
JavaScript 語言核心筆記(持續(xù)更新)
摘要:在同一個塊內(nèi),不允許用重復(fù)聲明變量。中為新增了塊級作用域。自帶遍歷器的對象有數(shù)組字符串類數(shù)組對象對象的對象等和結(jié)構(gòu)對象。返回一個遍歷器,使遍歷數(shù)組的鍵值對鍵名鍵值。 目錄 1.語法 2.類型、值和變量 3.表達(dá)式和運算符 4.語句 5.數(shù)組 6.對象 7.函數(shù) 8.全局屬性和方法 9.詞法作用域、作用域鏈、閉包 10.原型鏈、繼承機(jī)制 11.this的理解 12.ES5新特性 13.E...
前端練級攻略(第二部分)
摘要:是文檔的一種表示結(jié)構(gòu)。這些任務(wù)大部分都是基于它。這個實踐的重點是把你在前端練級攻略第部分中學(xué)到的一些東西和結(jié)合起來。一旦你進(jìn)入框架部分,你將更好地理解并使用它們。到目前為止,你一直在使用進(jìn)行操作。它是在前端系統(tǒng)像今天這樣復(fù)雜之前編寫的。 本文是 前端練級攻略 第二部分,第一部分請看下面: 前端練級攻略(第一部分) 在第二部分,我們將重點學(xué)習(xí) JavaScript 作為一種獨立的語言,如...
發(fā)表評論
0條評論
閱讀 1778·2023-04-25 23:43
閱讀 962·2021-11-24 09:39
閱讀 744·2021-11-22 15:25
閱讀 1744·2021-11-22 12:08
閱讀 1118·2021-11-18 10:07
閱讀 2103·2021-09-23 11:22
閱讀 3374·2021-09-22 15:23
閱讀 2608·2021-09-13 10:32