TypeScript中使用getElementXXX()的示例代碼
簡(jiǎn)述
Angular 1.x版本是用JavaScript編寫的,我們?cè)诎俣華ngular經(jīng)常會(huì)搜索到AngularJS,并不是JavaScript的什么衍生版本,就是Angular 1.x。在后續(xù)版本中,改用TypeScript來(lái)重寫了Angular框架。改動(dòng)較大,所以做了個(gè)區(qū)分,Angular v1.x就叫AngularJS,v2及后續(xù)版本統(tǒng)稱為Angular。
查資料和解決方案的時(shí)候,經(jīng)常會(huì)搜索到大量的AngularJS內(nèi)容,注意區(qū)分。
在這里提一下Angular的歷史,是因?yàn)楸疚氖窃谑褂眠@個(gè)框架的時(shí)候遇到的,所以啰嗦兩句。
問(wèn)題來(lái)了
現(xiàn)在有如下html文件:
<!-- 這倆隨便挑一個(gè)用就行 --> <input type="text" id="infoInput" name="infoInput"> <textarea id="infoArea" name="infoArea" rows="8" cols="80"></textarea> <!-- 這倆也隨便挑一個(gè)用就行 --> <span id="some">something happen!</span> <p id="any">anything ok!</p>
我現(xiàn)在要通過(guò)TypeScript獲取上面任意一個(gè)DOM元素,怎么做?有JS基礎(chǔ)都知道,操作DOM可以通過(guò) document 完成:
// 由于DOM元素的ID是惟一的,所以這種方式獲取的是唯一的DOM元素
dom = document.getElementById('infoInput');
// name屬性是不唯一的,所以這種方式獲取的是所有 name=infoInput 的DOM元素,即一個(gè)數(shù)組
dom1 = document.getElementsByName('infoInput');
而在TypeScript中當(dāng)然也可以這么做,但是在具體使用的時(shí)候除了需要聲明變量保存獲取到的DOM元素之外,還有一點(diǎn)小小的問(wèn)題。
// Angular框架中
export class Some implements OnInit {
ngOnInit() {
let dom = document.getElementById('infoArea');
// 1. 獲取輸入框中的內(nèi)容
let html = dom.innerHTML;
let val = dom.value;
// 2. 打印輸出
console.log(html);
console.log(val);
}
}
這段代碼寫完會(huì)報(bào)一個(gè)錯(cuò):
Property 'value' does not exist on type 'HTMLElement' 不要緊,即使有錯(cuò)誤提示,我們依舊可以運(yùn)行并得到正確的結(jié)果。如果想在ts文件編譯失敗時(shí)不生成js文件,可以通過(guò)配置實(shí)現(xiàn)。
HTMLElement是什么?這是一個(gè)對(duì)象,它包含了所有HTML元素公有的屬性。
關(guān)于HTMLElement的詳細(xì)內(nèi)容以及瀏覽器的兼容,可以查看MDN的這篇文章
來(lái)看一張圖:

