如何通过扩展程序检测Google Chrome中页面标题的更改?

阿马尔·穆拉利(Amal Murali)

我正在创建一个Google Chrome扩展程序,我需要检测页面标题何时更改。该页面的标题像在Twitter中一样被更改:((num) Twitter请参见下面的屏幕截图)-发布新的tweet时,数字将递增。例子:

在此处输入图片说明

我试图检测在我的一个标签中加载的URL的标题更改,并在出现差异时播放提示音。此检查将在重复的间隔中完成,我认为可以使用setTimeOut()功能来完成

我创建了一个manifest.json如下:

{
  "manifest_version": 2,

  "name": "Detect Page Title Changes",
  "description": "Blah",
  "version": "1.0",

  "browser_action": {
    "default_icon": "icon.png",
    "default_popup": "background.html"
  },
  "permissions": [
    "tabs"
  ]
}

但是,我对其余的一无所知。我已经通过文档搜索,并试图对类似堆栈溢出线程,如解决这一个我,但找不到任何适合我的要求。1 2

你有什么建议吗?如果可能,请提供示例。

可汗

与其在评论中争论某种方法更好,不如让我更具建设性,并通过展示我共同编写特定实现并解释一些可能遇到的难题来添加答案代码段指的是与Twitter不同的服务,但目标是相同的。实际上,此代码的目标是报告未读消息的确切数量,因此您的消息可能会更简单。

我的方法基于SO的答案,而不是由轮询驱动(以固定间隔检查条件)而是事件驱动(被通知状态的潜在变化)。

优点包括立即检测到更改(否则将不会检测到下一次轮询),并且不会在条件不变的情况下在轮询上浪费资源。诚然,第二个论点在这里几乎不适用,但第一个论点仍然存在。


架构一览:

  1. 将内容脚本插入相关页面。

  2. 分析标题的初始状态,并通过进入背景页面sendMessage

  3. 注册标题更改事件的处理程序。

  4. 每当事件触发并调用处理程序时,都要分析标题的新状态,并通过来向后台页面报告sendMessage


第1步已经有一个陷阱。当在清单中定义内容脚本时,普通的内容脚本注入机制将在导航到与URL匹配的页面时将其注入页面中。

"content_scripts": [
  {
    "matches": [
      "*://theoldreader.com/*"
    ],
    "js": ["observer.js"],
    "run_at": "document_idle"
  }
]

直到重新加载您的扩展程序,此方法才能很好地工作这可能发生在开发中,因为您正在应用所做的更改,也可能发生在部署的实例中,因为它会自动更新。然后会发生的是,内容脚本不会重新注入到现有打开的页面中(直到导航发生,就像重新加载一样)。因此,如果您依赖基于清单的注入,则还应该考虑在扩展初始化时将程序注入包括在已打开的选项卡中:

function startupInject() {
  chrome.tabs.query(
    {url: "*://theoldreader.com/*"},
    function (tabs) {
      for (var i in tabs) {
        chrome.tabs.executeScript(tabs[i].id, {file: "observer.js"});
      }
    }
  );
}

另一方面,在扩展名重载时处于活动状态的内容脚本实例不会终止,而是孤立的:任何sendMessage或类似的请求都将失败。因此,建议在尝试与父扩展进行通信时始终检查异常,并在失败时自行终止(通过删除处理程序):

try {
  chrome.runtime.sendMessage({'count' : count});
} catch(e) { // Happens when parent extension is no longer available or was reloaded
  console.warn("Could not communicate with parent extension, deregistering observer");
  observer.disconnect();
}

第2步也有一个陷阱,尽管它取决于您正在观看的服务的细节。内容脚本范围内的某些页面不会显示未读项目的数量,但这并不意味着没有新消息。

观察了Web服务的工作原理后,我得出结论,如果标题更改为没有导航的内容,则可以正确地假设新值正确,但是对于初始标题“无新项目”,应将其视为不可靠的,可以忽略不计。

因此,分析代码说明了它是初始读取还是处理更新:

function notify(title, changed) {
  // ...
  var match = /^\((\d+)\)/.exec(title);
  var match_zero = /^The Old Reader$/.exec(title);

  if (match && match[1]) {
    count = match[1];
  } else if (match_zero && changed) {
    count = 0;
  }
  // else, consider that we don't know the count
  //...
}

在第2步中以初始标题和changed=调用它false


第3步和第4步是“如何监视标题更改”的主要答案(以事件驱动的方式)。

var target = document.querySelector('head > title');

var observer = new window.MutationObserver(
  function(mutations) {
    mutations.forEach(
      function(mutation){
        notify(mutation.target.textContent, true);
      }
    );
  }
);

observer.observe(target, { subtree: true, characterData: true, childList: true });

