W3Cschool
恭喜您成為首批注冊(cè)用戶
獲得88經(jīng)驗(yàn)值獎(jiǎng)勵(lì)
由于歷史原因,HTML元素的id
屬性的名字,會(huì)自動(dòng)成為全局變量,指向該HTML元素。
// HTML元素為
// <div id="example"></div>
example // [object HTMLDivElement]
上面代碼中,有一個(gè)id
屬性等于example
的div
元素,結(jié)果就自動(dòng)生成了全局變量example
,指向這個(gè)div
元素。
如果已有同名全局變量,則id
元素不會(huì)自動(dòng)生成全局變量。
<script>
var example = 1;
</script>
<div id="example"></div>
<script>
console.log(example) // 1
</script>
上面代碼中,已有全局變量example
,這時(shí)id
屬性就不會(huì)自動(dòng)變成全局變量。另一情況是,DOM生成以后,再對(duì)全局變量example
賦值,這時(shí)也會(huì)覆蓋example
原來(lái)的值。
由于這種原因,默認(rèn)的全局變量名(比如,history
、location
、navigator
等),最好不要設(shè)為id
屬性的名字。
另外,由于原則上,網(wǎng)頁(yè)之中不應(yīng)該有同名id
屬性的HTML元素,所以,這種機(jī)制產(chǎn)生的全局變量不會(huì)重名。
由于歷史原因,以下HTML元素的name
屬性,也會(huì)成為全局變量。
<applet>
<area>
<embed>
<form>
<frame>
<frameset>
<iframe>
<img>
<object>
// HTML代碼為
// <form name="myForm" />
myForm // [object HTMLFormElement]
上面代碼中,form
元素的name
屬性名myForm
,自動(dòng)成為全局變量myForm
。
如果name
屬性同名的HTML元素不止一個(gè),或者某個(gè)元素的id
屬性與另一個(gè)元素的name
屬性同名,這時(shí)全局變量會(huì)指向一個(gè)類似數(shù)組的對(duì)象。
// HTML代碼為
// <div id="myForm" />
// <form name="myForm" />
myForm[0] // [object HTMLDivElement]
myForm[1] // [object HTMLFormElement]
上面代碼中,全局變量myForm
的第一個(gè)成員指向div
元素,第二個(gè)成員指向form
元素。
這些元素的name
屬性名,也會(huì)成為document
對(duì)象的屬性。
// HTML代碼為<img name="xx" />
document.xx === xx // true
上面代碼中,name
屬性為xx
的img
元素,自動(dòng)生成了全局變量xx
和document
對(duì)象的屬性xx
。
如果有多個(gè)name
屬性相同的元素,那么document
對(duì)象的該屬性指向一個(gè)類似數(shù)組的對(duì)象(NodeList對(duì)象的實(shí)例)。
這樣設(shè)計(jì)的原意是,通過(guò)引用document.elementName
就可以獲得該元素。但是,由于這些屬性是自動(dòng)生成的,既不規(guī)范,也不利于除錯(cuò),所以建議不要使用它們。
另外,如果iframe
元素有name
屬性或id
屬性,那么生成的全局變量,不是指向iframe
元素節(jié)點(diǎn),而是指向這個(gè)iframe
代表的子頁(yè)面window
對(duì)象。
除了自動(dòng)成為window
和document
的屬性,帶有id
或name
屬性的HTML元素,還會(huì)自動(dòng)成為集合對(duì)象的屬性。舉例來(lái)說(shuō),如果有一個(gè)表單元素<form>
。
<form name="myform">
它會(huì)自動(dòng)成為集合對(duì)象document.forms
的屬性。
document.forms.myforms;
表單主要用于收集用戶的輸入,送到服務(wù)器或者在前端處理。
如果<form>
元素帶有name
或者id
屬性,這個(gè)元素節(jié)點(diǎn)會(huì)自動(dòng)成為window
和document
的屬性,并且可以從document.forms
上取到。<form name="myForm">
節(jié)點(diǎn)用下面幾種方法可以拿到。
window.myForm
document.myForm
document.forms.myForm
document.forms[n]
document.forms
返回一個(gè)類似數(shù)組的對(duì)象(HTMLCollection
的實(shí)例),包含了當(dāng)前頁(yè)面中所有表單(<form>
元素)。HTMLCollection
的實(shí)例都可以使用某個(gè)節(jié)點(diǎn)的id
和name
屬性,取到該節(jié)點(diǎn)。
表單對(duì)象本身也是一個(gè)HTMLCollection
對(duì)象的實(shí)例,它里面的各個(gè)子節(jié)點(diǎn)也可以用id
屬性、name
屬性或者索引值取到。舉例來(lái)說(shuō),myForm
表單的第一個(gè)子節(jié)點(diǎn)是<input type="text" name="address">
,它可以用下面的方法取到。
document.forms.myForm[0]
document.forms.myForm.address
document.myForm.address
表單節(jié)點(diǎn)都有一個(gè)elements
屬性,包含了當(dāng)前表單的所有子元素,所以也可以用下面的方法取到address
子節(jié)點(diǎn)。
document.forms.myForm.elements[0]
document.forms.myForm.elements.address
表單之中,會(huì)有多個(gè)元素共用同一個(gè)name
屬性的情況。
<form name="myForm">
<label><input type="radio" name="method" value="1">1</label>
<label><input type="radio" name="method" value="2">2</label>
<label><input type="radio" name="method" value="3">3</label>
</form>
上面代碼中,三個(gè)單選框元素共用同一個(gè)name
屬性,這時(shí)如果使用這個(gè)name
屬性去引用子節(jié)點(diǎn),返回的將是一個(gè)類似數(shù)組的對(duì)象。
document.forms.myForm.elements.method.length // 3
如果想知道,用戶到底選中了哪一個(gè)子節(jié)點(diǎn),就必須遍歷所有的同名節(jié)點(diǎn)。
var methods = document.forms.myForm.elements.method;
var result;
for (var i = 0; i < methods.length; i++) {
if (methods[i].checked) value = methods[i].value;
}
<form>
元素對(duì)應(yīng)的DOM節(jié)點(diǎn)是一個(gè)Form對(duì)象。這個(gè)對(duì)象除了上一小節(jié)提到的elements
屬性,還有以下屬性,分別對(duì)應(yīng)元素標(biāo)簽中的同名屬性。
action
encoding
method
target
Form對(duì)象還有兩個(gè)屬性,可以指定事件的回調(diào)函數(shù)。
onsubmit
:提交表單前調(diào)用,只要返回false
,就會(huì)取消提交。可以在這個(gè)函數(shù)里面,校驗(yàn)用戶的輸入。該函數(shù)只會(huì)在用戶提交表單時(shí)調(diào)用,腳本調(diào)用submit()
方法是不會(huì)觸發(fā)這個(gè)函數(shù)的。onreset
:重置表單前調(diào)用,只要返回false
,就會(huì)取消表單重置。該函數(shù)只能由真實(shí)的reset按鈕觸發(fā),腳本調(diào)用reset()
方法并不會(huì)觸發(fā)這個(gè)函數(shù)。<form onreset="return confirm('你要重置表單嗎?')">
<!-- ... -->
<button type="reset">重置</button>
</form>
Form對(duì)象的方法主要是下面兩個(gè)。
submit()
:將表單數(shù)據(jù)提交到服務(wù)器reset()
:重置表單數(shù)據(jù)表單包含了各種控件,每個(gè)控件都是一個(gè)對(duì)象。它們都包含了以下四個(gè)屬性。
type
:表示控件的類型,對(duì)于<input>
元素、<button>
元素等于這些標(biāo)簽的type
屬性,對(duì)于其他控件,<select>
為select-one
,<select multiple>
為select-multiple
,<textarea>
為textarea
。該屬性只讀。form
:指向包含該控件的表單對(duì)象,如果該控件不包含在表單之中,則返回null
。該屬性只讀。name
:返回控件標(biāo)簽的name
屬性。該屬性只讀。value
:返回或設(shè)置該控件的值,這個(gè)值會(huì)被表單提交到服務(wù)器。該屬性可讀寫。
才會(huì)
form
屬性有一個(gè)特別的應(yīng)用,就是在控件的事件回調(diào)函數(shù)里面,this
指向事件所在的控件對(duì)象,所以this.form
就指向控件所在的表單,this.form.x
就指向其他控件元素,里面的x
就是該控件的name
屬性或id
屬性的值。表單控件之中,只要是按鈕,都有onclick
屬性,用來(lái)指定用戶點(diǎn)擊按鈕時(shí)的回調(diào)函數(shù);其他的控件一般都有onchange
屬性,控件值發(fā)生變化,并且該控件失去焦點(diǎn)時(shí)調(diào)用。單選框(Radio控件)和多選框(Checkbox控件)可以同時(shí)設(shè)置onchange
和onclick
屬性。
表單控件還有以下兩個(gè)事件。
focus
:得到焦點(diǎn)時(shí)觸發(fā)blur
:失去焦點(diǎn)時(shí)觸發(fā)<select>
元素用來(lái)生成下拉列表。默認(rèn)情況下,瀏覽器只顯示一條選項(xiàng),其他選項(xiàng)需要點(diǎn)擊下拉按鈕才會(huì)顯示。size
選項(xiàng)如果大于1,那么瀏覽器就會(huì)默認(rèn)顯示多個(gè)選項(xiàng)。
<select size="3">
上面代碼指定默認(rèn)顯示三個(gè)選項(xiàng),更多的選項(xiàng)需要點(diǎn)擊下拉按鈕才會(huì)顯示。
<select>
元素默認(rèn)只能選中一個(gè)選項(xiàng),如果想選中多個(gè)選項(xiàng),必須指定multiple
屬性。
<select multiple>
用戶選中或者取消一個(gè)下拉選項(xiàng)時(shí),會(huì)觸發(fā)Select
對(duì)象的change
事件,從而自動(dòng)執(zhí)行onchange
監(jiān)聽(tīng)函數(shù)。
<select>
元素有一個(gè)options
屬性,返回一個(gè)類似數(shù)組的對(duì)象,包含了所有的<option>
元素。
// HTML 代碼為
// <select id="example">
// <option>1</option>
// <option>2</option>
// <option>3</option>
// </select>
var element = document.querySelector('#example');
element.options.length
// 3
上面代碼中,<select>
元素的options
屬性包含了三個(gè)<option>
元素。
options
屬性可讀寫,可以通過(guò)設(shè)置options.length
,控制向用戶顯示的下拉選項(xiàng)的值。將options.length
設(shè)為0,可以不再顯示任何下拉屬性。將options
里面某個(gè)位置的Option
對(duì)象設(shè)為null
,將等于移除這個(gè)選項(xiàng),后面的Option
對(duì)象會(huì)自動(dòng)遞補(bǔ)這個(gè)位置。
Select
對(duì)象的selectedIndex
屬性,返回用戶選中的第一個(gè)下拉選項(xiàng)的位置(從0開(kāi)始)。如果返回-1
,則表示用戶沒(méi)有選中任何選項(xiàng)。該屬性可讀寫。對(duì)于單選的下拉列表,這個(gè)屬性就可以得知用戶的選擇;對(duì)于多選的下拉列表,這個(gè)屬性還不夠,必須逐個(gè)輪詢options
屬性,判斷每個(gè)Option
對(duì)象的selected
屬性是否為true
。
<option>
元素用于在下拉列表(<select>
)中生成下拉選項(xiàng)。每個(gè)下拉選項(xiàng)就是一個(gè)Option
對(duì)象,它有以下屬性。
selected
:返回一個(gè)布爾值,表示用戶是否選中該選項(xiàng)。text
:返回該下拉選項(xiàng)的顯示的文本。該屬性可讀寫,可用來(lái)顯示向用戶顯示的文本。value
:返回該下拉選項(xiàng)的值,即向服務(wù)器發(fā)送的那個(gè)值。該屬性可讀寫。defaultSelected
:返回一個(gè)布爾值,表示這個(gè)下拉選項(xiàng)是否默認(rèn)選中。瀏覽器提供Option
構(gòu)造函數(shù),用來(lái)生成下拉列表的選項(xiàng)對(duì)象。利用這個(gè)函數(shù),可以用腳本生成下拉選項(xiàng),然后放入Select.options
對(duì)象里面,從而自動(dòng)生成下拉列表。
var item = new Option(
'Hello World', // 顯示的文本,即 text 屬性
'myValue', // 向服務(wù)器發(fā)送的值,即 value 屬性
false, // 是否為默認(rèn)選項(xiàng),即 defaultSelected 屬性
false // 是否已經(jīng)選中,即 selected 屬性
);
// 獲取 Selector 對(duì)象
var mySelector = document.forms.myForm.mySelector;
mySelector.options[mySelector.options.length] = item;
上面代碼在下拉列表的末尾添加了一個(gè)選項(xiàng)。從中可以看到,Option
構(gòu)造函數(shù)可以接受四個(gè)選項(xiàng),對(duì)應(yīng)<Option>
對(duì)象的四個(gè)屬性。
注意,用腳本插入下拉選項(xiàng)完全可以用標(biāo)準(zhǔn)的DOM操作方法實(shí)現(xiàn),比如Document.create Element()
、Node.insertBefore()
和Node.removeChild()
等等。
alt
屬性返回image
元素的HTML標(biāo)簽的alt
屬性值,src
屬性返回image
元素的HTML標(biāo)簽的src
屬性值。
// 方法一:HTML5構(gòu)造函數(shù)Image
var img1 = new Image();
img1.src = 'image1.png';
img1.alt = 'alt';
document.body.appendChild(img1);
// 方法二:DOM HTMLImageElement
var img2 = document.createElement('img');
img2.src = 'image2.jpg';
img2.alt = 'alt text';
document.body.appendChild(img2);
document.images[0].src
// image1.png
complete屬性返回一個(gè)布爾值,true表示當(dāng)前圖像屬于瀏覽器支持的圖形類型,并且加載完成,解碼過(guò)程沒(méi)有出錯(cuò),否則就返回false。
這兩個(gè)屬性返回image元素被瀏覽器渲染后的高度和寬度。
這兩個(gè)屬性只讀,表示image對(duì)象真實(shí)的寬度和高度。
myImage.addEventListener('onload', function() {
console.log('My width is: ', this.naturalWidth);
console.log('My height is: ', this.naturalHeight);
});
表格有一些特殊的DOM操作方法。
下面是使用JavaScript生成表格的一個(gè)例子。
var table = document.createElement('table');
var tbody = document.createElement('tbody');
table.appendChild(tbody);
for (var i = 0; i <= 9; i++) {
var rowcount = i + 1;
tbody.insertRow(i);
tbody.rows[i].insertCell(0);
tbody.rows[i].insertCell(1);
tbody.rows[i].insertCell(2);
tbody.rows[i].cells[0].appendChild(document.createTextNode('Row ' + rowcount + ', Cell 1'));
tbody.rows[i].cells[1].appendChild(document.createTextNode('Row ' + rowcount + ', Cell 2'));
tbody.rows[i].cells[2].appendChild(document.createTextNode('Row ' + rowcount + ', Cell 3'));
}
table.createCaption();
table.caption.appendChild(document.createTextNode('A DOM-Generated Table'));
document.body.appendChild(table);
這些代碼相當(dāng)易讀,其中需要注意的就是insertRow
和insertCell
方法,接受一個(gè)表示位置的參數(shù)(從0開(kāi)始的整數(shù))。
table
元素有以下屬性:
audio元素和video元素加載音頻和視頻時(shí),以下事件按次序發(fā)生。
除了上面這些事件,audio元素和video元素還支持以下事件。
事件 | 觸發(fā)條件 |
---|---|
abort | 播放中斷 |
emptied | 媒體文件加載后又被清空,比如加載后又調(diào)用load方法重新加載。 |
ended | 播放結(jié)束 |
error | 發(fā)生錯(cuò)誤。該元素的error屬性包含更多信息。 |
pause | 播放暫停 |
play | 暫停后重新開(kāi)始播放 |
playing | 開(kāi)始播放,包括第一次播放、暫停后播放、結(jié)束后重新播放。 |
ratechange | 播放速率改變 |
seeked | 搜索操作結(jié)束 |
seeking | 搜索操作開(kāi)始 |
stalled | 瀏覽器開(kāi)始嘗試讀取媒體文件,但是沒(méi)有如預(yù)期那樣獲取數(shù)據(jù) |
suspend | 加載文件停止,有可能是播放結(jié)束,也有可能是其他原因的暫停 |
timeupdate | 網(wǎng)頁(yè)元素的currentTime屬性改變時(shí)觸發(fā)。 |
volumechange | 音量改變時(shí)觸發(fā)(包括靜音)。 |
waiting | 由于另一個(gè)操作(比如搜索)還沒(méi)有結(jié)束,導(dǎo)致當(dāng)前操作(比如播放)不得不等待。 |
tabindex
屬性用來(lái)指定,當(dāng)前HTML元素節(jié)點(diǎn)是否被tab鍵遍歷,以及遍歷的優(yōu)先級(jí)。
var b1 = document.getElementById("button1");
b1.tabIndex = 1;
如果tabindex = -1
,tab鍵跳過(guò)當(dāng)前元素。
如果tabindex = 0
,表示tab鍵將遍歷當(dāng)前元素。如果一個(gè)元素沒(méi)有設(shè)置tabindex,默認(rèn)值就是0。
如果tabindex > 0
,表示tab鍵優(yōu)先遍歷。值越大,就表示優(yōu)先級(jí)越大。
Copyright©2021 w3cschool編程獅|閩ICP備15016281號(hào)-3|閩公網(wǎng)安備35020302033924號(hào)
違法和不良信息舉報(bào)電話:173-0602-2364|舉報(bào)郵箱:jubao@eeedong.com
掃描二維碼
下載編程獅App
編程獅公眾號(hào)
聯(lián)系方式:
更多建議: