获取页面事件,标签关闭,失去焦点?

时间:2013-11-14 07:53:27

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

问题是如何在特定标签上查询此类事件:

  • 用户已使用特定网址加载了标签:google.com(我认为最简单的方法是使用chrome.tabs.query,然后您可以使用网址获取活动标签页)
  • 用户已关闭标签
  • 该标签处于非活动状态,例如切换到另一个标签
  • 检查用户是否空闲(还有空闲的chrome api)。

目前我已经研究过检查指定URL操作的最简单方法是使用内容脚本,它可以侦听事件,然后将带有消息API的结果发送到后台脚本。

1 个答案:

答案 0 :(得分:8)

您无法在特定选项卡上为此类事件注册侦听器。可能有不同的方法,但我建议使用 chrome.tabs.* 事件来侦听有关所有标签的事件,然后手动进行过滤。

[注意:您需要在清单中请求必要的 permissions ,例如 "tabs" "idle" host match patterns 等。]


  

用户已使用特定网址加载了标签,例如: google.com

附加以下事件的侦听器:

...然后根据网址进行过滤。 E.g:

var urlRegex = /https?:\/\/([^\.]+\.)?google.com/;
chrome.tabs.onUpdated.addListener(function(tabId, info, tab) {
    if (info.url && urlRegex.test(info.url)) {
        /* The tab with ID `tabId` has been updated to a URL
         * in the `google.com` domain. Let's do something... */
        ... 
    }
});

  

用户已关闭标签。

附加以下事件的侦听器:

...然后根据网址进行过滤。 E.g:

var urlRegex = ...;
chrome.tabs.onRemoved.addListener(function(tabId, info) {
    chrome.tabs.get(tabId, function(tab) {
        if (urlRegex.test(tab.url)) {
            /* The tab with ID `tabId`, with a web-page in the
             * `google.com` domain, is being closed. Let's do something... */
            ... 
        }
    });
});

  

该标签处于非活动状态,例如切换到另一个标签页。

不幸的是,没有onFocusLost事件。您可以收听 chrome.tabs.onActivated 事件并跟踪每个窗口中的活动标签。然后,当激活另一个标签时,如果之前激活的标签指向 google.com ,请执行某些操作。 (我不打算详细描述一种机制) 对于这种特殊情况,在停用标签页时使用内容脚本和 notify your background page 可能更简单:

 /* In `content.js` */
 window.addEventListener("blur", function() {
     chrome.runtime.sendMessage({ text: "focusLost" });
 })

/* In `background.js` */
chrome.runtime.onMessage.addListener(function(msg, sender) {
    if (msg.text === "focusLost") {
        /* OMG - The user switched to another tab :( */
    }
});

  

检查用户是否空闲。

您无法检查用户是否在特定选项卡上处于非活动状态,但一般情况下。正如您所提到的,您可以使用 chrome.idle API,为 chrome.idle.onStateChanged 事件注册一个监听器。

chrome.idle.onStateChanged.addListener(function(newState) {
    if (newState == "active") {
        /* The user came back. Let's do something... */
    } else {
        /* The user is not around. Let's wait... */
    }
});