问 AI 一个 contenteditable 的问题半天没答案

问题

当你有一个 contentEditabletrue 的元素,在按顺序点击 Enter 时,获取到的 innerText 是正常的:

html 复制代码
<div class="code-editor" contenteditable="true" data-placeholder="Start typing your code here...">
	1
	<div>2</div>
	<div>3</div>
</div>

上面的 innerText'1\n2\n3'

但是!当你输入 1、Enter、2,然后按方向键↑,然后再输入 Enter,元素则会变成这样:

html 复制代码
<div class="code-editor" contenteditable="true" data-placeholder="Start typing your code here...">
	1
	<div>
		<br />
		<div>2</div>
	</div>
</div>

根据肉眼观察,你得到的应该是 '1\n\n2',但是实际上,通过 innerText 得到的是 '1\n\n\n2'。(顺带一提,当你在这个元素里面全选复制,拿到的是正常的 '1\n\n2'

我拿着这问题问了两个 AI,结果都在胡扯。首先它们就猜不对第二段 HTML 输出的 innerText,它们的答案都是很符合直觉的 '1\n\n2'。其实这个时候就已经凉了一大半了,接着我强行告诉它第二个结构的输出,问这种情况怎么获得正常的 \n,结果教我用正则去除重复两次以上的 \n,但实际上用户就是有可能多次 Enter,显然无效。

在习惯了 AI 时代的我最后才想起返璞归真,去 stackoverflow 上找答案,结果是,十分高效,立刻就找到了。

解 1

ts 复制代码
contentEditable = "plaintext-only";

暴力 plaintext-only,设置之后修改内容只会插入 <br>,不会插入 <div>。缺点自然是如果你在粘贴富文本时会强制转为纯文本。

解 2

contenteditable 添加 display:inline-block;。可以说正常来说你根本想不到,也很难找到资料推理出向 contenteditable 添加 display:inline-block; 就能做到让用户输入不再插入 <div>

解 3

ts 复制代码
document.addEventListener("keydown", (event) => {
	if (event.key === "Enter") {
		document.execCommand("insertLineBreak");
		event.preventDefault();
	}
});

在用户 Enter 时直接 preventDefault,用 execCommand 手动帮用户插入 \n。这个方法倒是"可以想象",execCommand 确实是一个神奇的函数,只可惜我还没了解它,它就已经处于弃用状态,也不知道有什么替代方案。

结语

关键时刻,还得是 stackoverflow,AI 问半天都是错的,太偏门的问题 AI 只会给你幻觉,歇歇吧。不要小看在 stackoverflow 积累的真正的人的智能 😏

顺便这个问题是在实现 AI 提醒的时候遇到的,顺道还遇到了些 CSS 问题,例如两个叠在一起元素明明行高是一样的,但是用 \n 换行的那个元素偏偏总比 contentEditable 的元素高一点,问 AI 同样没结果,最后乱搞 CSS 碰巧解决了......JavaScript 是挺简单的,但是 CSS 和浏览器接口,真的好难啊!

参考

相关推荐
华玥作者2 小时前
[特殊字符] VitePress 对接 Algolia AI 问答(DocSearch + AI Search)完整实战(下)
前端·人工智能·ai
Mr Xu_3 小时前
告别冗长 switch-case:Vue 项目中基于映射表的优雅路由数据匹配方案
前端·javascript·vue.js
前端摸鱼匠3 小时前
Vue 3 的toRefs保持响应性:讲解toRefs在解构响应式对象时的作用
前端·javascript·vue.js·前端框架·ecmascript
sleeppingfrog3 小时前
zebra通过zpl语言实现中文打印(二)
javascript
lang201509283 小时前
JSR-340 :高性能Web开发新标准
java·前端·servlet
好家伙VCC4 小时前
### WebRTC技术:实时通信的革新与实现####webRTC(Web Real-TimeComm
java·前端·python·webrtc
未来之窗软件服务4 小时前
未来之窗昭和仙君(六十五)Vue与跨地区多部门开发—东方仙盟练气
前端·javascript·vue.js·仙盟创梦ide·东方仙盟·昭和仙君
baidu_247438614 小时前
Android ViewModel定时任务
android·开发语言·javascript
嘿起屁儿整5 小时前
面试点(网络层面)
前端·网络
VT.馒头5 小时前
【力扣】2721. 并行执行异步函数
前端·javascript·算法·leetcode·typescript