TypeScript中使用getElementXXX()

若是隻是看解決方法,能夠直接跳到第二小節html

簡述

Angular 1.x版本是用JavaScript編寫的,咱們在百度Angular常常會搜索到AngularJS,並非JavaScript的什麼衍生版本,就是Angular 1.x。在後續版本中,改用TypeScript來重寫了Angular框架。改動較大,因此作了個區分,Angular v1.x就叫AngularJS,v2及後續版本統稱爲Angular。c++

查資料和解決方案的時候,常常會搜索到大量的AngularJS內容,注意區分。編程

在這裏提一下Angular的歷史,是由於本文是在使用這個框架的時候遇到的,因此囉嗦兩句。segmentfault

問題來了

如今有以下html文件:數組

<!-- 這倆隨便挑一個用就行 -->
<input type="text" id="infoInput" name="infoInput">
<textarea id="infoArea" name="infoArea" rows="8" cols="80"></textarea>

<!-- 這倆也隨便挑一個用就行 -->
<span id="some">something happen!</span>
<p id="any">anything ok!</p>
複製代碼

我如今要經過TypeScript獲取上面任意一個DOM元素,怎麼作?有JS基礎都知道,操做DOM能夠經過document完成:瀏覽器

// 因爲DOM元素的ID是唯一的,因此這種方式獲取的是惟一的DOM元素
dom = document.getElementById('infoInput');

// name屬性是不惟一的,因此這種方式獲取的是全部 name=infoInput 的DOM元素,即一個數組
dom1 = document.getElementsByName('infoInput');
複製代碼

而在TypeScript中固然也能夠這麼作,可是在具體使用的時候除了須要聲明變量保存獲取到的DOM元素以外,還有一點小小的問題。安全

// Angular框架中
export class Some implements OnInit {
  ngOnInit() {
    let dom = document.getElementById('infoArea');
    // 1. 獲取輸入框中的內容
    let html = dom.innerHTML;
    let val = dom.value;

    // 2. 打印輸出
    console.log(html);
    console.log(val);
  }
}
複製代碼

這段代碼寫完會報一個錯:app

Property 'value' does not exist on type 'HTMLElement' 沒關係,即便有錯誤提示,咱們依舊能夠運行並獲得正確的結果。若是想在ts文件編譯失敗時不生成js文件,能夠經過配置實現。框架

HTMLElement是什麼?這是一個對象,它包含了全部HTML元素公有的屬性。dom

關於HTMLElement的詳細內容以及瀏覽器的兼容,能夠查看MDN的這篇文章

來看一張圖:

js類間繼承

圖源自nanaistaken的博客

若是你剛好有一點面向對象編程的知識,那麼這張圖就很容易理解,沒有也不要緊,畢竟不管是js仍是ts,如今都增長了class關鍵字,引入了類的思想。

通過上面的分析,咱們可以知道:getElementXXX()返回的是一個HTMLElement對象,而這個對象包含了全部DOM元素的公有屬性。而每種不一樣類別的DOM元素,又有本身的特性,也就是圖中的子類。

ts會作編譯檢查,因此會有錯誤提示,而js則不檢查,因此這也會留下安全隱患。

到這裏,其實應該已經明白瞭如今這種狀況該怎麼解決以及之後該怎麼使用getElementXXX函數了。

修改後的代碼:

export class Some implements OnInit {
  ngOnInit() {
    // *. 作一次類型轉換,或者作類型斷言
    let dom = <HTMLInputElement>document.getElementById('infoArea');
    let dom1 = document.getElementById('infoArea') as HTMLElement;

    // 1. 獲取輸入框中的內容
    let html = dom.innerHTML;
    let val = dom.value;

    // 2. 打印輸出
    console.log(html);
    console.log(val);
  }
}
複製代碼

總結

HTMLElement是DOM結點共有的屬性,TypeScript庫中抽取該屬性做爲一個公共接口,相似於其餘面嚮對象語言如Java和c++中所說的基類。這樣作能夠保證在操做DOM結點的時候不會出現訪問不存在屬性的問題。

HTMLInputElement是HTMLElement的一個子接口(或說子類,但TypeScript是支持class的,因此說接口更好一些),其內部封裝瞭如input,textarea這類dom結點的屬性。

本文首發於我的博客,歡迎來撩^ -

相關文章
相關標籤/搜索