在input光标处插入内容,并解决TS报错

在input或者textarea的光标处插入内容,如果是键盘输入倒是好说,直接把光标定位过去,键盘打字就可以了;如果在光标处插入内容呢,稍微费点事,倒是不是问题;但ts总是希望把一切弄得规范一些,所以正常写不行,需要加一些内容规范起来,这一小节,我们来看一下。

目录

1 在input光标插入内容

2 TS报错解决

2.1 报错信息 'inputBox' is possibly 'null'.ts

2.2 报错信息  Property 'selectionStart' does not exist on type 'HTMLElement'.ts

2.3  报错信息 'cursorPosition' is possibly 'null'.ts

3 使用ts的好处 


1 在input光标插入内容

例如我们有一个输入框,id定义为 inputBox ,有个按钮,调用一个方法insertText(),代码可以这样写:

<!-- HTML部分 -->
<input type="text" id="inputBox" value="ABCDE">
<button onclick="insertText()">插入文本</button>// javascript部分
function insertText() {var inputBox = document.getElementById("inputBox"); // 获取输入框元素var text = "好"; // 要插入的文本var cursorPosition = inputBox.selectionStart; // 获取光标位置var textBeforeCursor = inputBox.value.substring(0, cursorPosition); // 获取光标前的文本var textAfterCursor = inputBox.value.substring(cursorPosition); // 获取光标后的文本var newText = textBeforeCursor + text + textAfterCursor; // 组合新的文本inputBox.value = newText; // 更新输入框的值
}

这里的本质就是实用input组件的 selectionStart 属性来获取当前光标的位置,或者是索引,很简单。

2 TS报错解决

2.1 报错信息 'inputBox' is possibly 'null'.ts

这里说的是inputBox 这个DOM元素,很可能是获取不到的,就会是空,会是null,这在后续的代码中就会带来一些意想不到的问题,所以,我们后续在使用inputBox的时候,应该添加判断,要求inputBox一定是存在的,才能继续向下执行

function insertText() {var inputBox = document.getElementById("inputBox"); // 获取输入框元素if (inputBox) {var text = "好"; // 要插入的文本var cursorPosition = inputBox.selectionStart; // 获取光标位置var textBeforeCursor = inputBox.value.substring(0, cursorPosition); // 获取光标前的文本var textAfterCursor = inputBox.value.substring(cursorPosition); // 获取光标后的文本var newText = textBeforeCursor + text + textAfterCursor; // 组合新的文本inputBox.value = newText; // 更新输入框的值}
}

2.2 报错信息  Property 'selectionStart' does not exist on type 'HTMLElement'.ts

这是因为 TypeScript 类型系统并不知道 <input> 元素具有 selectionStartselectionEnd 这些属性。要解决这个问题,你可以将输入框的类型声明为 HTMLInputElement,因为这个类型包含了这些属性。修改后的代码为:

function insertText() {var inputBox = document.getElementById("inputBox") as HTMLInputElement;; // 获取输入框元素if (inputBox) {var text = "好"; // 要插入的文本var cursorPosition = inputBox.selectionStart; // 获取光标位置var textBeforeCursor = inputBox.value.substring(0, cursorPosition); // 获取光标前的文本var textAfterCursor = inputBox.value.substring(cursorPosition); // 获取光标后的文本var newText = textBeforeCursor + text + textAfterCursor; // 组合新的文本inputBox.value = newText; // 更新输入框的值}
}

2.3  报错信息 'cursorPosition' is possibly 'null'.ts

这里呢,他又担心获取到的cursorPosition值是空,会是null,那这样后续再利用它获取光标的位置就又可能报错了,所以继续修改代码为

function insertText() {var inputBox = document.getElementById("inputBox") as HTMLInputElement;; // 获取输入框元素if (inputBox) {var text = "好"; // 要插入的文本var cursorPosition = inputBox.selectionStart || 0; // 获取光标位置var textBeforeCursor = inputBox.value.substring(0, cursorPosition); // 获取光标前的文本var textAfterCursor = inputBox.value.substring(cursorPosition); // 获取光标后的文本var newText = textBeforeCursor + text + textAfterCursor; // 组合新的文本inputBox.value = newText; // 更新输入框的值}
}

3 使用ts的好处 

通过这么简简单单的一小段代码,就发现了那么多可能会出现的问题,可以说使用ts,能够规避非常多因为JS弱类型,或者是不确定值所带来的问题,使用ts的好处可见一斑。但缺点也有,你越着急写代码,它越给你报错,你越不熟悉,它问题越多。

