Подтвердить что ты не робот

Правильное использование execcommand ( "paste" ) в расширении chrome

Я пытаюсь вставить данные буфера обмена в текстовое поле, используя execcommand("paste") с расширением chome, но я не могу заставить его работать. разрешений. Я попытался установить focus() в textarea, но document.execCommand("paste") ничего не делает, и я не получаю ошибки. вызов execcommand("paste") из фоновой страницы также ничего не делает.

<form>
     <textarea id="ta"></textarea>    
</form>
<script type="text/javascript">
    document.findElemetById("ta").focus();
    document.execCommand("paste");
</script>
4b9b3361

Ответ 1

Функциональность буфера обмена является ключевой частью моего расширения, поэтому я видел все обычные проблемы. На моей странице фона я показываю функцию copy и paste, а сама страница содержит <textarea id="sandbox"></textarea>;

function copy(str) {
    var sandbox = $('#sandbox').val(str).select();
    document.execCommand('copy');
    sandbox.val('');
}

function paste() {
    var result = '',
        sandbox = $('#sandbox').val('').select();
    if (document.execCommand('paste')) {
        result = sandbox.val();
    }
    sandbox.val('');
    return result;
}

Я использую jQuery для простоты, но вы получаете эту идею. Теперь, когда я хочу использовать функцию буфера обмена, я просто вызываю соответствующую функцию. Другие страницы моего расширения могут получить доступ к этому API через chrome.extension.getBackgroundPage(), но вы также можете использовать chrome.runtime. getBackgroundPage (обратный вызов), если ваша фоновая страница является страницей событий.

Я не уверен, что это лучшая практика или если такая вещь существует даже для этой функции, но это определенно работает для меня и очень чиста.

Ответ 2

Это слишком долго для комментария к замечанию Alasdair, поэтому я создаю еще один ответ. Ответ Alasdair превосходный и отлично подходит для меня, но, будучи новичком в расширениях Chrome, мне все равно потребовалось некоторое время, чтобы заставить его работать. Для тех, кто находится в подобном положении, вот расширение его ответа.

Страницы фона/событий могут взаимодействовать с системным буфером обмена, если вы запросили соответствующие разрешения. Они не могут взаимодействовать с DOM страниц, загруженных пользователем. Скрипты содержимого не могут взаимодействовать с системным буфером обмена, но они могут взаимодействовать с DOM страниц, загруженных пользователем. Взгляните на объяснение архитектуры расширения, чтобы получить хороший обзор всего этого.

Это по существу означает, что вам нужно делать действия copy/paste из системного буфера обмена на ваших страницах событий/фона, что и было описано выше Alasdair. Любое вставка или копирование из DOM страницы, которую пользователь просматривает, должно происходить в вашем контенте script. Эти два сценария могут легко общаться с сообщением .

У меня есть расширение, единственная цель которого - вставить, а архитектура в значительной степени связана с этой записью. Если вы хотите увидеть вышеупомянутую технику на практике, взгляните на код. В частности, background.html, background.js и contentscript.js.

Если вы действительно спешите, вот суть.

Ответ 3

  function PasteString() {
    var editor = document.getElementById("TemplateSubPage");
    editor.focus();
  //  editor.select();
    document.execCommand('Paste');
}

function CopyString() {
    var input = document.getElementById("TemplateSubPage");
    input.focus();
   // input..select();
    document.execCommand('Copy');
    if (document.selection) {
        document.selection.empty();
    } else if (window.getSelection) {
        window.getSelection().removeAllRanges();
    }
}

Надеюсь, что это сработает для вас.