我正在将Chrome扩展程序移植到Firefox WebExtensions,我一直在寻找chrome.declarativeContent.onPageChanged
的解决方法。
我的FF Webextension包含在某些网站上导航时必须显示的页面操作。但是,可用API中的所有侦听器似乎都不允许这样做。
特别是我尝试过:
chrome.runtime.onInstalled.addListener(onChange);
chrome.tabs.onCreated.addListener(onChange);
chrome.tabs.onActivated.addListener(onChange);
chrome.tabs.onUpdated.addListener(onChange);
chrome.webNavigation.onDOMContentLoaded(onChange);
chrome.webNavigation.onCreatedNavigationTarget(onChange);
是否有任何已知的解决方法?
答案 0 :(得分:9)
您必须手动显示pageAction,因为declarativeContent API为not yet supported。
chrome.pageAction.show(tabId);
chrome.pageAction.hide(tabId);
如果规则基于URL匹配,则实现非常简单:
chrome.tabs.onUpdated.addListener(function(tabId, changeInfo, tab) {
if (changeInfo.status === 'complete' && tab.url.match(/something/)) {
chrome.pageAction.show(tabId);
} else {
chrome.pageAction.hide(tabId);
}
});
但是如果它是基于DOM元素的,你将不得不使用content script:
chrome.tabs.onUpdated.addListener(function(tabId, changeInfo, tab) {
if (changeInfo.status === 'complete' && tab.url.match(/something/)) {
chrome.tabs.executeScript(tabId, {
code: 'document.querySelector(' + JSON.stringify(someSelector) + ')'
}, function(results) {
if (results[0]) {
chrome.pageAction.show(tabId);
} else {
chrome.pageAction.hide(tabId);
}
});
} else {
chrome.pageAction.hide(tabId);
}
});
这是一个非常简化的代码。可以增强它以在页面加载时查找元素。
答案 1 :(得分:0)
对于简单的URL匹配,新标签页以及对现有标签页的更改,此方法有效:
tabs
权限。。
chrome.tabs.onUpdated.addListener(function(tabId, changeInfo, tab) {
if (changeInfo.status === 'complete' && tab.url.match(/something/)) {
chrome.pageAction.show(tabId);
} else if (changeInfo.status === 'complete') {
chrome.pageAction.hide(tabId);
}
});
chrome.tabs.onCreated.addListener(function(tab) {
if (tab.url && tab.url.match(/something/)) {
chrome.pageAction.show(tab.id);
} else if (tab.url) {
chrome.pageAction.hide(tab.id);
}
});
答案 2 :(得分:-1)
到目前为止最好的等价物似乎是:
var target = "<all_urls>";
chrome.webRequest.onCompleted.addListener(onChange, {urls: [target]});
(onChange()
包括将当前网址与正则表达式匹配,然后chrome.pageAction.show(tabInfo.id);
)