整合營銷服務商

          電腦端+手機端+微信端=數據同步管理

          免費咨詢熱線:

          DOM 操作之屬性操作

          DOM 操作之屬性操作

          章目標


          • 掌握基本屬性的使用
          • 掌握 textContent 和 innerHTML 的區別
          • 掌握表單屬性的使用
          • 掌握自定義屬性的使用

          本章任務


          • 能夠完成美女相冊案例
          • 能夠完成登錄驗證功能
          • 能夠完成注冊頁面的同意協議單選框功能
          • 能夠完成小圖切換大圖功能

          屬性操作


          在美女畫廊的案例中,我們需要獲取到 img 元素,并修改 img 中顯示的圖片還需要獲取到頁面上的 p 元素修改 p 元素中顯示的內容,本章中我們就來學習如何修改元素的相關屬性。

          基本屬性


          基本屬性指的是 HTML 標簽本身所具有的屬性(HTML 中的標準屬性),這些屬性在瀏覽器把 HTML 文檔生成 DOM 樹的時候會自動設置為 DOM 樹上元素節點對象的屬性。


          常用的基本屬性:href、title、id、src。


          獲取或者設置基本屬性的語法和步驟:

          // 獲取 DOM 元素
          let dom=document.getElementById('id');
          // 獲取屬性
          console.log(dom.屬性名稱)
          // 設置屬性
          dom.屬性名稱='屬性值'


          • 獲取元素屬性的值
          <a id="link" href="http://www.baidu.com">百度</a>
          let link=document.getElementById('link');
          // 獲取元素的屬性
          console.log(link.id); // "link"
          console.log(link.href); // "http://www.baidu.com/"
          • 設置元素屬性的值
          let link=document.getElementById('link');
          // 設置元素的屬性
          link.title='google';
          link.href='http://www.google.com';

          你可以嘗試下點擊按鈕修改 img 標簽的圖片(修改 src 屬性)。

          更改標簽之間的內容


          在美女畫廊中我們需要更改 p 標簽之間的內容,但是如何設置標簽之間的內容?這里沒有對應 HTML 的標準屬性,但是這是一種常見的操作 DOM 對象提供了兩個屬性可以讓我們方便的修改標簽之間的內容:textContent 和 innerHTML,下面我們分別來介紹。


          • 獲取或者設置標簽之間的文本內容
          let p=document.getElementById('p');
          // 獲取標簽之間的內容
          console.log(p.textContent);
          // 設置標簽之間的內容
          p.textContent='Hello DOM';

          你可能在其他地方見過 innerText 屬性,注意這是早期 IE 中獲取或者設置標簽之間文本內容的屬性,現代瀏覽器依然支持該屬性,但是 DOM 中規定的標準屬性是 textContent

          • 獲取或者設置標簽之間的 HTML 內容
          let p=document.getElementById('p');
          // 獲取標簽之間的內容
          console.log(p.innerHTML)
          // 設置標簽之間的內容
          p.innerHTML='<b>Hello DOM</b>'
          • textContent 和 innerHTML 的區別
            • textContent 獲取的內容中包含 HTML 標簽會被忽略
            • textContent 設置的內容中包含 HTML 標簽會直接顯示
            • innerHTML 獲取的內容中包含 HTML 會返回標簽和內容
            • innerHTML 設置的內容中包含 HTML 標簽,標簽會被渲染
          • HTML 中的字符實體

          在網頁中有一些特殊的符號,比如:< >;想要顯示這些符號需要對這些內容進行轉義,也就是使用 HTML 的實體。

          字符實體的表示形式:

          &字符實體編號;
          
          <   // < 顯示小于號
          >   // > 顯示大于號

          顯示結果

          描述

          實體名稱

          實體編號


          空格

           

          <

          小于號

          <

          <

          >

          大于號

          >

          >

          &

          和號

          &

          &

          "

          引號

          "

          "

          '

          撇號

          ' (IE不支持)

          '

          分(cent)

          ¢

          ¢

          鎊(pound)

          £

          £

          元(yen)

          ¥

          ¥

          歐元(euro)

          §

          小節

          §

          §

          ?

          版權(copyright)

          ©

          ©

          ?

          注冊商標

          ®

          ®

          ?

          商標

          ×

          乘號

          ×

          ×

          ÷

          除號

          ÷

          ÷


          需要記住其中的空、>、< 的字符實體名稱


          案例:美女畫廊


          • 需求:
            • 獲取一組 a 元素
            • 獲取大圖對應的 img 元素
            • 獲取 id 為 des 的 p 元素
            • 遍歷所有的 a 元素,注冊 click 事件
              • 獲取 a 的 href 屬性并賦值給 img 的 src 屬性
              • 獲取當前點擊的 a 的 title 值賦值給 p 的 textContent
              • 取消 a 的默認行為(見下面注意的地方)
          • 代碼:
          // 1. 獲取一組a元素
          let links=document.getElementsByTagName('a');
          // 2. 獲取id為photo的img元素
          let photo=document.getElementById('photo');
          // 3. 獲取id為des的p元素
          let p=document.getElementById('des');
          // 4. 循環遍歷a,注冊 click事件
          for (let i=0; i < links.length; i++) {
            links[i].onclick=function () {
              // 4.1 獲取當前點擊的a的href值賦值給 img的src屬性
              photo.src=this.href;
              // 4.2 獲取當前點擊的a的title值賦值給p的 textContent
              p.textContent=this.title;
              // 4.3 取消a的默認跳轉行為
              return false;
            };
          }


          注意:給 a 元素注冊點擊事件的時候,如果 a 元素設置了 href 屬性,當觸發 a 的點擊事件并且事件處理函數執行完畢后,會繼續執行跳轉到 href 屬性,這是 a 標簽的默認行為。

          我們想要 a 的事件處理函數不跳轉,取消 a 標簽的默認行為可以在事件處理函數中 return false


          表單屬性


          JavaScript 最初的目的是用來驗證用戶的輸入是否合法,為了實現表單元素的驗證,我們需要獲取用戶輸入的內容,這需要使用到表單元素的屬性。

          • 常用的表單元素屬性
            • value:用于大部分表單元素的內容獲取(option除外)
            • type:可以獲取input標簽的類型(輸入框或復選框等)
            • disabled:禁用屬性
            • checked:復選框/單選框選中屬性
            • selected:下拉菜單選中屬性


          案例:登錄的驗證


          • 需求:
            • 驗證用戶協議是否同意
            • 驗證用戶名必須在 3-6 位之間,包含3和6位
            • 驗證密碼必須大于等于8位
          • 代碼:
          let btn=document.querySelector('#btn');
          btn.onclick=function () {
            let username=document.querySelector('#username').value;
            let pwd=document.querySelector('#pwd').value;
            let chk=document.querySelector('#chk');
          
            if (!chk.checked) {
              alert('請同意用戶協議');
              return false;
            }
            if (username.length < 3 || username.length > 6) {
              alert('用戶名應該在3-6位之間');
              return false;
            }
          
            if (pwd.length < 8) {
              alert('密碼必須超過8位');
              return false;
            }
          
          
            alert('我去登陸了')
            // 阻止 a 的默認行為
            return false;
          };

          案例:注冊頁面

          • 需求:
            • 同意協議的復選框選中,讓完成注冊按鈕可用
            • 同意協議的復選框不選中,讓完成注冊按鈕不可用
          • 代碼:
          // 1. 獲取復選框
          let agree=document.querySelector('#agree');
          // 2. 獲取按鈕
          let registerBtn=document.querySelector('#registerBtn');
          // 3. 給復選框注冊點擊事件
          agree.onclick=function () {
            registerBtn.disabled=!agree.checked;
          };

          案例:購物車的全選功能

          • 需求:
            • 當點擊全選的 checkbox
              • 讓所有商品前面的 checkbox 的選中狀態和全選的 checkbox 的選中狀態保持一致
            • 點擊商品前面的 checkbox
              • 如果所有商品全部都選中,全選 checkbox 選中
              • 如果有一個商品沒有選中,全選 checkbox 不選中
          • 代碼:
          // 1. 獲取thead中一個復選框
          let allck=document.querySelector('#all');
          // 2. 獲取tbody中一組復選框
          //【功能1】
          let cks=document.querySelectorAll('tbody input[type=checkbox]');
          // 3. 給thead中一個復選框注冊點擊事件
          allck.onclick=function () {
            // 3.1 獲取thead中這個復選框的checked值
            let isOk=allck.checked;
            // 3.2 循環遍歷tbody中的每一個復選框,設置checked值為thead中這個復選框的checked值
            for (let i=0; i < cks.length; i++) {
              cks[i].checked=isOk;
            }
          };
          
          //【功能2】
          // 1. 循環遍歷tbody中每一個復選框注冊點擊事件
          for (let i=0; i < cks.length; i++) {
            cks[i].onclick=function () {
             // 2. 獲取tbody中所有的復選框的個數
              let len1=cks.length; 
              //3. 獲取tbody中選中的復選框的個數
              let len2=document.querySelectorAll('tbody input:checked').length;
              // 4. 對比是否一致,若一致,則設置thead中全選框為true,否則為false
              if (len1===len2) {
                allck.checked=true;
              } else {
                allck.checked=false;
              }
            };
          }

          自定義屬性


          到這里為止我們介紹的都是標簽所擁有的屬性,也就是 HTML 中的標準屬性,標簽中還支持自定義屬性,為了到達某些業務的需求,我們可以把數據存儲到標簽的自定義屬性中。

          例如:在購物車的案例中,如果我們要刪除某個購物車中的商品的話,我們可以把這條數據的 id 存儲到當前行的自定義屬性中,例如:proId 這個屬性。


          自定義屬性有兩種用法,分別是:

          • 使用 DOM 中的標準 API 操作
            • getAttribute():獲取標簽行內屬性
            • setAttribute():設置標簽行內屬性
            • removeAttribute():移除標簽行內屬性
            • 這組 API 也可以操作 HTML 的標準屬性
          • HTML 5中新增的 data- 形式的自定義屬性
            • 可以通過 元素.dataset 來獲取或者設置 data- 后的自定義屬性名稱
            • 未來推薦使用這種方式存儲數據,具有語義


          // div
          const d5=document.querySelector('#d5');
          const d6=document.querySelector('#d6');
          // 瀏覽器中審查元素,可以看到 d5 的 div 中會有 proId 的屬性
          d5.setAttribute('proId', 5)
          console.log(d5.getAttribute('prodId'))
          
          // 瀏覽器審查元素,可以看到 data-pro-id 的屬性
          // 瀏覽器自動把大寫字母轉換成了 pro-id 的形式
          d6.dataset.proId=6
          console.log(d6.dataset.proId)

          注意:我們獲取到的自定義屬性或者標準屬性的值都是字符串類型。

          • 注意:元素.自定義屬性 的用法
          <div id="d5" prodId="5">刪除</div>
          <div id="d6">刪除</div>

          瀏覽器在處理 HTML 的時候,會把 HTML 文檔轉換為瀏覽器內存中的 DOM 樹,在轉換的過程中,標簽的 HTML 標準屬性會被轉換為 DOM 元素的屬性,但是標簽的自定義屬性不會轉換為 DOM元素的屬性。

          const d5=document.querySelector('#d5');
          console.log(d5.proId);  // 打印的結果為 undefined

          但是我們可以設置 DOM 元素的自定義屬性,注意,這里的自定義屬性并不會轉換成 HTML 標簽的自定義屬性,僅僅是對象的屬性,我們依然可以通過 DOM 對象,獲取到該屬性的值。

          const d6=document.querySelector('#d6');
          d6.proId=6
          console.log(d6.proId);  // 打印結果為 6

          案例:點擊小圖切換大圖

          <img id="small" width="80px" src="./images/small.jpg" data-big="./images/big.jpg"/>
          <img id="big" src="./images/placeholder.jpg" />
          let small=document.querySelector('#small');
          let big=document.querySelector('#big');
          
          small.onclick=function () {
            // 在事件處理函數中可以通過 this 獲取到觸發事件的元素
            // 這里的 this 就是 small 對象
            let bigImgSrc=this.dataset.big;
            big.src=bigImgSrc;
          };


          作業


          圖片切換



          猜數字游戲

          用JavaScript訪問和操作的HTML DOM對象的例子。

          Document 對象

          • 使用 document.write() 輸出文本

          • 使用 document.write() 輸出 HTML

          • 返回文檔中錨的數目

          • 返回文檔中第一個錨的 innerHTML

          • 返回文檔中表單的數目

          • 返回文檔中第一個表單的名字

          • 返回文檔中的圖像數

          • 返回文檔中第一個圖像的ID

          • 返回文檔中的鏈接數

          • 返回文檔中的第一個鏈接的ID

          • 返回文檔中的所有cookies的名稱/值對

          • 返回加載的文檔的服務器域名

          • 返回文檔的最后一次修改時間

          • 返回加載的當前文檔的URL

          • 返回文檔的標題

          • 返回文檔的完整的URL

          • 打開輸出流,向流中輸入文本

          • write() 和 writeln()的不同

          • 用指定的ID彈出一個元素的innerHTML

          • 用指定的Name彈出元素的數量

          • 用指定的tagname彈出元素的數量

          Anchor 對象

          • 返回和設置鏈接的charset屬性

          • 返回和設置鏈接的href屬性

          • 返回和設置鏈接的hreflang屬性

          • 返回一個錨的名字

          • 返回當前的文件和鏈接的文檔之間的關系

          • 改變鏈接的target屬性

          • 返回一個鏈接的type屬性的值

          Area 對象

          • 返回圖像映射某個區域的替代文字

          • 返回圖像映射某個區域的坐標

          • 返回一個區域的href屬性的錨部分

          • 返回的主機名:圖像映射的某個區域的端口

          • 返回圖像映射的某個區域的hostname

          • 返回圖像映射的某個區域的port

          • 返回圖像映射的某個區域的href

          • 返回圖像映射的某個區域的pathname

          • 返回圖像映射的某個區域的protocol

          • 返回一個區域的href屬性的querystring部分

          • 返回圖像映射的某個區域的shape

          • 返回圖像映射的某個區域的target的值

          Base 對象

          • 返回頁面上所有相對URL的基URL

          • 返回頁面上所有相對鏈接的基鏈接

          Button 對象

          • 當點擊完button不可用

          • 返回一個button的name

          • 返回一個button的type

          • 返回一個button的value

          • 返回一個button所屬表的ID

          Form 對象

          • 返回一個表單中所有元素的value

          • 返回一個表單acceptCharset屬性的值

          • 返回一個表單action屬性的值

          • 返回表單中的enctype屬性的值

          • 返回一個表單中元素的數量

          • 返回發送表單數據的方法

          • 返回一個表單的name

          • 返回一個表單target屬性的值

          • 重置表單

          • 提交表單

          Frame/IFrame 對象

          • 對iframe排版

          • 改變一個包含在iframe中的文檔的背景顏色

          • 返回一個iframe中的frameborder屬性的值

          • 刪除iframe的frameborder

          • 改變iframe的高度和寬度

          • 返回一個iframe中的longdesc屬性的值

          • 返回一個iframe中的marginheight屬性的值

          • 返回一個iframe中的marginwidth屬性的值

          • 返回一個iframe中的name屬性的值

          • 返回和設置一個iframe中的scrolling屬性的值

          • 改變一個iframe的src

          Image 對象

          • 對image排版

          • 返回image的替代文本

          • 給image加上border

          • 改變image的高度和寬度

          • 設置image的hspace和vspace屬性

          • 返回image的longdesc屬性的值

          • 創建一個鏈接指向一個低分辨率的image

          • 返回image的name

          • 改變image的src

          • 返回一個客戶端圖像映射的usemap的值

          Event 對象

          • 哪個鼠標鍵被點擊了?

          • 被按下的鍵盤鍵的keycode?

          • 鼠標的坐標?

          • 鼠標相對于屏幕的坐標?

          • shift鍵被按下了嗎?

          • 哪個元素被按下了?

          • 哪個事件發生了?

          Option 和 Select 對象

          • 禁用和啟用下拉列表

          • 獲得有下拉列表的表單的ID

          • 獲得下拉列表的選項數量

          • 將下拉列表變成多行列表

          • 在下拉列表中選擇多個選項

          • 彈出下拉列表中所有選項

          • 彈出下拉列表中被選中的選項的索引

          • 改變下拉列表中被選中的選項的文本

          • 刪除下拉列表中的選項

          Table, TableHeader, TableRow, TableData 對象

          • 改變表格邊框的寬度

          • 改變表格的cellpadding和cellspacing

          • 指定表格的frame

          • 為表格指定規則

          • 一個行的innerHTML

          • 一個單元格的innerHTML

          • 為表格創建一個標題

          • 刪除表格中的行

          • 添加表格中的行

          • 添加表格行中的單元格

          • 單元格內容水平對齊

          • 單元格內容垂直對齊

          • 對單個單元格的內容水平對齊

          • 對單個單元格的內容垂直對齊

          • 改變單元格的內容

          • 改變單元格橫跨的列數(colspan屬性)

          一節我們說JS主要由三部分組成:ES、DOM和BOM,接下來學生就給大家簡單介紹一下他們。

          ECMAScript

          ECMAScript是什么

          ES主要定義了基礎的語法結構,以及一些內置對象。

          語法就是進行溝通的規則,比如我們在代碼中寫“彈出提示框”,這樣并不會彈出來,而寫“alert()”就可以彈出來了,這就是因為ES的語法是那么規定的。對于一種編程語言來說通常都會規定定義變量、判斷、循環、運算、語句集(比如函數)的定義及調用等規則,ES當然也不例外,也規定了這些內容。以前學生在單位的一次講課中說:什么是程序,程序就是流程加順序。雖然這種說法不夠嚴謹,不過程序的核心應該還是流程。

          ES是一種面向對象的語言,所以他的語法中還定義了很多對象相關的內容,比如最常見的this、prototype等,而且還定義了一些內置的對象,比如Number、String、Array、Math以及RegExp等。

          ES的通用語法是很容易學習的,只要有點其他語言的基礎,入手非常簡單,這也就是一般都會覺得JS入門很容易的原因。不過ES中對象相關的語法就沒那么容易了,這也是ES(或者JS)的重點和難點,學生會在后面重點進行講解,讓大家徹底掌握。

          發展

          ES所對應的ECMA-262標準從1997年發布的第一個版本一直到現在一共發布到了六個版本,第六版于今年(2015年)6月份剛剛發布,他的正式名稱是ECMAScript 2015(簡稱ES2015),因為是第六版所以也有的地方叫他ECMAScript6,我們看到后知道他們是同一個東西就可以了。

          ES2015中增加了很多新的特性,特別是啟用了class關鍵字(不過并不是面向類的語言,學生會在ES2015相關章節中給大家詳細分析),這樣使用起來就更加方便了。不過ES的本質并沒有發生變化,他依然是一種基于對象的語言,在理解了其本質之后無論哪個版本都可以非常容易地掌握,他們之間的區別無非就是一些具體語法和功能上的增強。學生后面將以現在最通用的ES5.1版為基礎給大家進行講解,最后再補充ES2015中新增的內容。

          另外,我們要清楚ES只是一套標準,具體的實現還需要各個瀏覽器的支持,不同瀏覽器對ES的支持也不完全相同,而且在ES的基礎上不同的瀏覽器也都進行了自己相應的擴充,這就造成了瀏覽器兼容性的問題。

          DOM

          我們前面說過,ES的標準化主要是為了解決各大瀏覽器廠商(特別是微軟和網景公司)對腳本語言語法的實現不統一。不過他們在瀏覽器上的競爭并沒有因為ES的出現而終止,微軟為了占領更大的市場就在自己的Internet Explorer瀏覽器上加入了很多專有的屬性,比如VBScript和ActiveX,而使用了這些技術的網頁必須使用微軟的平臺和瀏覽器才可以正常顯示,這就給開發者帶來了麻煩,這時W3C的一些成員公司就提議創建一套標準將頁面文檔的結構暴露給腳本,從而使腳本可以統一操作頁面的內容,這樣最后就制定出了DOM標準。

          DOM是Document Object Model的縮寫,表示文檔對象模型,他定義了文檔對象的結構及其操作方法等內容。為什么叫對象模型呢?我們前面說過ES是一種面向對象的語言,他要操作的目標是對象,而DOM就是將html文檔轉換(或者對應)成ES可以操作的對象的一種模型。

          DOM雖然是因為瀏覽器而制定的,但他現在不僅可以用在瀏覽器所用的Html文件中,而且還可以用到很多其他格式的文件中,比如服務端經常用來配置信息的XML文件、Flex的mxml文件以及表示矢量圖的SVG格式文件等,這些都符合DOM標準。

          另外,DOM主要是定義了文檔(可以理解為符合相應格式的頁面文件)和文檔對象以及其操作方法的對應關系,而跟具體的語言無關,所以DOM不僅適用于ES,還適用于很多別的語言,比如Java中的dom4j也是DOM的一種實現。而且DOM中規定操作文檔的方法都是通過接口定義的,這樣不同的語言就可以按照自己的語法來進行實現了。

          BOM

          JS的功能并不僅限于對文檔的操作,有時候還需要對瀏覽器直接進行操作,比如查看當前頁面的url地址、控制瀏覽器前進、后退、以及HTML5中獲取位置信息、WebSocket等都需要對瀏覽器進行操作,而且最簡單的alert、setTimeout和setInterval也是需要瀏覽器來完成的。

          ES對瀏覽器操作的處理方法和對文檔操作的處理方法一樣,依然是將瀏覽器轉換為一個對象,這就是瀏覽器對象(Browser Object),他所對應的模型就叫瀏覽器對象模型(Browser Object Mode),簡稱BOM。

          HTML5

          Html5是近兩年非常熱的一個名詞,到底什么是Html5呢?

          從名字就可以看出來他是和網頁相關的一個東西,而網頁的三大組成部分依然是文檔結構、展示和動作控制,他們所對應的技術分別是html、css和JS,前兩者都屬于DOM中的內容(CSS作為文檔的一種特殊節點或者屬性,也屬于DOM的一部分,而且DOM中有專門的相關標準),JS可以對DOM進行操作。

          Html5的主要貢獻就是擴展了html的標簽(同時也去掉了一些原先的標簽),比如新增了section、article、header、footer、audio、video以及備受關注的canvas標簽,當然也相應地擴展了DOM,另外Html5也對BOM進行了擴展,使得JS操作瀏覽器的功能更加強大,而且也促進了BOM標準化。


          主站蜘蛛池模板: 亚洲国产成人久久综合一区77| 国产一区二区三区国产精品| www亚洲精品少妇裸乳一区二区 | 亚洲一区二区三区高清视频| 久久婷婷色一区二区三区| 无码国产精品一区二区免费式芒果 | 国产精品一区二区久久乐下载| 一区二区三区在线免费观看视频 | 亚洲无线码一区二区三区| 亚洲福利一区二区精品秒拍| 无码精品国产一区二区三区免费| 狠狠做深爱婷婷久久综合一区| 丰满岳妇乱一区二区三区| 亚洲一区二区三区深夜天堂| 日本一区二区三区日本免费| 色狠狠一区二区三区香蕉| 日韩在线一区二区三区视频| 国产在线精品一区二区不卡| 精品国产一区二区麻豆| 精品aⅴ一区二区三区| 美女毛片一区二区三区四区| 国产伦精品一区二区三区无广告| 国产精品乱码一区二区三区| 日韩人妻精品一区二区三区视频 | 日日摸夜夜添一区| 精品一区二区三人妻视频| 日韩人妻无码一区二区三区| 一区二区三区观看免费中文视频在线播放 | 精品少妇人妻AV一区二区三区| 无码人妻av一区二区三区蜜臀| 国产精品无码一区二区三区在| 3D动漫精品啪啪一区二区下载| 国产免费一区二区三区| 合区精品久久久中文字幕一区| 视频一区二区三区人妻系列| 中文字幕在线播放一区| 亚洲乱码国产一区三区| 亚洲成AV人片一区二区密柚| 亚洲一区二区无码偷拍| 国产一区二区影院| 国产午夜三级一区二区三|