圖源自nanaistaken的博客。
如果你恰好有一點(diǎn)面向?qū)ο缶幊痰闹R(shí),那么這張圖就很容易理解,沒有也沒關(guān)系,畢竟無(wú)論是js還是ts,現(xiàn)在都增加了class關(guān)鍵字,引入了類的思想。
經(jīng)過(guò)上面的分析,我們能夠知道: getElementXXX() 返回的是一個(gè)HTMLElement對(duì)象,而這個(gè)對(duì)象包含了所有DOM元素的公有屬性。而每種不同類別的DOM元素,又有自己的特性,也就是圖中的子類。
ts會(huì)做編譯檢查,所以會(huì)有錯(cuò)誤提示,而js則不檢查,所以這也會(huì)留下安全隱患。
到這里,其實(shí)應(yīng)該已經(jīng)明白了現(xiàn)在這種情況該怎么解決以及以后該怎么使用getElementXXX函數(shù)了。
修改后的代碼:
export class Some implements OnInit {
ngOnInit() {
// *. 做一次類型轉(zhuǎn)換,或者做類型斷言
let dom = <HTMLInputElement>document.getElementById('infoArea');
let dom1 = document.getElementById('infoArea') as HTMLElement;
// 1. 獲取輸入框中的內(nèi)容
let html = dom.innerHTML;
let val = dom.value;
// 2. 打印輸出
console.log(html);
console.log(val);
}
}
總結(jié)
HTMLElement是DOM結(jié)點(diǎn)共有的屬性,TypeScript庫(kù)中抽取該屬性作為一個(gè)公共接口,類似于其他面向?qū)ο笳Z(yǔ)言如Java和c++中所說(shuō)的基類。這樣做可以保證在操作DOM結(jié)點(diǎn)的時(shí)候不會(huì)出現(xiàn)訪問(wèn)不存在屬性的問(wèn)題。
HTMLInputElement是HTMLElement的一個(gè)子接口(或說(shuō)子類,但TypeScript是支持class的,所以說(shuō)接口更好一些),其內(nèi)部封裝了如input,textarea這類dom結(jié)點(diǎn)的屬性。
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
- TypeScript學(xué)習(xí)之強(qiáng)制類型的轉(zhuǎn)換
- 關(guān)于TypeScript中import JSON的正確姿勢(shì)詳解
- TypeScript 中接口詳解
- TypeScript Type Innference(類型判斷)
- 在 Typescript 中使用可被復(fù)用的 Vue Mixin功能
- 詳解使用Typescript開發(fā)node.js項(xiàng)目(簡(jiǎn)單的環(huán)境配置)
- 使用TypeScript開發(fā)微信小程序的方法
- 如何獲取TypeScript的聲明文件.d.ts
- TypeScript入門-基本數(shù)據(jù)類型
- vue與TypeScript集成配置最簡(jiǎn)教程(推薦)
相關(guān)文章
JavaScript基于inquirer封裝一個(gè)控制臺(tái)文件選擇器
這篇文章主要介紹了JavaScript基于inquirer封裝一個(gè)控制臺(tái)文件選擇器,文章圍繞主題展開詳細(xì)的內(nèi)容介紹,具有一定的參考價(jià)值,需要的朋友可以參考一下2022-08-08
CSS中position屬性之fixed實(shí)現(xiàn)div居中
這篇文章主要介紹了CSS中position屬性之fixed實(shí)現(xiàn)div居中的相關(guān)資料,需要的朋友可以參考下2015-12-12
js實(shí)現(xiàn)簡(jiǎn)單鎖屏功能實(shí)例
這篇文章主要介紹了js實(shí)現(xiàn)簡(jiǎn)單鎖屏功能的方法,實(shí)例分析了javascript操作頁(yè)面元素顯示與隱藏的相關(guān)技巧,涉及javascript操作元素屬性與鼠標(biāo)、鍵盤事件的相關(guān)技巧,需要的朋友可以參考下2015-05-05
js實(shí)現(xiàn)文字超出部分用省略號(hào)代替實(shí)例代碼
關(guān)于超出一定字?jǐn)?shù)用省略號(hào)顯示的問(wèn)題,這種要求在我們?nèi)粘i_發(fā)的時(shí)候經(jīng)常見到,我們之前基本都是用CSS來(lái)完成的,今天給大家分享個(gè)Javascript實(shí)現(xiàn)這個(gè)功能的示例代碼,有需要的可以參考借鑒。2016-09-09
一文總結(jié)JavaScript中常見的設(shè)計(jì)模式
在程序設(shè)計(jì)中有很多實(shí)用的設(shè)計(jì)模式,而其中大部分語(yǔ)言的實(shí)現(xiàn)都是基于“類”。在程序設(shè)計(jì)中有很多實(shí)用的設(shè)計(jì)模式,而其中大部分語(yǔ)言的實(shí)現(xiàn)都是基于“類”。,本文將總結(jié)了JavaScript中常見的十五種設(shè)計(jì)模式,感興趣的朋友可以參考下2023-05-05

