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的button默认enter事件(回车事件)。
May 18 Javascript
js通过iframe加载外部网页的实现代码
Apr 05 Javascript
javascript中scrollTop详解
Apr 13 Javascript
跟我学习javascript的循环
Nov 18 Javascript
简单谈谈关于Angular Cli打包的事
Sep 05 Javascript
帝国cms首页列表页实现点赞功能
Oct 30 Javascript
讲解vue-router之什么是动态路由
May 28 Javascript
详解微信小程序中组件通讯
Oct 30 Javascript
JavaScript 格式化数字、金额、千分位、保留几位小数、舍入舍去
Jul 23 Javascript
微信小程序开发(一):服务器获取数据列表渲染操作示例
Jun 01 Javascript
vue2.0实现列表数据增加和删除
Jun 17 Javascript
为什么推荐使用JSX开发Vue3
Dec 28 Vue.js
深入浅析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中XMLHttpRequest(Ajax)不能设置自定义的Referer的解决方法
2011/11/26 PHP
PHP 杂谈《重构-改善既有代码的设计》之四 简化条件表达式
2012/04/09 PHP
php生成不重复随机数、数组的4种方法分享
2015/03/30 PHP
php对象和数组相互转换的方法
2015/05/12 PHP
替换php字符串中的单引号为双引号的方法
2017/02/16 PHP
PHP中PCRE正则解析代码详解
2019/04/26 PHP
php实现获取近几日、月时间示例
2019/07/06 PHP
ExtJS 工具栏 分页事件参数
2010/03/05 Javascript
jquery uploadify 在FF下无效的解决办法
2014/09/26 Javascript
AngularJS中取消对HTML片段转义的方法例子
2015/01/04 Javascript
JS实现网页每隔3秒弹出一次对话框的方法
2015/11/09 Javascript
javascript css红色经典选项卡效果实现代码
2016/05/17 Javascript
bootstrap手风琴折叠示例代码分享
2017/05/22 Javascript
vue.js的手脚架vue-cli项目搭建的步骤
2017/08/30 Javascript
angularjs实现猜数字大小功能
2020/05/20 Javascript
angularjs实现猜大小功能
2017/10/23 Javascript
让你5分钟掌握9个JavaScript小技巧
2018/06/09 Javascript
jQuery实现鼠标滑动切换图片
2020/05/27 jQuery
JavaScript 闭包的使用场景
2020/09/17 Javascript
js实现拖拽与碰撞检测
2020/09/18 Javascript
[01:05:07]DOTA2-DPC中国联赛 正赛 DLG vs Dragon BO3 第一场2月1日
2021/03/11 DOTA
Python中异常重试的解决方案详解
2017/05/05 Python
Python实现脚本锁功能(同时只能执行一个脚本)
2017/05/10 Python
python opencv旋转图像(保持图像不被裁减)
2018/07/26 Python
Python3实现定时任务的四种方式
2019/06/03 Python
Hotels.com香港酒店网:你的自由行酒店订房专家
2018/01/22 全球购物
澳大利亚网上买书:Angus & Robertson
2019/07/21 全球购物
千元咖啡店的创业计划书范文
2013/12/29 职场文书
水毁工程实施方案
2014/04/01 职场文书
学生上课说话检讨书
2014/10/25 职场文书
2014年小学美术工作总结
2014/12/20 职场文书
初中作文评语
2014/12/25 职场文书
2015年档案室工作总结
2015/05/23 职场文书
导游词之云南-元阳梯田
2019/10/08 职场文书
python基础入门之字典和集合
2021/06/13 Python
分享Python异步爬取知乎热榜
2022/04/12 Python