通过 chrome 扩展程序将文本粘贴/编辑到文本字段中(内容脚本)

Pasting/Editing text into a text field through the chrome extension (content script)

提问人:Alex Oleksenko 提问时间:10/25/2023 更新时间:10/25/2023 访问量:54

问:

我制作了一个具有内容脚本部分和弹出部分的 chrome 扩展程序。 在内容脚本中,我检查了聚焦的 textarea(或者它可以是带有 role=“textbox” 和 contenteditable=“true” 的聚焦 div)。

我添加了一个带有图标的 div,因此图标将位于右下角。我想做这样的功能:

用户单击图标 - 文本字段中的内容被删除,我在那里粘贴新内容。

它似乎是 Grammarly 及其工作原理。 但是粘贴或编辑文本字段存在问题。主要有两个原因:

  1. execCommand()已弃用,我不想使用它,但是它在文本字段的情况下效果很好。
  2. 文本字段有不同的实现方式,例如,以下是 Instagram 和 Facebook 如何模拟标签:

在此处输入图像描述

或 Outlook:在此处输入图像描述

在默认情况下一切都很好,我可以使用方法通过我的代码对其进行编辑,它也适用于 outlook,我只是这样做:execCommand()

// $textbox is an element founded by jquery

    $textbox.empty();
    $textbox.html(responseMessage);

但是对于 instagram,我尝试了相同的方法,甚至我粘贴了一个与那里相同的类的子元素,但它根本不起作用:

      const $allP = $textbox.find('p');
      $allP.remove();

// I append the same element that was in Instagram text field with my text
      $textbox.append(
        `<p class="xdj266r x11i5rnm xat24cr x1mh8g0r">
          <span data-lexical-text="true">
            ${responseMessage}
          </span>
        </p>`
      );

另外,我尝试通过以下代码删除现有的子元素:

   while (textbox.firstChild) {
     textbox.removeChild(textbox.firstChild);
   }

   textbox.appendChild(elementWithMyText)

此外,我还尝试制作键盘快捷键事件,例如 ctr + a 和 ctr + x。然后调度这个事件来制作有效的全球 shorcuts,但这也没有奏效。

jQuery 事件 google-chrome-extension textarea 键盘快捷键

评论

0赞 wOxxOm 10/25/2023
execCommand 是最可靠的方法。弃用通知还为时过早,因为替代 API 仍在设计中,可能需要 5-10 年才能实现。请注意,使用 execCommand 时必须首先聚焦元素,例如contenteditable
0赞 Alex Oleksenko 10/25/2023
谢谢,但是我可以在<div>等其他元素上使用此execCommand吗?对我来说,这仅适用于<textarea>。我不确定,但我记得在将它用于具有 contenteditable=“true 的 div 时,我得到了”这不是函数错误”。
0赞 wOxxOm 10/25/2023
是的,请参阅我链接的示例。
0赞 Alex Oleksenko 10/26/2023
@wOxxOm 非常感谢。我考虑了删除以前文本的选项,这是为什么execCommand didnTypeError textbox.select不是一个函数的问题'所以我找到了范围和选择API的解决方法,但无论我尝试了什么,Instagram文本框元素都不起作用。所以现在我可以插入文本,但我仍然无法删除前一个。t work. select is not a function for the div element. document.execCommand("delete", false, null); const selection = window.getSelection(textbox); selection.removeAllRanges(); selection.addRange(range);
0赞 wOxxOm 10/26/2023
document.execCommand('selectAll')

答: 暂无答案