在线观看不卡亚洲电影_亚洲妓女99综合网_91青青青亚洲娱乐在线观看_日韩无码高清综合久久

鍍金池/ 教程/ HTML/ JavaScript 與 DOM(上)——也適用于新手
代碼復(fù)用模式(避免篇)
S.O.L.I.D 五大原則之接口隔離原則 ISP
設(shè)計(jì)模式之狀態(tài)模式
JavaScript 核心(晉級高手必讀篇)
設(shè)計(jì)模式之建造者模式
JavaScript 與 DOM(上)——也適用于新手
設(shè)計(jì)模式之中介者模式
設(shè)計(jì)模式之裝飾者模式
設(shè)計(jì)模式之模板方法
設(shè)計(jì)模式之外觀模式
強(qiáng)大的原型和原型鏈
設(shè)計(jì)模式之構(gòu)造函數(shù)模式
揭秘命名函數(shù)表達(dá)式
深入理解J avaScript 系列(結(jié)局篇)
執(zhí)行上下文(Execution Contexts)
函數(shù)(Functions)
《你真懂 JavaScript 嗎?》答案詳解
設(shè)計(jì)模式之適配器模式
設(shè)計(jì)模式之組合模式
設(shè)計(jì)模式之命令模式
S.O.L.I.D 五大原則之單一職責(zé) SRP
編寫高質(zhì)量 JavaScript 代碼的基本要點(diǎn)
求值策略
閉包(Closures)
對象創(chuàng)建模式(上篇)
This? Yes,this!
設(shè)計(jì)模式之代理模式
變量對象(Variable Object)
S.O.L.I.D 五大原則之里氏替換原則 LSP
面向?qū)ο缶幊讨话憷碚?/span>
設(shè)計(jì)模式之單例模式
Function 模式(上篇)
S.O.L.I.D 五大原則之依賴倒置原則 DIP
設(shè)計(jì)模式之迭代器模式
立即調(diào)用的函數(shù)表達(dá)式
設(shè)計(jì)模式之享元模式
設(shè)計(jì)模式之原型模式
根本沒有“JSON 對象”這回事!
JavaScript 與 DOM(下)
面向?qū)ο缶幊讨?ECMAScript 實(shí)現(xiàn)
全面解析 Module 模式
對象創(chuàng)建模式(下篇)
設(shè)計(jì)模式之職責(zé)鏈模式
S.O.L.I.D 五大原則之開閉原則 OCP
設(shè)計(jì)模式之橋接模式
設(shè)計(jì)模式之策略模式
設(shè)計(jì)模式之觀察者模式
代碼復(fù)用模式(推薦篇)
作用域鏈(Scope Chain)
Function 模式(下篇)
設(shè)計(jì)模式之工廠模式

JavaScript 與 DOM(上)——也適用于新手

文檔對象模型 Document Object Model

DOM(Document Object Model,文檔對象模型)是一個(gè)通過和 JavaScript 進(jìn)行內(nèi)容交互的 API。Javascript 和 DOM 一般經(jīng)常作為一個(gè)整體,因?yàn)?Javascript 通常都是用來進(jìn)行 DOM 操作和交互的。

http://wiki.jikexueyuan.com/project/javascript-depth-understanding/images/12.png" alt="" />

關(guān)于DOM,有些知識需要注意:

  1. window 對象作為全局對象,也就是說你可以通過 window 來訪問全局對象。

    1. 屬性在對象下面以變量的形式存放,在頁面上創(chuàng)建的所有全局對象都會變成 window 對象的屬性。

    2. 方法在對象下面以函數(shù)的形式存放,因?yàn)樽笥业暮瘮?shù)都存放在 window 對象下面,所以他們也可以稱為方法。
  2. DOM 為 web 文檔創(chuàng)建帶有層級的結(jié)果,這些層級是通過 node 節(jié)點(diǎn)組成,這里有幾種 DOM node 類型,最重要的是 Element,Text,Document。

    1. Element 節(jié)點(diǎn)在頁面里展示的是一個(gè)元素,所以如果你有段落元素(<p>),你可以通過這個(gè) DOM 節(jié)點(diǎn)來訪問。
    2. Text 節(jié)點(diǎn)在頁面里展示的所有文本相關(guān)的元素,所以如果你的段落有文本在里面的話,你可以直接通過 DOM 的 Text 節(jié)點(diǎn)來訪問這個(gè)文本
    3. Document 節(jié)點(diǎn)代表是整個(gè)文檔,它是 DOM 的根節(jié)點(diǎn)。
  3. 每個(gè)引擎對 DOM 標(biāo)準(zhǔn)的實(shí)現(xiàn)有一些輕微的不同。例如,F(xiàn)irefox 瀏覽器使用的 Gecko 引擎有著很好的實(shí)現(xiàn)(盡管沒有完全遵守 W3C 規(guī)范),但 IE 瀏覽器使用的 Trident 引擎的實(shí)現(xiàn)卻不完整而且還有 bug,給開發(fā)人言帶來了很多問題。

