правильное использование execcommand ("вставить") в расширении Chrome - PullRequest
20 голосов
/ 22 августа 2011

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

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

Ответы [ 3 ]

41 голосов
/ 22 августа 2011

Функциональность буфера обмена является ключевой частью моего расширения , поэтому я видел все обычные проблемы.На моей фоновой странице я показываю функции 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 (callback) , если ваша фоновая страница - page page .

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

18 голосов
/ 27 июля 2014

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

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

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

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

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

0 голосов
/ 25 июня 2016
  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();
    }
}

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...