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