在美女畫廊的案例中,我們需要獲取到 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
let p=document.getElementById('p');
// 獲取標簽之間的內容
console.log(p.innerHTML)
// 設置標簽之間的內容
p.innerHTML='<b>Hello DOM</b>'
在網頁中有一些特殊的符號,比如:< >;想要顯示這些符號需要對這些內容進行轉義,也就是使用 HTML 的實體。
字符實體的表示形式:
&字符實體編號;
< // < 顯示小于號
> // > 顯示大于號
顯示結果 | 描述 | 實體名稱 | 實體編號 |
空格 |
|
| |
< | 小于號 | < | < |
> | 大于號 | > | > |
& | 和號 | & | & |
" | 引號 | " | " |
' | 撇號 | ' (IE不支持) | ' |
¢ | 分(cent) | ¢ | ¢ |
£ | 鎊(pound) | £ | £ |
¥ | 元(yen) | ¥ | ¥ |
| 歐元(euro) | € | € |
§ | 小節 | § | § |
? | 版權(copyright) | © | © |
? | 注冊商標 | ® | ® |
? | 商標 | ™ | ™ |
× | 乘號 | × | × |
÷ | 除號 | ÷ | ÷ |
需要記住其中的空、>、< 的字符實體名稱
// 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 最初的目的是用來驗證用戶的輸入是否合法,為了實現表單元素的驗證,我們需要獲取用戶輸入的內容,這需要使用到表單元素的屬性。
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;
};
// 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 這個屬性。
自定義屬性有兩種用法,分別是:
// 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標準化。
*請認真填寫需求信息,我們會在24小時內與您取得聯系。