Не удается заставить execCommand ('paste') работать в Chrome

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

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

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

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

у меня такое чувство, что это document часть, которая нуждается в изменении, но я не могу найти что.

5 ответов


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


в 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).


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

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", и вы должны использовать передачу сообщений, чтобы вернуть эту информацию в свой скрипт контента:

содержание.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));
    }
});

фон.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);

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

Регистрация этой ссылке для более подробной информации.


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

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

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