这还不是重点,重点是你用了ts,团队都熟练使用了,加班还是少不了,线上问题还是一样的出,复盘的时候一个个的都很懂,结果下次还是外甥打灯笼。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/10255.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Codeforces Round 134 (Div. 1) A. Ice Skating (并查集)

Ice Skating 题面翻译 Description 给出n个点的横纵坐标&#xff0c;两个点互通当且仅当两个点有相同的横坐标或纵坐标&#xff0c;问最少需要加几个点才能使得所有点都两两互通 Input 第一行一个整数n表示点数&#xff0c;之后n行每行两个整数x[ i ]和y[ i ]表示第i个点的…

关于Windows驱动中DPC同步的一些见解说明

DPC会被分配到不停的CPU核心上,如果分配到同一个核心,那么DPC是串行的,如果分配到不同的CPU核心上,那么DPC是并行的,但如果设置WDF_OBJECT_ATTRIBUTES的SynchronizationScope属性为WdfSynchronizationScopeDevice,那么即便CPU有多核,DPC也不会在不同的核心上并发,因为系…

零基础HTML教程(32)--HTML5语义化标签

文章目录 1. div时代2. div的缺点3. 语义化标签4. 语义化标签有哪些5. 实战演练6. 小结 1. div时代 我是2009年开始学习网页开发的&#xff0c;那时候HTML里面到处是div。 这么说吧&#xff0c;那时候div就是网页的骨架&#xff0c;支撑着网页的主结构。 2. div的缺点 div作…

使用J-Link Commander / JFlash 烧写固件程序(以STM32F103C8T6为例)

使用JFlash 烧写流程 运行JFlash, 点击Project Settings 配置Jlink为SWD方式,选择连接设备为STM32F103C8T6, 点击确定. 选择要烧录的Bin文件 设置bin文件烧录地址, 点击OK(地址要在0x08000000-0x0800FFFF范围内) Note : STM32F103C8T6 Flash大小为 64KB&#xff0c; 地址范围…

速盾可以防御的攻击类型是否会随着技术的发展而不断变化?

随着技术的发展&#xff0c;网络攻击的形式也在不断演变。因此&#xff0c;速盾作为一种网络安全防护技术&#xff0c;也需要不断更新和改进&#xff0c;以应对新的攻击类型。本文将从技术发展的角度探讨速盾如何应对不断变化的攻击类型。 首先&#xff0c;随着技术的进步&…

Vuex,在 Vue 组件中监听 Vuex 状态变化,使用watch监听Vuex中的数据

简介&#xff1a;在Vue应用程序中使用Vuex进行状态管理时&#xff0c;经常需要在组件中响应状态的变化。这里来记录一下 一. 在使用 Vuex 进行状态管理时&#xff0c;我们经常需要在组件中响应状态的变化。Vue 提供了两种方式来实现这一点&#xff1a;computed 属性和 watch 选…

重生奇迹mu再生宝石怎么用有什么用

重生奇迹mu再生宝石有2个用处&#xff1a; 1、在玛雅哥布林处给380装备加PVP属性4追4以上的380级装备,守护宝石一颗,再生宝石一颗,成功得到PVP装备,失败宝石消失,装备无变化&#xff1b; 2、给非套装点强化属性用法跟祝福,灵魂,生命一样直接往装备上敲,成功得到随机强化属性一…

八. Django项目之电商购物商城 -- 添加邮箱

Django项目之电商购物商城 – 添加邮箱 一. 用户中心 添加邮箱功能在用户中心中 , 先完善用户中心功能 1. 视图 # 用户中心 class UserInfoCenterView(LoginRequiredMixin,View):def get(self , request):context {username : request.user.username,mobile : request.use…

队列的实现以及队列如何实现栈

一、队列的定义 队列&#xff1a;只允许在一端进行插入数据操作&#xff0c;在另一端进行删除数据操作的特殊线性表&#xff0c;队列具有先进先出 FIFO(First In First Out) 入队列&#xff1a;进行插入操作的一端称为 队尾 出队列&#xff1a;进行删除操作的一端称为 队头 …

20240507 ubuntu20.04+ros noetic 跑通lioslam