如果你正在使用 Firefox,我推薦你立即下載 Firebug 插件,對于你了解 DOM 結(jié)構(gòu)非常有用。

Web 上的 JavaScript

Script 元素

當(dāng)你在網(wǎng)站頁面上使用 JavaScript 的時(shí)候,需要使用 <script> 元素:

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">  
    <html xmlns="http://www.w3.org/1999/xhtml" lang="en">  
        <head>  
                <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />  
                <title>JavaScript!</title>  
        </head>  
        <body>        
            <script type="text/javascript">  
            // <![CDATA[     
            // ]]>  
            </script>        
        </body>  
    </html>  

上述代碼,嚴(yán)格來說 SCRIPT 的 TYPE 屬性應(yīng)該設(shè)置為 application/javascript,但是由于 IE 不支持這個(gè),所以平時(shí)我們不得不寫成 text/javascript 或者直接去掉 type。另外你也可以看到在 SCRIPT 元素里的注釋行// <![CDATA[ 是用來告訴支持 XHTML 的瀏覽器,這里面的代碼是字符數(shù)據(jù)而不是 XHTML 標(biāo)簽,比如如果你在里面的數(shù)據(jù)使用了 < 或 >,瀏覽器就不會再解析成 XHTML 標(biāo)簽了。

Defer屬性

任何在 SCRIPT 元素里聲明的代碼在頁面加載的時(shí)候都會運(yùn)行,唯一一個(gè)例外是給 SCRIPT 元素加上一個(gè) defer 屬性。defer 屬性告訴瀏覽器加載完HTML文檔以后再執(zhí)行 JS 代碼,但這個(gè)屬性只能在 IE 下使用。

連接外部腳本

如果你想了解外部腳本,只需要簡單地在 SCRIPT 上使用 SRC 屬性就行了,使用單獨(dú)的 JS 文件的好處是可以緩存,而且也不需要擔(dān)心 CDATA 方面的問題:

<script type="text/javascript" src="my-script.js"></script>

JavaScript 必備

在我們繼續(xù) DOM 之前,我們來復(fù)習(xí)一下 JavaScript 的核心必備知識,如果你還不了解,也沒關(guān)系,我們在這一章節(jié)將稍微花點(diǎn)時(shí)間來回顧一下。

JavaScript 有幾種數(shù)據(jù)類型:Number,String,Boolean,Object,Undefined and Null。

單行注釋使用雙斜杠//,雙斜杠后面的所有文字都會被注釋掉,多行注意使用/**/括住。

Number

在 JavaScript 里所有的 Number 都是浮點(diǎn)型的,當(dāng)聲明一個(gè)數(shù)字變量的時(shí)候,記得不要使用任何引號。

// 注:使用var類聲明變量
var leftSide = 100;  
var topSide = 50;  
var areaOfRectangle = leftSide * topSide; // = 5000  
String

JavaScript 里聲明字符串特別簡單,和其它語言一樣,在 JS 里使用單引號或雙引號都可以。

var firstPart = 'Hello';  
var secondPart = 'World!';  
var allOfIt = firstPart + ' ' + secondPart; // Hello World!  
// +符合是字符連接符。也用于數(shù)字相加

Boolean

布爾類型用于條件判斷,布爾類型是只有 2 個(gè)值:true 和 false。任何使用邏輯操作符的比較都會返回布爾值。

5 === (3 + 2); // = true  
// 你也可以將布爾值賦給一個(gè)變量
var veryTired = true;
// 這樣使用
if (veryTired) {
    // 執(zhí)行代碼 
}   

===也是比較操作符,不僅比較數(shù)值,還比較類型。

Function

函數(shù)是特殊的對象。

// 使用function操作符來聲明新函數(shù)  
function myFunctionName(arg1, arg2) {
    // 函數(shù)代碼
}
// 你也可以聲明匿名函數(shù) 
function (arg1, arg2) {
    // Function code goes here.  
}
// 運(yùn)行函數(shù)很簡單,直接在函數(shù)名稱后面加上小括號就可以了
// 或者也可以帶上參數(shù)
myFunctionName(); // 無參
myFunctionName('foo', 'bar'); // 有參數(shù)
// 也可以使用自調(diào)用  
(function () {
    // 這里自調(diào)用函數(shù)
})();

Array

數(shù)組也是特殊的對象,它包含了一批值(或?qū)ο螅?,訪問這些數(shù)據(jù)的話需要使用數(shù)字索引:

