- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
新的预测类型特征 Smart Compose Gmail 非常有趣。
假设我们想自己实现这样的功能:
如何
并且在它后面以灰色显示是你吗?
。例子:
可以使用带有 Javascript 的 textarea
来实现吗?
如果没有,如何实现?
最佳答案
我之前的回答被删除了,所以这里有一个更好的尝试来解释我是如何在某种程度上复制 Smart Compose 的。我的回答只关注相关方面。参见 https://github.com/jkhaui/predictable获取代码。
我们在我们的解决方案中使用 vanilla js 和 contenteditable(就像 Gmail 一样)。我使用 create-react-app 和 Medium-Editor 引导我的示例,但 React 和 Medium-Editor 都不是必需的。
我们有一个“建议”数据库,它可以是一组单词或短语。出于我们的目的,在我的示例中,我使用了一个包含 50,000 多个常用英语短语的静态数组。但是您可以很容易地看到这可以如何替代动态数据源 - 例如 Gmail 如何使用其神经网络 API 来根据用户电子邮件的当前上下文提供建议:https://ai.googleblog.com/2018/05/smart-compose-using-neural-networks-to.html
Smart Compose 使用 JavaScript 插入 <span></span>
当它检测到要建议的短语时,紧跟在您正在写的单词之后的元素。 span 元素仅包含尚未输入的建议字符。
例如假设您写了“嗨,怎么样”,然后出现了一条建议。假设整个建议是“你今天过得怎么样”。在这种情况下,建议在跨度内呈现为“re you going today”。如果您继续在占位符中键入字符 - 例如“嗨,你好吗” - 那么跨度的文本内容会动态变化 - 这样“ng today”现在就是跨度内的文本。
我的解决方案略有不同,但实现了相同的视觉效果。不同之处在于我无法弄清楚如何在用户当前文本附近插入一个内联跨度并动态改变跨度的内容以响应用户的输入。因此,相反,我选择了包含建议的覆盖元素。现在的诀窍是将覆盖容器准确定位在最后键入的单词(将呈现建议的位置)上。这提供了与内联预输入建议相同的视觉效果。
我们通过计算最后输入的单词的左上角坐标来实现覆盖层的正确定位。然后,使用 JavaScript,我们耦合覆盖容器的顶部和左侧 CSS 属性,以便它们始终与最后一个单词的坐标匹配。棘手的部分是首先获取这些坐标。一般步骤是:
window.getSelection().anchorNode.data.length
它检索用户正在写入的当前文本节点并返回其长度,这是计算最后一个单词在其父元素中的偏移量所必需的(在以下步骤中解释)。父节点的文本长度 - 当前文本节点的(即最后一个单词的)文本长度 = 最后一个文本节点在其 contenteditable 父节点中的偏移位置。
现在我们有了最后一个单词的偏移量,我们可以使用各种range
在最后一个单词之前插入一个 span 元素的方法:https://developer.mozilla.org/en-US/docs/Web/API/Range
shadowNode
.在心理上,您现在可以将 DOM 想象成这样:我们有用户的文本内容,并且我们有一个 shadowNode 放置在最后一个单词的位置。getBoundingClientRect
在返回特定元数据的 shadowNode 上,包括我们所追求的顶部和左侧坐标。关于javascript - 如何构建类似 Gmail 的 Smart Compose?可能在文本区域?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53374806/
只是出于好奇,我想知道gmail是如何做到的。查看页面源代码后,您看不到任何链接、onclick 方法和 javascript。我知道他们隐藏了 javascript,但页面仍然知道有点击。是否有一个
最近谷歌宣布,出于安全目的,Gmail 将使用代理加载外部图像。这导致我的应用程序在 Gmail 中显示图像时出现问题。 Gmail图片元素检查: https://ci5.googleusercont
我想将节点脚本作为 cronjob 运行,它使用 Gmail 的 API 来轮询我拥有的 gmail 帐户。 我关注 these quickstart instructions : 我被困在第一步。在
如果您在 Gmail 上处于非事件状态,则通过一段时间不移动鼠标,您的聊天状态会更改为橙色,这意味着空闲。但是当您再次开始移动鼠标时,它会变回绿色,表示处于事件状态。它如何知道您何时移动鼠标? 最佳答
您知道,当您加载 GMail 时,左侧会显示“撰写邮件”、“收件箱”、“已发送邮件”等吗?我在页面源代码中搜索了“撰写邮件”,但一无所获。 最佳答案 Gmail 界面使用 JavaScript 动态加
我正在创建一个函数,使用 Google 的 API 从一个人的 gmail 帐户导入联系人。但是我知道许多企业注册 Google 是为了拥有更专业的域名(例如 some_name@bislr.com)
我可以通过桌面应用程序使用 Gmail API 成功读取我的收件箱内容。但是,当我尝试阅读其他人的 gmail 收件箱时,我收到 Delegation denied 异常? 所以我的问题是,Gmail
我已经读到我可以使用 gmail atom 提要从谷歌创建的“内置”标签中获取邮件。 但是当我尝试从“已读”标签获取邮件时,使用 https://mail.google.com/mail/feed/a
通过 Gmail API 发送到 Gmail 地址的邮件在 Gmail 中被标记为“小心处理此邮件。它包含通常用于窃取个人信息的内容。” 该消息基本上只是说测试。并且通过 Gmail SMTP 发送的
编辑 :解决下面的第一条评论,为清楚起见,这不是代码问题。问题很简单: 我应该在新 Gmail UI 的 URI 查询字符串中输入什么来查看 Gmail API 创建的草稿邮件? 尽管这并不是一个真正
我是谷歌产品的新手。我打算开始在 gmail 中添加一些东西。使用类似于 Add on 的 Add on 或 chrome Gmail Extension 更好吗?如果是add-on,我们不能直接在s
使用标准查询格式时,Gmail api 和 Gmail Web ui 的结果有所不同,如下所述 - https://support.google.com/mail/answer/7190 . 该问题专
我正在尝试创建一个 PHP 应用程序,它将自动设置用户的电子邮件签名。这部分有效,我可以为用户设置签名。 我的问题是我在 SendAs 设置中找不到任何选项,该选项将禁用 GMail 中签名前插入的两
我的电子邮件标记通过了电子邮件标记测试器,我尝试了 JSON-LD 和微数据,但无论如何 - 我只是看不到标记在 Gmail (iOS) 客户端中的任何效果。 即使是 Google 自己文档中的基本示
我目前正在使用 Gmail 实验室功能 - canned responses.我有很多这样的预设回复并使用 their menu找到合适的,证明是耗时的。通过以下方式找到预设响应会更容易: 将预设回复
请问是否可以在我的 Gmail 状态中发布倒计时? 像“01:44:15:23”及其不断递减。 最佳答案 发现一个好 article to share : Google Talk 使用 XMPP 那么
我开发了一个上下文小工具并将其安装在我的域中。它在我的域中运行良好,但在我的域之外无法正常工作。如何在我的域外访问我的小工具? 最佳答案 您指的是您的 Google Apps 域吗?根据 Google
我在 this guide 之后配置了推送通知并在调用 watch 时端点我得到大约一周的到期时间。 在此期间,我希望收到有关我已配置的 Pub/Sub 主题的通知,而无需调用 watch。在到期日期
是否有可以在 gmail 中捕获的 API 或事件,以便我可以启动工作流甚至触发 python 脚本。 我正在尝试自动化一项工作,该工作将从已到达 gmail 的电子邮件中提取 csv 附件。然后它会
为什么网络版的 Gmail 会在不使用 = 标记中断位置的情况下对邮件内容进行换行,这使得电子邮件处理变得非常困难: 查看gmail发送的原始邮件内容: 这封由 Mac OS X Mail 发送的邮件
我是一名优秀的程序员,十分优秀!