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 相关文章推荐
javascript学习笔记(十七) 检测浏览器插件代码
Jun 20 Javascript
js如何获取file控件的完整路径具体实现代码
May 15 Javascript
javascript 获取模态窗口的滚动位置代码
Aug 06 Javascript
JavaScript中访问节点对象的方法有哪些如何使用
Sep 24 Javascript
Javascript Objects详解
Sep 04 Javascript
JS模拟酷狗音乐播放器收缩折叠关闭效果代码
Oct 29 Javascript
如何防止JavaScript自动插入分号
Nov 05 Javascript
又一款MVVM组件 构建自己的Vue组件(2)
Mar 13 Javascript
vue.js事件处理器是什么
Mar 20 Javascript
vue 组件中添加样式不生效的解决方法
Jul 06 Javascript
Vue脚手架编写试卷页面功能
Mar 17 Javascript
react PropTypes校验传递的值操作示例
Apr 28 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
日本十大惊悚动漫
2020/03/04 日漫
thinkphp中ajax与php响应过程详解
2014/12/08 PHP
smarty表格换行实例
2014/12/15 PHP
WordPress中获取指定分类及其子分类下的文章数目
2015/12/31 PHP
PHP的AES加密算法完整实例
2016/07/20 PHP
PDO的安全处理与事物处理方法
2016/10/31 PHP
可以显示单图片,多图片ajax请求的ThickBox3.1类下载
2007/12/23 Javascript
Javascript string 扩展库代码
2010/04/09 Javascript
js特殊字符转义介绍
2013/11/05 Javascript
JavaScript实现删除,移动和复制文件的方法
2015/08/05 Javascript
JS获取月份最后天数、最大天数与某日周数的方法
2015/12/08 Javascript
HTML5 实现的一个俄罗斯方块实例代码
2016/09/19 Javascript
原生js仿jquery一些常用方法(必看篇)
2016/09/20 Javascript
node.js+captchapng+jsonwebtoken实现登录验证示例
2017/08/17 Javascript
Three.js实现浏览器变动时进行自适应的方法
2017/09/26 Javascript
JS获取当前地理位置的方法
2017/10/25 Javascript
vue实现分环境打包步骤(给不同的环境配置相对应的打包命令)
2019/06/04 Javascript
vue学习之Vue-Router用法实例分析
2020/01/06 Javascript
Vue自定义表单内容检查rules实例
2020/10/30 Javascript
python在命令行下使用google翻译(带语音)
2014/01/16 Python
将Python代码打包为jar软件的简单方法
2015/08/04 Python
利用python获取某年中每个月的第一天和最后一天
2016/12/15 Python
Python matplotlib绘图可视化知识点整理(小结)
2018/03/16 Python
Python实现合并同一个文件夹下所有txt文件的方法示例
2018/04/26 Python
对Python subprocess.Popen子进程管道阻塞详解
2018/10/29 Python
python感知机实现代码
2019/01/18 Python
Python matplotlib绘制饼状图功能示例
2019/09/10 Python
Python库安装速度过慢解决方案
2020/07/14 Python
pycharm激活方法到2099年(激活流程)
2020/09/22 Python
7款设计巧妙的css3飘带状3D立体效果的导航菜单和表单窗口
2013/02/04 HTML / CSS
任课老师推荐信范文
2013/11/24 职场文书
三年级班级文化建设方案
2014/05/04 职场文书
暑假社会实践心得体会
2014/09/02 职场文书
2014年环保工作总结
2014/11/26 职场文书
2015-2016年小学教导工作总结
2015/07/21 职场文书
Pandas搭配lambda组合使用详解
2022/01/22 Python