Вставка расширения Chrome во входной элемент

Давайте представим, что у меня есть простая страница. Со следующим содержанием.

<form>
     <input type="text" id="startText">
</form>

У меня есть расширение chrome со скриптом, который запускает загрузку этой страницы. Я также настроил все соответствующие разрешения в chrome (т. е. clipboardRead). Сценарий, запускаемый при загрузке страницы, называется действием.js. В настоящее время он имеет одну строку кода:

document.getElementById("startText").value = "text";

Я знаю, что могу использовать функцию» execCommand(‘paste’) » для вставки в расширение chrome. Но я не могу понять, как изменить приведенный выше код, чтобы он вставил содержимое буфера обмена пользователя в элемент ввода.

Я бы попробовать что-то вроде:

document.getElementById("startText").value.execCommand('paste')

Но это, неудивительно, не работает.

2 ответа

  1. Из соображений безопасности доступ к буферу обмена возможен только через фоновые страницы. Проблема в том, что фоновые страницы не могут взаимодействовать с DOM, только скрипты содержимого. Проверьте этот gist, который решает эту проблему с сообщениями, передаваемыми между фоновой страницей и сценарием содержимого.

  2. Начиная с 2014 года, и это исправление, теперь можно использовать копирование / вставку непосредственно в content_scripts, предполагая, что вы объявили соответствующие разрешения в манифесте.

    Важно помнить, что execCommand('paste')не возвращает содержимое буфера обмена, но фактически запускает действие вставки в сфокусированный элемент и область выделения документа. Таким образом код для вставки в элемент ввода будет:

    document.getElementById("startText").select();
    var didSucceed = document.execCommand('paste');
    

    Если вы хотите захватить форматированный текст, вам нужно будет использовать DIV contentEditable=trueвместо a TEXTAREA.

    Если вы хотите увидеть рабочий пример, который использует более старый метод использования фоновой страницы, вы можете увидеть расширение my BBCodePaste .