// 2種方式聲明數(shù)組
// 字面量:  
var fruit = ['apple', 'lemon', 'banana'];
// Array構(gòu)造函數(shù):  
var fruit = new Array('apple', 'lemon', 'banana');
fruit[0]; // 訪問第1個(gè)項(xiàng)(apple)  
fruit[1]; // 訪問第2個(gè)項(xiàng)(lemon)  
fruit[2]; // 訪問第3個(gè)項(xiàng)(banana) 
Object

一個(gè)對象是一個(gè) key-value 的集合,和數(shù)組相似,唯一的不同是你可以為每個(gè)數(shù)據(jù)定義一個(gè)名稱。

// 2種類型定義Object對象
// 字面量(大括號)
var profile = {
    name: 'Bob',
    age: 99,
    job: 'Freelance Hitman'
};
// 使用Object構(gòu)造函數(shù)
var profile = new Object();
profile.name = 'Bob';
profile.age = 99;
profile.job = 'Freelance Hitman';  

IF/Else 語句

JS 里使用最多的語句莫過于條件語句了:

var legalDrinkingAge = 21;  
var yourAge = 29;  
if ( yourAge >= legalDrinkingAge ) {   
    alert('You can drink.');  
} else {  
    alert('Sorry, you cannot drink.');  

JavaScript 操作符

建議你訪問這個(gè)頁面來查看所有的 JS 操作符,這里我僅僅給出一些例子:

// 加減乘除
var someMaths = 2 + 3 + 4 - 10 * 100 / 2;     
// 等于  
if ( 2 == (5 - 3 ) { /* 代碼 */ } // == 比較是否相等
// 不等于 
if ( 2 != (5 - 3 ) { /* 代碼 */ }   
// 嚴(yán)格等于(推薦) 
2 === 2 // 代替 2 == 2  
2 !== 3 // 代替 2 != 3  
// 賦值:  
var numberOfFruit = 9;  
numberOfFruit -= 2; // 等價(jià)于 "numberOfFruit = numberOfFruit - 2"  
numberOfFruit += 2; // 等價(jià)于 "numberOfFruit = numberOfFruit + 2"   

Loop循環(huán)

Loop 循環(huán)在是遍歷數(shù)組或者對象的所有成員的時(shí)候非常方便,JavaScript 里使用最多的是 FOR 和 WHILE 語句。

var envatoTutSites = ['NETTUTS', 'PSDTUTS', 'AUDIOTUTS', 'AETUTS', 'VECTORTUTS'];
// WHILE循環(huán)
var counter = 0;
var lengthOfArray = envatoTutSites.length;
while (counter < lengthOfArray) {
    alert(envatoTutSites[counter]);
    counter++; // 等價(jià)于counter += 1;  
}
// FOR循環(huán)
// i只是用于迭代,可以任意取名 
for (var i = 0, length = envatoTutSites.length; i < length; i++) {
    alert(envatoTutSites[i]);
}  

DOM 正文

訪問 DOM 節(jié)點(diǎn)

我們來個(gè)例子,一個(gè) HTML 里包含一段文本和一個(gè)無序的列表。

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">  
<html xmlns="http://www.w3.org/1999/xhtml" lang="en">  
    <head>  
            <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />  
            <title>JavaScript!</title>  
    </head>  
    <body>  
        <p id="intro">My first paragraph...</p>  
        <ul>  
            <li>List item 1</li>  
            <li>List item 1</li>  
            <li>List item 1</li>  
            <li>List item 1</li>  
            <li>List item 1</li>  
        </ul>  
        <script type="text/javascript">  
        // <![CDATA[  
        // ]]>  
</script>  
    </body>  
</html> 

上面例子里,我們使用 getElementById DOM 方法來訪問 p 段落,在 SCRIPT 里添加如下代碼:

var introParagraph = document.getElementById('intro');  
// 現(xiàn)在有了該DOM節(jié)點(diǎn),這個(gè)DOM節(jié)點(diǎn)展示的是該信息段落

變量 introParagraph 現(xiàn)在已經(jīng)引用到該 DOM 節(jié)點(diǎn)上了,我們可以對該節(jié)點(diǎn)做很多事情,比如查詢內(nèi)容和屬性,或者其它任何操作,甚至可以刪除它,克隆它,或者將它移到到 DOM 樹的其它節(jié)點(diǎn)上。

文檔上的任何內(nèi)容,我們都可以使用 JavaScript 和 DOM API 來訪問,所以類似地,我們也可以訪問上面的無序列表,唯一的問題是該元素沒有 ID 屬性,如果 ID 的話就可以使用相同的方式,或者使用如下 getElementsByTagName 方式:

var allUnorderedLists = document.getElementsByTagName('ul');  
// 'getElementsByTagName'返回的是一個(gè)節(jié)點(diǎn)集合
// - 和數(shù)組有點(diǎn)相似

getElementsByTagName

getElementsByTagName 方法返回的是一個(gè)節(jié)點(diǎn)集合,和數(shù)組類似也有 length 屬性,重要的一個(gè)特性是他是 live 的——如果你在該元素里添加一個(gè)新的 li 元素,這個(gè)集合就會自動更新,介于他和數(shù)組類型,所以可以和訪問數(shù)組一樣的方法來訪問,所以從 0 開始:

// 訪問無序列表: [0]索引
var unorderedList = document.getElementsByTagName('ul')[0];
// 獲取所有的li集合:  
var allListItems = unorderedList.getElementsByTagName('li');
// 循環(huán)遍歷
for (var i = 0, length = allListItems.length; i < length; i++) {
    // 彈出該節(jié)點(diǎn)的text內(nèi)容
    alert(allListItems[i].firstChild.data);
} 

以下圖例更清晰地展示了 DOM 獲取的知識:

http://wiki.jikexueyuan.com/project/javascript-depth-understanding/images/13.png" alt="" />

DOM 穿梭

“穿梭”這個(gè)詞主要是用來描述通過 DOM 查找節(jié)點(diǎn),DOM API 提供了大量的節(jié)點(diǎn)屬性讓我們來往上或者往下查詢節(jié)點(diǎn)。

所有的節(jié)點(diǎn)都有這些屬性,都是可以用于訪問相關(guān)的 node 節(jié)點(diǎn):

  1. Node.childNodes: 訪問一個(gè)單元素下所有的直接子節(jié)點(diǎn)元素,可以是一個(gè)可循環(huán)的類數(shù)組對象。該節(jié)點(diǎn)集合可以保護(hù)不同的類型的子節(jié)點(diǎn)(比如 text 節(jié)點(diǎn)或其他元素節(jié)點(diǎn))。
  2. Node.firstChild: 與‘childNodes’數(shù)組的第一個(gè)項(xiàng)(‘Element.childNodes[0]‘)是同樣的效果,僅僅是快捷方式。
  3. Node.lastChild: 與‘childNodes’數(shù)組的最后一個(gè)項(xiàng)(‘Element.childNodes[Element.childNodes.length-1]‘)是同樣的效果,僅僅是快捷方式。shortcut。
  4. Node.parentNode: 訪問當(dāng)前節(jié)點(diǎn)的父節(jié)點(diǎn),父節(jié)點(diǎn)只能有一個(gè),祖節(jié)點(diǎn)可以用‘Node.parentNode.parentNode’的形式來訪問。
  5. Node.nextSibling: 訪問 DOM 樹上與當(dāng)前節(jié)點(diǎn)同級別的下一個(gè)節(jié)點(diǎn)。
  6. Node.previousSibling: 訪問 DOM 樹上與當(dāng)前節(jié)點(diǎn)同級別的上一個(gè)節(jié)點(diǎn)。

http://wiki.jikexueyuan.com/project/javascript-depth-understanding/images/14.png" alt="" />

通過這張圖,理解起來就簡單多了,但有個(gè)非常重要的知識點(diǎn):那就是元素之間不能有空格,如果 ul 和 li 之間有空格的話,就會被認(rèn)為是內(nèi)容為空的 text node 節(jié)點(diǎn),這樣 ul.childNodes[0]就不是第一個(gè) li 元素了。相應(yīng)地,<p>的下一個(gè)節(jié)點(diǎn)也不是<ul>,因?yàn)?lt;p>和<ul>之間有一個(gè)空行的節(jié)點(diǎn),一般遇到這種情況需要遍歷所有的子節(jié)點(diǎn)然后判斷 nodeType 類型,1 是元素,2 是屬性,3 是 text 節(jié)點(diǎn),詳細(xì)的 type 類型可以通過此地址:

    Node.ELEMENT_NODE == 1
    Node.ATTRIBUTE_NODE == 2
    Node.TEXT_NODE == 3
    Node.CDATA_SECTION_NODE == 4
    Node.ENTITY_REFERENCE_NODE == 5
    Node.ENTITY_NODE == 6
    Node.PROCESSING_INSTRUCTION_NODE == 7
    Node.COMMENT_NODE == 8
    Node.DOCUMENT_NODE == 9
    Node.DOCUMENT_TYPE_NODE == 10
    Node.DOCUMENT_FRAGMENT_NODE == 11
    Node.NOTATION_NODE == 12

總結(jié)

原生的 DOM 方法和屬性足夠我們?nèi)粘5膽?yīng)用了,本章節(jié)我們只列舉了一些例子,下一章節(jié)我們列舉更多的例子,還會包括瀏覽器事件模型。