我相信我解决了。
编辑:
最终版本(更新更稳定,消息传递更少):
//Global "browser" namespace definition, defined as "namespace". Can be renamed to anything else.
window.namespace = (function() {
return window.browser || window.chrome;
})();
function sendGlobalResponse(message, callback){
if (window.namespace === window.chrome) {
//Chrome
window.namespace.runtime.sendMessage(message, callback);
}
else if (window.namespace === window.browser) {
//Using instanceof to check for object type, and use the returned evaluation as a truthy value.
let supportPromises = false;
try {
supportPromises = window.namespace.runtime.getPlatformInfo() instanceof Promise;
}
catch(e) { }
if (supportPromises){
//Firefox
window.namespace.runtime.sendMessage(message).then(callback);
}
else {
//Edge
window.namespace.runtime.sendMessage(message, callback);
}
}
}
(原帖):
最终版本(现已作废):
//Global "browser" namespace definition.
window.namespace = (function() {
return window.browser || window.chrome;
})();
function sendGlobalResponse(message, callback){
if (window.namespace === window.chrome) {
//Chrome
window.namespace.runtime.sendMessage(message, callback);
}
else if (window.namespace === window.browser) {
let returnValue = window.namespace.runtime.sendMessage({});
if (typeof returnValue === "undefined"){
//Edge
window.namespace.runtime.sendMessage(message, callback);
}
else {
//Firefox
window.namespace.runtime.sendMessage(message).then(callback);
}
}
}
在第二个
if
语句,通过检查
window.browser.runtime.sendMessage
是一个
Promise
或
undefined
,我们可以检测平台是否
Firefox
或
Edge
.
我认为这是处理内容脚本上的消息传递回调/消息响应的唯一解决方案。
我真的想不出比这更好的解决办法了。所以我从现在开始用这个。
但是如果其他人知道更好的方法,一种不需要为每个函数调用发送一条额外的firefox和edge伪消息的方法,那就太好了!
很糟糕的是,内容脚本中的任何内容都不是持久的,即使您存储了有关代码在哪个平台上运行的信息,在筛选出
runtime.sendMessage
要调用的函数,因此不会真正节省太多时间。