我创建了一个chrome扩展程序来启用剪贴板数据访问。此处详细介绍了该解决方案在自定义上下文菜单中实现"粘贴"。现在的问题是如何将此扩展移植到 Edge。有一个工具,我知道我使用了它,也许它正在工作,但我的问题是如何"消费"这个扩展,什么相当于 Edge 中的chrome.runtime.sendMessage
?在Chrome中,我使用了这个 https://developer.chrome.com/apps/messaging#external-webpage-"从网页发送消息"部分,但是在Edge中,我找不到类似的东西。感谢您的时间和帮助。
Edge 中也有runtime.sendMessage()
。
https://developer.mozilla.org/en-US/Add-ons/WebExtensions/API/runtime/sendMessage
要记住的是,runtime
对象是在browser
对象上定义的,而不是chrome
。
向扩展或其他扩展中的事件侦听器发送一条消息。
如果发送到扩展,请省略扩展 Id 参数。runtime.onMessage 事件将在扩展中的每个页面中触发,但调用 runtime.sendMessage 的帧除外。
如果发送到其他扩展,请包括设置为其他扩展的 ID 的 extensionId 参数。 runtime.onMessageExternal 将在另一个扩展中触发。
扩展无法使用此方法将消息发送到内容脚本。若要将消息发送到内容脚本,请使用 tabs.sendMessage。
这是一个返回承诺的异步函数。
我设法解决了这个问题。没有办法(至少我找不到它(使用扩展后台脚本从网页进行通信(并且只有后台脚本可以从剪贴板获取数据并定义"浏览器"对象(。所以我所做的,我用内容脚本沟通,内容脚本用后台脚本沟通。这是代码。
页面代码:
contextMenuPaste: function () {
if (getBrowserName() == 'EDGE') {
window.postMessage({
direction: "from-page-script"
}, "*");
}
},
window.addEventListener("message", function (event) {
if (event.source == window &&
event.data.direction &&
event.data.direction == "from-content-script") {
console.log('Data in page script', event.data.message);
}
});
内容脚本代码
window.addEventListener("message", (event) => {
// If message came from page-script send request to background script to get clipboard data
if (event.source == window &&
event.data &&
event.data.direction == "from-page-script") {
browser.runtime.sendMessage({
message: "getClipboardData"
},
function(clipboardData) {
messagePageScript(clipboardData);
}
);
}
});
// Send clipboard data to page script
function messagePageScript(clipboardData) {
window.postMessage({
direction: "from-content-script",
message: clipboardData
}, "*");
}
后台脚本代码
browser.runtime.onMessage.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;
}
);
function getDataFromClipboard() {
var bg = browser.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;
}
但有一个小问题。如果我在线设置了断点,则此代码有效
bg.document.execCommand("Paste");
如果我没有那个断点,它就不会。我认为这是一个修剪问题,增加了暂停,延迟执行,但没有任何帮助。我将为该问题开始一个新问题,并将在此处复制解决方案(如果我找到的话(。