TypeScript中使用getElementXXX()的示例代码


Posted in Javascript onSeptember 12, 2019

简述

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

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

在这里提一下Angular的历史,是因为本文是在使用这个框架的时候遇到的,所以??铝骄洹?/p>

问题来了

现在有如下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结点的属性。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
不错的新闻标题颜色效果
Dec 10 Javascript
JQuery 写的个性导航菜单
Dec 24 Javascript
javascript中的变量是传值还是传址的?
Apr 19 Javascript
js函数排序的实例代码
Jul 01 Javascript
JavaScript中getUTCSeconds()方法的使用详解
Jun 11 Javascript
jQuery原理系列-css选择器的简单实现
Jun 07 Javascript
weex slider实现滑动底部导航功能
Aug 28 Javascript
新版vue-cli模板下本地开发环境使用node服务器跨域的方法
Apr 03 Javascript
Node.js在图片模板上生成二维码图片并附带底部文字说明实现详解
Aug 07 Javascript
Node.js API详解之 readline模块用法详解
May 22 Javascript
javascript实现时间日期的格式化的方法汇总
Aug 06 Javascript
vue-admin-template配置快捷导航的代码(标签导航栏)
Sep 04 Javascript
深入浅析vue中cross-env的使用
Sep 12 #Javascript
layui form表单提交之后重新加载数据表格的方法
Sep 11 #Javascript
layer弹出层显示在top顶层的方法
Sep 11 #Javascript
layer.js之回调销毁对话框的例子
Sep 11 #Javascript
layer.alert回调函数执行关闭弹窗的实例
Sep 11 #Javascript
JavaScript 斐波那契数列 倒序输出 输出100以内的质数代码实例
Sep 11 #Javascript
浅谈layui框架自带分页和表格重载的接口解析问题
Sep 11 #Javascript
You might like
PHP 数组入门教程小结
2009/05/20 PHP
PHP下常用正则表达式整理
2010/10/26 PHP
js 优化次数过多的循环 考虑到性能问题
2011/03/05 Javascript
js特效,页面下雪的小例子
2013/06/17 Javascript
JS判断变量是否为空判断是否null
2014/07/25 Javascript
JavaScript中的包装对象介绍
2015/01/27 Javascript
浅谈jQuery中replace()方法
2015/05/13 Javascript
AngularJS使用ng-Cloak阻止初始化闪烁问题的方法
2016/11/03 Javascript
Bootstrap表单控件使用方法详解
2017/01/11 Javascript
javascript将list转换成树状结构的实例
2017/09/08 Javascript
phantomjs导出html到pdf的方法总结
2017/10/19 Javascript
在 React、Vue项目中使用SVG的方法
2018/02/09 Javascript
Vue中的Props(不可变状态)
2018/09/29 Javascript
vue使用@scroll监听滚动事件时,@scroll无效问题的解决方法详解
2019/10/15 Javascript
在Layui中操作数据表格,给指定单元格添加事件示例
2019/10/26 Javascript
antd-日历组件,前后禁止选择,只能选中间一部分的实例
2020/10/29 Javascript
JavaScript中跨域问题的深入理解
2021/03/04 Javascript
解决python写的windows服务不能启动的问题
2014/04/15 Python
Python实现的Google IP 可用性检测脚本
2015/04/23 Python
在Python的Bottle框架中使用微信API的示例
2015/04/23 Python
python中pass语句用法实例分析
2015/04/30 Python
python数据类型_字符串常用操作(详解)
2017/05/30 Python
对Python3+gdal 读取tiff格式数据的实例讲解
2018/12/04 Python
PyQt5固定窗口大小的方法
2019/06/18 Python
pygame实现俄罗斯方块游戏(对战篇1)
2019/10/29 Python
Eclipse配置python默认头过程图解
2020/04/26 Python
python删除指定列或多列单个或多个内容实例
2020/06/28 Python
15款Python编辑器的优缺点,别再问我“选什么编辑器”啦
2020/10/19 Python
Python实现列表索引批量删除的5种方法
2020/11/16 Python
python3.8.3安装教程及环境配置的详细教程(64-bit)
2020/11/28 Python
HTML5 Canvas实现烟花绽放特效
2016/03/02 HTML / CSS
Speedo美国:澳大利亚顶尖泳衣制造商
2016/08/03 全球购物
化学学院毕业生自荐信范文
2013/12/17 职场文书
2014年党员自我评议(5篇)
2014/09/12 职场文书
五一晚会主持词
2015/07/01 职场文书
浅谈GO中的Channel以及死锁的造成
2022/03/18 Golang