Почему document.execCommand («вставить») не работает в Google Chrome? - PullRequest
10 голосов
/ 07 августа 2011

У меня проблема с моим расширением. Я хочу вставить данные из буфера обмена.

Пока у меня есть это:

function pasteAndGo()
{
    document.execCommand('paste')
    alert("Pasted")
}

Предупреждение появляется, но ничего не вставлено.

У меня такое ощущение, что это document часть нуждается в изменении, но я не знаю, что делать Есть идеи?

Ответы [ 6 ]

11 голосов
/ 18 августа 2011

В Chrome был экспериментальный API буфера обмена, но он был удален в Chrome 13.

Chrome перешел к более стандартным командам document.execCommand('paste'), document.execCommand('copy') и document.execCommand('cut'): https://developer.mozilla.org/en/Rich-Text_Editing_in_Mozilla#Executing%5FCommands

В Chrome вам необходимо добавить разрешения, необходимые для вашего манифеста: «clipboardRead» и «clipboardWrite».http://developer.chrome.com/extensions/declare_permissions.html

Вплоть до Chrome 38 эти разрешения буфера обмена были доступны только для страниц расширения, таких как фоновые скрипты.Начиная с Chrome 39, скрипты содержимого также могут использовать эти API-интерфейсы буфера обмена после объявления разрешений буфера обмена в файле манифеста ( crbug.com / 395376 ).

6 голосов
/ 26 марта 2013

Это хорошо работает на фоновой странице.

function getClipboard() {
    var pasteTarget = document.createElement("div");
    pasteTarget.contentEditable = true;
    var actElem = document.activeElement.appendChild(pasteTarget).parentNode;
    pasteTarget.focus();
    document.execCommand("Paste", null, null);
    var paste = pasteTarget.innerText;
    actElem.removeChild(pasteTarget);
    return paste;
};

Конечно, вашему расширению все еще нужно разрешение "clipboardRead", и вам нужно использовать передачу сообщений, чтобы получить эту информацию обратно в ваш контент-скрипт:

content.js:

chrome.extension.sendMessage({
    cmd: "clipboard", //$NON-NLS-0$
    action: "paste" //$NON-NLS-0$
}, function(response) {
    if (response.paste) {
        var range = document.getSelection().getRangeAt(0);
        range.deleteContents();
        range.insertNode(document.createTextNode(response.paste));
    }
});

background.js:

function getClipboard() {
    var pasteTarget = document.createElement("div");
    pasteTarget.contentEditable = true;
    var actElem = document.activeElement.appendChild(pasteTarget).parentNode;
    pasteTarget.focus();
    document.execCommand("Paste", null, null);
    var paste = pasteTarget.innerText;
    actElem.removeChild(pasteTarget);
    return paste;
};

function onClipboardMessage(request, sender, sendResponse) {
    if (request.action === "paste") { //$NON-NLS-0$
        sendResponse({
            paste: getClipboard()
        });
    }
}

chrome.extension.onMessage.addListener(onClipboardMessage);
4 голосов
/ 23 ноября 2018

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

Это матрица совместимости из document.execCommand("..."), касающаяся событий буфера обмена:

        | "copy" | "paste" | "cut"
--------+--------+---------+--------
IE      |   OK   |   OK    |  n/a
--------+--------+---------+--------
Edge    |   OK   |   n/a   |  OK
--------+--------+---------+--------
Firefox |   OK   |   n/a   |  OK
--------+--------+---------+--------
Chrome  |   OK   |   n/a   |  OK

Мои два цента к этому:

  • Поведение Edge , Firefox и Chrome является «разумным», поскольку они предотвращают вставку / чтение данных из буфера обмена. Они разрешают вырезать, так как вырезать это просто копия с последующим удалением.
  • Поведение IE не имеет для меня никакого смысла, так как включает «рискованную» вставку, но не выполняет событие вырезания.

Вы можете функция обнаружения возможных команд, используя document.queryCommandSupported метод.

2 голосов
/ 12 августа 2011

Вы не можете выполнить его на обычной странице, только на фоновой странице.

1 голос
/ 20 июня 2012

Вам необходимо установить разрешение clipboardRead для использования document.execCommand('paste') и разрешение clipboardWrite для использования execCommand('copy') и execCommand('cut').
В противном случае разрешения будут отклонены и ничего не произойдет.

Проверьте эту ссылку для более подробной информации.

0 голосов
/ 07 августа 2011

вам нужен элемент управления в фокусах, способный принимать контент ...

Некоторые примеры использования буфера обмена в JS см. http://www.geekpedia.com/tutorial126_Clipboard-cut-copy-and-paste-with-JavaScript.html
и http://help.dottoro.com/ljcvtcaw.php

Относительно расширений Chrome см. Копирование / вставка не работает в расширении Chrome

...