DeclarativeContent - 等待显示页面操作

时间:2014-08-16 19:06:45

标签: javascript google-chrome-extension

我是Chrome扩展程序的新手,但我想弄清楚如何延迟显示page action图标,直到我准备好它为止。

我有一个内容脚本(在DOM准备好之前等待执行)并且所有操作都是从页面获取URL。

chrome.runtime.sendMessage({"url": getUrl()});

function getUrl() {
  var url = $('meta[itemprop=contentURL]').attr('content');
  return url;
}

在我的background.js页面中,我使用declarativeContent查看是否应显示页面操作。这与Google示例非常相似,如果不相同。

chrome.runtime.onInstalled.addListener(function(details) {
  chrome.declarativeContent.onPageChanged.removeRules(undefined, function() {
    chrome.declarativeContent.onPageChanged.addRules([rule1]);
  });
});


var rule1 = {
  conditions: [
    new chrome.declarativeContent.PageStateMatcher({
        pageUrl: { urlContains: 'www.example.com', schemes: ['http', 'https'] }
    })
  ],
  actions: [ new chrome.declarativeContent.ShowPageAction() ]
};

我设置了一个监听器来获取content_script

发送的消息
chrome.runtime.onMessage.addListener(
  function(request, sender, sendResponse) {
    url =request.url; //set global variable in background.js so I have it
    sendResponse({});
});

最后,我点击了页面操作后的操作。

chrome.pageAction.onClicked.addListener(function(tab) {
  alert(url);
});

此代码有效。但是,如果我在页面加载过程中过早按下page_action按钮,我将收到undefined警报,因为在执行内容脚本并传递消息之前,页面操作已显示/可用。

在内容脚本执行并设置了网址之前,如何延迟显示网页操作图标?

谢谢!

1 个答案:

答案 0 :(得分:2)

您不必使用内容脚本来获取选项卡的URL。只需使用tab.url(其中tabchrome.pageAction.onClicked事件收到的第一个参数)来获取网页的网址:

chrome.pageAction.onClicked.addListener(function(tab) {
  alert(tab.url);
});

如果页面操作ico 的有用性确实取决于只能在内容脚本中获取的页面状态,那么请不要使用chrome.declarativeContent API,而是调用{ {3}}代替:

var url;
chrome.runtime.onMessage.addListener(function(request, sender, sendResponse) {
    url = request.url; // Save some state
    chrome.pageAction.show(sender.tab.id);
});