任务&#xff1a;跑通lioslam 主要参考博客 IMU激光雷达融合使用LIO-SAM建图学习笔记——详细、长文、多图、全流程_ubuntu_AIDE回归线-GitCode 开源社区 (csdn.net) 1.不要用这一句 wget -O ~/Downloads/gtsam.zip https://github.com/borglab/gtsam/archive/4.0.0-alpha2…

【Spring】初识 Spring AOP(面向切面编程)

目录 1、介绍AOP 1.1、AOP的定义 1.2、AOP的作用 1.3、AOP的核心概念及术语 2、AOP实现示例 3、EnableAspectJAutoProxy注解 1、介绍AOP 1.1、AOP的定义 AOP&#xff08;Aspect Orient Programming&#xff09;&#xff0c;直译过来就是面向切面编程&#xff0c;AOP 是一…

Windows Python 安装准备

首先安装配置 1. 环境的安装和配置: 运行环境: 官方提供了cpython解释器 编辑环境: 课程初级阶段:推荐大家使用: 记事本工具(UE、notepad++、editplus、sublime、vscode) 中期阶段IDE的使用,pycharm 2. 安装python环境: 在官方下载python解释器 www.python.org …

Ubuntu18.04--虚拟机配置Samba并从Windows登录

前言&#xff1a; 本文记录我自己在Windows上安装 Virtualbox &#xff0c;并在Virtualbox中安装 Ubuntu-18.04 虚拟机&#xff0c;在Ubuntu-18.04虚拟机里安装配置Smaba服务器&#xff0c;从 Windows 宿主系统上访问虚拟机共享samba目录的配置命令。 引用: N/A 正文 虚拟…

[C++][数据结构]哈希3:unordered_map和unordered_set的模拟实现

前言 今天我们来试着用哈希封装一下unordered_map和unordered_set这两个容器 由于主要的哈希的模拟实现都在之前的文章中&#xff0c;所以本文只是对于几个小问题进行说明 KeyOfT&#xff1a;取出key 因为我们传的第二个模板参数是T&#xff0c;我们不知道他是key还是pair&l…

Three.js的材质Material信息

Material材质信息,是独立于物体顶点之外,与渲染效果相关的属性。比如通过设置材质可以改变物体的颜色、纹理贴图、光照模式等等。 基本材质【BasicMaterial】 基本材质BasicMaterial的物体,颜色不会因为光照产生明暗、阴影效果。如果没有指定的材质颜色,那么颜色就是随机…

协同过滤的一些理解

协同过滤的一些理解 以下是我对协同过滤的一些理解&#xff0c;欢迎来交。 什么是协同过滤 协同过滤&#xff1a;利用相似用户的行为或相似商品的特征来进行推荐。 协同过滤&#xff08;Collaborative Filtering, CF&#xff09;是推荐系统中一种常用的技术&#xff0c;它基于…

揭秘LLMOps,高效开发大型语言模型

大家好&#xff0c;随着人工智能&#xff08;AI&#xff09;的蓬勃发展&#xff0c;一个新兴领域语言模型运维&#xff08;LLMOps&#xff09;正逐渐成为关注的焦点。LLMOps专注于对大型语言模型&#xff08;LLMs&#xff09;&#xff0c;例如OpenAI的GPT系列&#xff0c;进行全…

SpringBoot Actuator未授权访问漏洞的解决方法

1. 介绍 Spring Boot Actuator 是一个用于监控和管理 Spring Boot 应用程序的功能模块。它提供了一系列生产就绪的功能&#xff0c;帮助你了解应用程序的运行状况&#xff0c;以及在运行时对应用程序进行调整。Actuator 使用了 Spring MVC 来暴露各种 HTTP 或 JMX 端点&#x…

【机器学习】卷积神经(CNN)在图像识别中的革命性应用:自动驾驶的崛起

卷积神经网络&#xff08;CNN&#xff09;在图像识别中的革命性应用&#xff1a;自动驾驶的崛起 一、卷积神经网络&#xff08;CNN&#xff09;的基本原理二、CNN在图像识别中的显著成果三、CNN在自动驾驶汽车中的物体检测和识别四、CNN在图像识别中的代码实例 随着人工智能和深…

轮式机器人简介

迄今为止,轮子一般是移动机器人学和人造交通车辆中最流行的运动机构。它可达到很高的效率, 如图所示, 而且用比较简单的机械就可实现它的制作。 另外,在轮式机器人设计中,平衡通常不是一个研究问题。 因为在所有时间里,轮式机器人一般都被设计成在任何时间里所有轮子均与地接…