javascript - Grammarly 如何知道红色下划线的位置?

标签 javascript html textarea shadow-dom spell-checking

我最近对 ​​LanguageTool 和 Grammarly 等工具如何在屏幕上拼写错误的单词上显示红色下划线感到着迷。我想做类似的事情,但首先在单词上显示下划线后,在单词悬停时显示丰富的弹出窗口,其中包含同义词之类的内容。

This is not about browser extensions. See the links I've included to Grammarly's SDK plugins & LanguageTool's API examples.

我知道 Grammarly 使用带槽的 Shadow DOM 来包裹文本区域,但我仍然不知道他们如何(有效地)确定文本区域中特定单词的位置。 LanguageTool 不使用 Shadow DOM。

当我检查它时,它们都不会显示克隆的 HTML,我认为他们可能是为了将文本分解为可以获取边界矩形的标记 - 但事实似乎并非如此。

使用 <grammarly-editor-plugin><textarea></textarea></grammarly-editor-plugin> 的结果 enter image description here

LanguageTool example: enter image description here

我尝试使用 Canvas API获取特定单词的尺寸,但这不足以确定它在文本区域中的位置,因为该单词可能位于比第一行更大的行上。

为了使这种方法发挥作用,他们必须获取文本区域中的所有单词,计算它们的维度,并使用文本区域的维度来确定目标单词在文本区域中的哪一行;连同单词的尺寸(特别是宽度),它们将在文本区域内具有 x 和 y 位置。然而,这似乎过于昂贵且缓慢,无法像他们的下划线所显示的那样快地实现。

我可以通过将每个单词包装在自己的范围内来使用 contenteditable,但这似乎不太理想。

还有其他人知道如何确定文本区域中单词的 X 和 Y 位置吗?

最佳答案

你让我兴奋不已,但这并不是一个很大的挑战! :(

<!DOCTYPE html>

<head>

<style>

u{color:red;}

.con{width:500px; height:100px; border:1px solid black;}

</style>

</head>

<body>

<script>

const Correct=['Once','upon','a','time','there','were','three','little','pigs'];


function CheckSpelling(){

var S=Con.innerHTML.replace(/<u\>/g,'').replace(/<\/u\>/g,'');

var A=S.split(' ');

for(let i=0; i<A.length; i++){

 if(Correct.includes(A[i])===false){A[i]='<u>'+A[i]+'</u>';}

} Con.innerHTML=A.join(' ');}


</script>

Change the words below and click spellcheck...<br><br>

<div id="Con" class="con" spellcheck="false" contenteditable="true">Once upon a time there were three little pigs</div>

<br>

<button onclick="CheckSpelling();">Check Spelling</button>

<br><br>

NB: Optionally you can automate the spellcheck by adding a oninput="CheckSpelling();" to the container.

</body>

</html>

关于javascript - Grammarly 如何知道红色下划线的位置?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/75710398/

相关文章:

javascript - 使用 bundle.config bundle 2 个具有相同名称和参数的函数的 .js 文件后会发生什么?

html - 媒体查询不生效。

php - 选择 date() HTML5 并匹配 SQL 日期

html - 如何更改调整大小 handle 的外观?

javascript - 将键盘事件与文本区域一起使用

html - 允许从 textarea 输入提交 HTML?

javascript - 按所有列标题排序

javascript - 在向链上传递 promise 的同时更改数据结果?

javascript - 通过 JavaScript 正则表达式纠正句子结构

android - 在 Bootstrap 响应式 View 中只有图片链接的一 Angular 是可点击的