Реализация "Вставить" в пользовательском контекстном меню
Вот проблема, которую я пытаюсь решить - я не уверен, что это вообще возможно. У меня есть веб-приложение, и мне нужно включить копирование / вставку данных из приложения и в приложение, и у меня возникла проблема с вставкой. Если я прошёл с помощью комбинации клавиш CTRL + V, я могу получить данные из буфера обмена, используя
e.originalEvent.clipboardData.getData('text')
в "вставить" EventHandler, и он работает нормально. Мне нужно включить "Вставить" из пользовательского контекстного меню, и моей первой попыткой было отправить событие вставки вручную, как это
var event = new KeyboardEvent('paste', {
view: window,
bubbles: true,
cancelable: true
});
document.dispatchEvent(event);
и он действительно ударил вставить обработчик событий, но я не мог получить доступ к данным буфера обмена, как в предыдущем случае. Я понимаю, что это запрещено из-за проблем безопасности - если бы это было разрешено, любая страница могла бы получить доступ к данным из буфера обмена. Мой вопрос заключается в том, как это реализовать - мы можем скопировать данные из Excel, например, в документ на диске Google, и вставить их с помощью пользовательского контекстного меню ( http://pokit.org/get/?1b5f6f4f0ef4b80bb8637649121bcd75.jpg), поэтому я считаю, это возможно. Спасибо всем!
1 ответ
Итак, в моем веб-приложении у меня есть пользовательское контекстное меню с действием "Вставить" (куча '<li>'
теги во всплывающем окне). И когда пользователь нажимает "Вставить", я вызываю эту функцию
if (browser === 'CHROME') {
var extensionId = 'some_id';
chrome.runtime.sendMessage(extensionId, { message: "getClipboardData" },
function (clipboardData) {
console.log('Clipboard data: ', clipboardData);
var txt = $('.helper_textarea');
$(txt).val(clipboardData);
// Call 'paste' function we have clipboard data
}
);
}
В моем расширении у меня есть файл paste.js, который у меня есть
function getDataFromClipboard() {
var bg = chrome.extension.getBackgroundPage();
var helperTextArea = bg.document.getElementById('sandbox');
if (helperTextArea == null) {
helperTextArea = bg.document.createElement('textarea');
document.body.appendChild(helperTextArea);
}
helperTextArea.value = '';
helperTextArea.select();
// Clipboard data
var clipboardData = '';
bg.document.execCommand("Paste");
clipboardData = helperTextArea.value;
helperTextArea.value = '';
return clipboardData;
}
chrome.runtime.onMessageExternal.addListener(
function(req, sender, callback) {
if (req) {
if (req.message) {
if (req.message == "installed") {
console.log('Checking is extension is installed!');
callback(true);
}
else if(req.message = "getClipboardData") {
console.log('Get clipboard data');
callback(getDataFromClipboard());
}
}
}
return true;
}
);
И в файле манифеста
"background" : {
"scripts" : [ "paste.js" ]
},
"externally_connectable": {
"matches": ["*://localhost:*/*"]
},
и конечно
"permissions": ["clipboardRead" ],
Я использую эту функцию, чтобы проверить, добавлено ли расширение
isExtensionInstalled: function (extensionId, callback) {
chrome.runtime.sendMessage(extensionId, { message: "installed" },
function (reply) {
if (reply) {
callback(true);
} else {
callback(false);
}
});
},
И это прекрасно работает. Теперь проблема в том, как перенести это на Edge. Что эквивалентно 'chrome.runtime.sendMessage'
в краю? Спасибо за вашу помощь.