欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

TypeScript中使用getElementXXX()

程序员文章站 2022-03-07 16:01:19
如果只是看解决方法,可以直接跳到第二小节 简述 Angular 1.x版本是用JavaScript编写的,我们在百度Angular经常会搜索到AngularJS,并不是JavaScript的什么衍生版本,就是Angular 1.x。在后续版本中,改用TypeScript来重写了Angular框架。改 ......

如果只是看解决方法,可以直接跳到第二小节

简述

angular 1.x版本是用javascript编写的,我们在百度angular经常会搜索到angularjs,并不是javascript的什么衍生版本,就是angular 1.x。在后续版本中,改用typescript来重写了angular框架。改动较大,所以做了个区分,angular v1.x就叫angularjs,v2及后续版本统称为angular。

查资料和解决方案的时候,经常会搜索到大量的angularjs内容,注意区分。

在这里提一下angular的历史,是因为本文是在使用这个框架的时候遇到的,所以啰嗦两句。

问题来了

现在有如下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);
  }
}

这段代码写完会报一个错:

property 'value' does not exist on type 'htmlelement'
不要紧,即使有错误提示,我们依旧可以运行并得到正确的结果。如果想在ts文件编译失败时不生成js文件,可以通过配置实现。

htmlelement是什么?这是一个对象,它包含了所有html元素公有的属性。

关于htmlelement的详细内容以及浏览器的兼容,可以查看mdn的这篇文章

来看一张图:

TypeScript中使用getElementXXX()

图源自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结点的属性。