有关为何observer.observe设置某些选项的详细信息,请参阅原始答案

请注意,notify使用changed=进行了调用true,因此从“(1)旧阅读器”到没有导航的“旧阅读器”被认为是“真实”的更改,即未读邮件为零。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

Google Chrome DevTools扩展-检测页面更改

来自分类Dev

Google Chrome DevTools扩展-检测页面更改

来自分类Dev

Chrome扩展程序:如何以编程方式更改每个页面请求上的标题?

来自分类Dev

如何更改特定页面中的标题徽标?

来自分类Dev

如何在activeadmin中更改页面标题

来自分类Dev

通过Chrome扩展程序绕过iFrame检测

来自分类Dev

如何重定向Google Chrome扩展程序中的某些页面?

来自分类Dev

Chrome扩展程序检测Google搜索刷新

来自分类Dev

Chrome扩展程序:检测Google文档中的按键

来自分类Dev

如何在特定页面中更改标题徽标?

来自分类Dev

如何使用$ routeProvider在Angular中更改页面标题

来自分类Dev

如何在CakePHP 2.5中更改页面标题?

来自分类Dev

如何在ReactJS的特定页面中更改标题徽标

来自分类Dev

如何在导航栏中更改页面标题

来自分类Dev

通过脚本安装Google Chrome扩展程序

来自分类Dev

如何使Chrome扩展程序标题栏如Google Hangouts?

来自分类Dev

如何在Chrome扩展程序中通过鼠标调整POPUP.html页面的大小

来自分类Dev

在Chrome扩展程序中的浏览器操作工具提示上更改标题

来自分类Dev

如何修改Chrome扩展程序,以通过Google的OAuth 2对每个用户进行身份验证?

来自分类Dev

如何检测其他Chrome扩展程序何时覆盖同一页面

来自分类Dev

如何在Chrome 33+中通过GPO自动安装Chrome扩展程序(Chrome错误或GPO安装扩展程序的未记录更改)?

来自分类Dev

如何卸载此Google Chrome扩展程序?

来自分类Dev

如何查看Google Chrome扩展程序的来源?

来自分类Dev

如何从Chrome扩展程序中打开的窗口获取背景页面?

来自分类Dev

Chrome扩展程序如何响应按钮在页面中的单击?

来自分类Dev

chrome扩展程序中的选项卡更改时的页面内容

来自分类Dev

通过Google Chrome扩展程序登录流星应用

来自分类Dev

扩展程序页面中的Chrome图标

来自分类Dev

如何检测扩展中的页面加载错误?

Related 相关文章

  1. 1

    Google Chrome DevTools扩展-检测页面更改

  2. 2

    Google Chrome DevTools扩展-检测页面更改

  3. 3

    Chrome扩展程序:如何以编程方式更改每个页面请求上的标题?

  4. 4

    如何更改特定页面中的标题徽标?

  5. 5

    如何在activeadmin中更改页面标题

  6. 6

    通过Chrome扩展程序绕过iFrame检测

  7. 7

    如何重定向Google Chrome扩展程序中的某些页面?

  8. 8

    Chrome扩展程序检测Google搜索刷新

  9. 9

    Chrome扩展程序:检测Google文档中的按键

  10. 10

    如何在特定页面中更改标题徽标?

  11. 11

    如何使用$ routeProvider在Angular中更改页面标题

  12. 12

    如何在CakePHP 2.5中更改页面标题?

  13. 13

    如何在ReactJS的特定页面中更改标题徽标

  14. 14

    如何在导航栏中更改页面标题

  15. 15

    通过脚本安装Google Chrome扩展程序

  16. 16

    如何使Chrome扩展程序标题栏如Google Hangouts?

  17. 17

    如何在Chrome扩展程序中通过鼠标调整POPUP.html页面的大小

  18. 18

    在Chrome扩展程序中的浏览器操作工具提示上更改标题

  19. 19

    如何修改Chrome扩展程序,以通过Google的OAuth 2对每个用户进行身份验证?

  20. 20

    如何检测其他Chrome扩展程序何时覆盖同一页面

  21. 21

    如何在Chrome 33+中通过GPO自动安装Chrome扩展程序(Chrome错误或GPO安装扩展程序的未记录更改)?

  22. 22

    如何卸载此Google Chrome扩展程序?

  23. 23

    如何查看Google Chrome扩展程序的来源?

  24. 24

    如何从Chrome扩展程序中打开的窗口获取背景页面?

  25. 25

    Chrome扩展程序如何响应按钮在页面中的单击?

  26. 26

    chrome扩展程序中的选项卡更改时的页面内容

  27. 27

    通过Google Chrome扩展程序登录流星应用

  28. 28

    扩展程序页面中的Chrome图标

  29. 29

    如何检测扩展中的页面加载错误?

热门标签

归档