<output id="qn6qe"></output>

    1. <output id="qn6qe"><tt id="qn6qe"></tt></output>
    2. <strike id="qn6qe"></strike>

      亚洲 日本 欧洲 欧美 视频,日韩中文字幕有码av,一本一道av中文字幕无码,国产线播放免费人成视频播放,人妻少妇偷人无码视频,日夜啪啪一区二区三区,国产尤物精品自在拍视频首页,久热这里只有精品12
      代碼改變世界

      深入理解JavaScript系列(23):JavaScript與DOM(上)——也適用于新手

      2012-02-16 08:56  湯姆大叔  閱讀(35697)  評論(29)    收藏  舉報

      文檔對象模型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.  屬性在對象下面以變量的形式存放,在頁面上創建的所有全局對象都會變成window對象的屬性。
      2. 方法在對象下面以函數的形式存放,因為左右的函數都存放在window對象下面,所以他們也可以稱為方法。

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

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

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

      如果你正在使用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元素里的注釋行// <![CDATA[ 是用來告訴支持XHTML的瀏覽器,這里面的代碼是字符數據而不是XHTML標簽,比如如果你在里面的數據使用了<或>,瀏覽器就不會再解析成XHTML標簽了。

      Defer屬性

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

      連接外部腳本

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

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

      JavaScript必備

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

      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) {
      // 執行代碼
      }

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

      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循環

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

      var envatoTutSites = ['NETTUTS', 'PSDTUTS', 'AUDIOTUTS', 'AETUTS', 'VECTORTUTS'];

      // WHILE循環
      var counter = 0;
      var lengthOfArray = envatoTutSites.length;
      while (counter < lengthOfArray) {
      alert(envatoTutSites[counter]);
      counter++; // 等價于counter += 1;
      }

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

      DOM正文

      訪問DOM節點

      我們來個例子,一個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節點,這個DOM節點展示的是該信息段落

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

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

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

      getElementsByTagName

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

      // 訪問無序列表: [0]索引
      var unorderedList = document.getElementsByTagName('ul')[0];

      // 獲取所有的li集合:
      var allListItems = unorderedList.getElementsByTagName('li');

      // 循環遍歷
      for (var i = 0, length = allListItems.length; i < length; i++) {
      // 彈出該節點的text內容
      alert(allListItems[i].firstChild.data);
      }

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

      DOM穿梭

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

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

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

      通過這張圖,理解起來就簡單多了,但有個非常重要的知識點:那就是元素之間不能有空格,如果ul和li之間有空格的話,就會被認為是內容為空的text node節點,這樣ul.childNodes[0]就不是第一個li元素了。相應地,<p>的下一個節點也不是<ul>,因為<p>和<ul>之間有一個空行的節點,一般遇到這種情況需要遍歷所有的子節點然后判斷nodeType類型,1是元素,2是屬性,3是text節點,詳細的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

      總結

      原生的DOM方法和屬性足夠我們日常的應用了,本章節我們只列舉了一些例子,下一章節我們列舉更多的例子,還會包括瀏覽器事件模型。

      同步與推薦

      本文已同步至目錄索引:深入理解JavaScript系列

      深入理解JavaScript系列文章,包括了原創,翻譯,轉載等各類型的文章,如果對你有用,請推薦支持一把,給大叔寫作的動力。

      主站蜘蛛池模板: 国产精品妇女一区二区三区| 好看的国产精品自拍视频| 亚洲日本欧美日韩中文字幕| 亚洲天堂亚洲天堂亚洲色图| 日韩少妇人妻vs中文字幕| 亚洲av无码精品蜜桃| 婷婷丁香五月深爱憿情网| 中文字幕一区二区三区精彩视频| 日韩人妻精品中文字幕专区 | 亚洲av成人网在线观看| 亚洲人成电影在线天堂色| 欲色欲色天天天www| 精品久久欧美熟妇www| 欧洲精品亚洲精品日韩专区 | 99riav精品免费视频观看| 亚洲国产成人片在线观看无码| 亚洲特黄色片一区二区三区| aaa少妇高潮大片免费看| 亚洲欧美自偷自拍视频图片| 国产一级区二级区三级区| free性开放小少妇| 日本久久香蕉一本一道| 广河县| 一区二区三区四区五区色| 不卡乱辈伦在线看中文字幕| 人妻精品久久无码专区精东影业 | 国产稚嫩高中生呻吟激情在线视频| 久热这里只精品视频99| 日韩av日韩av在线| 中文字幕日韩有码第一页| 欧美成人片在线观看| 日韩高清不卡一区二区三区| 无码专区 人妻系列 在线| 中文字幕人妻无码一夲道| 中文字日产幕码三区国产| 国产成人啪精品午夜网站| 国产精品中文字幕免费| 国产精品视频一区二区噜| 久久青青草原精品国产app| 国产亚洲无线码一区二区| 瑞金市|