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 相关文章推荐
用于节点操作的API,颠覆原生操作HTML DOM节点的API
Dec 11 Javascript
jQuery点击自身以外地方关闭弹出层的简单实例
Dec 24 Javascript
node.js中的path.dirname方法使用说明
Dec 09 Javascript
BootStrap iCheck插件全选与获取value值的解决方法
Aug 24 Javascript
文件上传的几个示例分享【推荐】
Dec 16 Javascript
如何解决vue与传统jquery插件冲突
Mar 20 Javascript
jquery动态赋值id与动态取id方法示例
Aug 21 jQuery
JS遍历DOM文档树的方法实例详解
Apr 03 Javascript
layui中使用jquery控制radio选中事件的示例代码
Aug 15 jQuery
js实现图片放大并跟随鼠标移动特效
Jan 18 Javascript
微信小程序封装多张图片上传api代码实例
Dec 30 Javascript
JS简单表单验证功能完整示例
Jan 26 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和AJAX创建RSS聚合器的代码
2007/03/13 PHP
php中ob(Output Buffer 输出缓冲)函数使用方法
2007/07/21 PHP
PHP生成指定长度随机数最简洁的方法
2014/07/14 PHP
php实现读取和写入tab分割的文件
2015/06/01 PHP
PHP中创建和验证哈希的简单方法实探
2015/07/06 PHP
PHP微信红包API接口
2015/12/05 PHP
[原创]PHP简单开启curl的方法(测试可行)
2016/01/11 PHP
PHP配合fiddler抓包抓取微信指数小程序数据的实现方法分析
2020/01/02 PHP
基于Jquery的文字自动截取(提供源代码)
2011/08/09 Javascript
jquery插件制作 自增长输入框实现代码
2012/08/17 jQuery
jQuery基础框架浅入剖析
2012/12/27 Javascript
jquery实现类似EasyUI的页面布局可改变左右的宽度
2020/09/12 Javascript
浅析AngularJS中的生命周期和延迟处理
2015/06/18 Javascript
jQuery里filter()函数与find()函数用法分析
2015/06/24 Javascript
JavaScript中style.left与offsetLeft的使用及区别详解
2016/06/08 Javascript
几种二级联动案例(jQuery\Array\Ajax php)
2016/08/13 Javascript
微信小程序实现下拉刷新和轮播图效果
2017/11/21 Javascript
解决vuejs项目里css引用背景图片不能显示的问题
2018/09/13 Javascript
利用jquery和BootStrap实现动态滚动条效果
2018/12/03 jQuery
Vue 中如何正确引入第三方模块的方法步骤
2019/05/05 Javascript
vue swipeCell滑动单元格(仿微信)的实现示例
2020/09/14 Javascript
JavaScript获取时区实现过程解析
2020/09/24 Javascript
vant组件中 dialog的确认按钮的回调事件操作
2020/11/04 Javascript
Python多线程编程(二):启动线程的两种方法
2015/04/05 Python
Python装饰器使用实例:验证参数合法性
2015/06/24 Python
python实现分页效果
2017/10/25 Python
python自动12306抢票软件实现代码
2018/02/24 Python
Python实现多态、协议和鸭子类型的代码详解
2019/05/05 Python
python GUI库图形界面开发之PyQt5窗口类QMainWindow详细使用方法
2020/02/26 Python
Python 如何批量更新已安装的库
2020/05/26 Python
艺术设计专业个人求职信
2013/09/21 职场文书
双创工作实施方案
2014/03/26 职场文书
乱世佳人观后感
2015/06/08 职场文书
大学军训通讯稿
2015/07/18 职场文书
2019年度行政文员工作计划范本!
2019/07/04 职场文书
2019新员工试用期转正申请书3篇
2019/08/13 职场文书