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 相关文章推荐
jquery animate实现鼠标放上去显示离开隐藏效果
Jul 21 Javascript
jQuery中innerWidth()方法用法实例
Jan 19 Javascript
jquery插件jquery.LightBox.js实现点击放大图片并左右点击切换效果(附demo源码下载)
Feb 25 Javascript
浅析上传头像示例及其注意事项
Dec 14 Javascript
BootStrap+Mybatis框架下实现表单提交数据重复验证
Mar 23 Javascript
node.js基于express使用websocket的方法
Nov 09 Javascript
Angular2.0实现modal对话框的方法示例
Feb 18 Javascript
剖析Angular Component的源码示例
Mar 23 Javascript
深入Vue-Router路由嵌套理解
Aug 13 Javascript
新手快速入门JavaScript装饰者模式与AOP
Jun 24 Javascript
vue中的过滤器及其时间格式化问题
Apr 09 Javascript
在vue中实现禁止回退上一步,路由不存历史记录
Jul 22 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
URL Rewrite的设置方法
2007/01/02 PHP
php自定义函数之递归删除文件及目录
2010/08/08 PHP
javascript Zifa FormValid 0.1表单验证 代码打包下载
2007/06/08 Javascript
犀利的js 函数集合
2009/06/11 Javascript
JS类的封装及实现代码
2009/12/02 Javascript
JavaScript 面向对象编程(2) 定义类
2010/05/18 Javascript
MultiSelect左右选择控件的设计与实现介绍
2013/06/08 Javascript
jquery如何通过name名称获取当前name的value值
2013/12/20 Javascript
jquery实现的动态回到顶部特效代码
2015/10/28 Javascript
Bootstrap CSS组件之面包屑导航(breadcrumb)
2016/12/17 Javascript
vue watch深度监听对象实现数据联动效果
2018/08/16 Javascript
vue-froala-wysiwyg 富文本编辑器功能
2019/09/19 Javascript
[02:56]《DAC最前线》之国外战队抵达上海备战亚洲邀请赛
2015/01/28 DOTA
python实现获取序列中最小的几个元素
2014/09/25 Python
编写同时兼容Python2.x与Python3.x版本的代码的几个示例
2015/03/30 Python
Python 使用SMTP发送邮件的代码小结
2016/09/21 Python
python3实现TCP协议的简单服务器和客户端案例(分享)
2017/06/14 Python
Python网络爬虫神器PyQuery的基本使用教程
2018/02/03 Python
详解TensorFlow在windows上安装与简单示例
2018/03/05 Python
python实现手机销售管理系统
2019/03/19 Python
Python配置虚拟环境图文步骤
2019/05/20 Python
在cmd中查看python的安装路径方法
2019/07/03 Python
django-rest-framework解析请求参数过程详解
2019/07/18 Python
x-ua-compatible content=”IE=7, IE=9″意思理解
2013/07/22 HTML / CSS
英国品牌男装折扣网站:Brown Bag
2018/03/08 全球购物
如何防止同一个帐户被多人同时登录
2013/08/01 面试题
长辈证婚人证婚词
2014/01/09 职场文书
董事长助理岗位职责
2014/02/18 职场文书
2014大学生职业生涯规划书最新范文
2014/09/13 职场文书
反四风对照检查材料
2014/09/22 职场文书
运动会表扬稿
2015/01/16 职场文书
小学公民道德宣传日活动总结
2015/03/23 职场文书
应急管理工作总结2015
2015/05/04 职场文书
工作态度不好检讨书
2015/05/06 职场文书
社会实践心得体会范文
2016/01/14 职场文书
react如何快速设置文件路径别名
2021/04/28 Javascript