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打开新窗口同时关闭旧窗口
Jan 16 Javascript
Js从头学起(基本数据类型和引用类型的参数传递详细分析)
Feb 16 Javascript
判断多个input type=file是否有已经选择好文件的代码
May 23 Javascript
jquery实现textarea输入字符控制(仿微博输入控制字符)
Apr 26 Javascript
JavaScript中模拟实现jsonp
Jun 19 Javascript
jQuery zTree加载树形菜单功能
Feb 25 Javascript
js实现上一页下一页的效果【附代码】
Mar 10 Javascript
jQuery事件的绑定、触发、及监听方法简单说明
May 10 Javascript
微信小程序 页面传参实例详解
Nov 16 Javascript
微信小程序 利用css实现遮罩效果实例详解
Jan 21 Javascript
JavaScript运动框架 多值运动(四)
May 18 Javascript
Vue插值、表达式、分隔符、指令知识小结
Oct 12 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 常见郁闷问题答解
2006/11/25 PHP
fleaphp crud操作之findByField函数的使用方法
2011/04/23 PHP
PHP中strtr字符串替换用法详解
2014/11/26 PHP
PHP+iframe图片上传实现即时刷新效果
2016/11/18 PHP
Zend Framework入门教程之Zend_Db数据库操作详解
2016/12/08 PHP
php反射学习之依赖注入示例
2019/06/14 PHP
教你在heroku云平台上部署Node.js应用
2014/07/30 Javascript
将数字转换成大写的人民币表达式的js函数
2014/09/21 Javascript
jQuery及JS实现循环中暂停的方法
2015/02/02 Javascript
在Javascript中处理数组之toSource()方法的使用
2015/06/09 Javascript
跟我学习javascript的函数和函数表达式
2015/11/16 Javascript
js与jQuery实现checkbox复选框全选/全不选的方法
2016/01/05 Javascript
基于javascript html5实现3D翻书特效
2016/03/14 Javascript
详解自定义ajax支持跨域组件封装
2018/02/08 Javascript
详解关于vue-area-linkage走过的坑
2018/06/27 Javascript
使用 electron 实现类似新版 QQ 的登录界面效果(阴影、背景动画、窗体3D翻转)
2018/10/23 Javascript
VUE.CLI4.0配置多页面入口的实现
2019/11/25 Javascript
这样回答继承可能面试官更满意
2019/12/10 Javascript
为什么JavaScript中0.1 + 0.2 != 0.3
2020/12/03 Javascript
[05:01]3.19DOTA2发布会 我们都是刀塔人
2014/03/25 DOTA
[05:53]敌法师的金色冠名ID"BurNIng",是传说,是荣耀
2020/07/11 DOTA
[01:50:49]DOTA2-DPC中国联赛 正赛 PSG.LGD vs Aster BO3 第三场 1月24日
2021/03/11 DOTA
python处理xml文件的方法小结
2017/05/02 Python
python+pyqt实现12306图片验证效果
2017/10/25 Python
Tensorflow中的placeholder和feed_dict的使用
2018/07/09 Python
python 文件转成16进制数组的实例
2018/07/09 Python
标签和贴纸印刷:Lightning Labels
2018/03/22 全球购物
俄罗斯宠物用品网上商店:ZooMag
2019/12/12 全球购物
初中生自我鉴定
2014/02/04 职场文书
食品安全标语
2014/06/07 职场文书
房地产资料员岗位职责
2014/07/02 职场文书
整改报告格式
2014/11/06 职场文书
爱国主义影片观后感
2015/06/18 职场文书
医院见习总结
2015/06/24 职场文书
Jpa Specification如何实现and和or同时使用查询
2021/11/23 Java/Android
Nginx 安装SSL证书完成HTTPS部署
2022/04/28 Servers