是否有一个相当于chrome.declarativeContent.onPageChanged的FF?

时间:2016-08-31 14:29:31

标签: javascript google-chrome-extension firefox-webextensions

我正在将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);

是否有任何已知的解决方法?

3 个答案:

答案 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);