Правильное использование 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>
Ответы
Ответ 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();
}
}
Надеюсь, что это сработает для вас.