99re热这里只有精品视频,7777色鬼xxxx欧美色妇,国产成人精品一区二三区在线观看,内射爽无广熟女亚洲,精品人妻av一区二区三区

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

2018-02-24 15:25 更新

文檔對象模型Document Object Model

DOM(Document Object Model,文檔對象模型)是一個通過和JavaScript進行內容交互的API。Javascript和DOM一般經常作為一個整體,因為Javascript通常都是用來進行DOM操作和交互的。

主要內容來自:http://net.tutsplus.com/tutorials/javascript-ajax/javascript-and-the-dom-series-lesson-1/

關于DOM,有些知識需要注意:
1. window對象作為全局對象,也就是說你可以通過window來訪問全局對象。

  1. 屬性在對象下面以變量的形式存放,在頁面上創(chuàng)建的所有全局對象都會變成window對象的屬性。
  2. 方法在對象下面以函數的形式存放,因為左右的函數都存放在window對象下面,所以他們也可以稱為方法。

2. DOM為web文檔創(chuàng)建帶有層級的結果,這些層級是通過node節(jié)點組成,這里有幾種DOM node類型,最重要的是Element, Text, Document。

  1. Element節(jié)點在頁面里展示的是一個元素,所以如果你有段落元素(),你可以通過這個DOM節(jié)點來訪問。
  2. Text節(jié)點在頁面里展示的所有文本相關的元素,所以如果你的段落有文本在里面的話,你可以直接通過DOM的Text節(jié)點來訪問這個文本
  3. Document節(jié)點代表是整個文檔,它是DOM的根節(jié)點。

3. 每個引擎對DOM標準的實現有一些輕微的不同。例如,Firefox瀏覽器使用的Gecko引擎有著很好的實現(盡管沒有完全遵守W3C規(guī)范),但IE瀏覽器使用的Trident引擎的實現卻不完整而且還有bug,給開發(fā)人言帶來了很多問題。

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

Web上的JavaScript

Script元素

當你在網站頁面上使用JavaScript的時候,需要使用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>  

上述代碼,嚴格來說SCRIPT的TYPE屬性應該設置為application/javascript,但是由于IE不支持這個,所以平時我們不得不寫成text/javascript或者直接去掉type。另外你也可以看到在SCRIPT元素里的注釋行// ,瀏覽器就不會再解析成XHTML標簽了。

Defer屬性

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

連接外部腳本

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

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

JavaScript必備

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

JavaScript有幾種數據類型:Number, String, Boolean, Object, Undefined and Null。

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

Number

在JavaScript里所有的Number都是浮點型的,當聲明一個數字變量的時候,記得不要使用任何引號。

// 注:使用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! 
// +符合是字符連接符。也用于數字相加

Boolean

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

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

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

Function

函數是特殊的對象。

// 使用function操作符來聲明新函數 
function myFunctionName(arg1, arg2) {
    // 函數代碼
}

// 你也可以聲明匿名函數 
function (arg1, arg2) {
    // Function code goes here. 
}

// 運行函數很簡單,直接在函數名稱后面加上小括號就可以了
// 或者也可以帶上參數
myFunctionName(); // 無參
myFunctionName('foo', 'bar'); // 有參數

// 也可以使用自調用 

(function () {
    // 這里自調用函數
})();

Array

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

// 2種方式聲明數組

// 字面量: 
var fruit = ['apple', 'lemon', 'banana'];

// Array構造函數: 
var fruit = new Array('apple', 'lemon', 'banana');

fruit[0]; // 訪問第1個項(apple) 
fruit[1]; // 訪問第2個項(lemon) 
fruit[2]; // 訪問第3個項(banana) 

Object

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

// 2種類型定義Object對象

// 字面量(大括號)
var profile = {
    name: 'Bob',
    age: 99,
    job: 'Freelance Hitman'
};

// 使用Object構造函數
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操作符

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

// 加減乘除
var someMaths = 2 + 3 + 4 - 10 * 100 / 2;  

// 等于 
if ( 2 == (5 - 3 ) { /* 代碼 */ } // == 比較是否相等

// 不等于 
if ( 2 != (5 - 3 ) { /* 代碼 */ }   

// 嚴格等于(推薦) 
2 === 2 // 代替 2 == 2 
2 !== 3 // 代替 2 != 3 

// 賦值: 
var numberOfFruit = 9;  
numberOfFruit -= 2; // 等價于 "numberOfFruit = numberOfFruit - 2" 
numberOfFruit += 2; // 等價于 "numberOfFruit = numberOfFruit + 2" 

Loop循環(huán)

Loop循環(huán)在是遍歷數組或者對象的所有成員的時候非常方便,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++; // 等價于counter += 1; 
}

// FOR循環(huán)
// i只是用于迭代,可以任意取名 
for (var i = 0, length = envatoTutSites.length; i < length; i++) {
    alert(envatoTutSites[i]);
}  

DOM正文

訪問DOM節(jié)點

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

<!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');  
// 現在有了該DOM節(jié)點,這個DOM節(jié)點展示的是該信息段落

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

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

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

getElementsByTagName

getElementsByTagName方法返回的是一個節(jié)點集合,和數組類似也有l(wèi)ength屬性,重要的一個特性是他是live的——如果你在該元素里添加一個新的li元素,這個集合就會自動更新,介于他和數組類型,所以可以和訪問數組一樣的方法來訪問,所以從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é)點的text內容
    alert(allListItems[i].firstChild.data);
} 

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

DOM穿梭

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

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

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

以上內容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號