0

我正在创建一个内容脚本 Chrome 扩展来隐藏 Facebook 主页上的新闻源。

此脚本在我第一次打开 facebook.com 时加载,但在导航到 Facebook 并返回主页时失败(这是在扩展程序中正确定义的 URL)。

这是我的 manifest.js 文件:

{
  "name": "NewsBlock",
  "description": "NewsBlock - Facebook Newsfeed Hider",
  "version": "1.0.0",
  "background": {
    "scripts": ["background.js"]
  },
  "permissions": [
    "tabs", "http://*/*", "https://*/*", "storage"
  ],
  "browser_action": {
      "default_title": "NewsBlock",
      "default_icon": "icon.png"
  },
    "content_scripts": [
    {
        "matches": ["https://www.facebook.com/"],
        "js": ["myscript.js"]
    }
    ],
  "manifest_version": 2
}

这是我的 myscript.js 文件:

if (document.getElementById('home_stream'))
    document.getElementById('home_stream').style.visibility = "hidden";
if (document.getElementById('pagelet_home_stream'))
    document.getElementById('pagelet_home_stream').style.visibility = "hidden";
console.log("NewsBlock Activated...")

当我导航回 Facebook 主页时,任何有助于理解为什么没有加载它的帮助都将是惊人的。

4

2 回答 2

1

这是因为在很多情况下,Facebook 页面都使用该history.pushstate方法进行导航。此方法可以更改当前 url 而不会导致新的页面加载。通过将部分页面内容替换为 ajax 调用的结果来模拟导航。

您可以使用该chrome.webNavigation.onHistoryStateUpdated事件来检测这种情况,如本答案https://stackoverflow.com/a/17584559/1507998中所建议的那样。

于 2013-08-01T19:01:13.033 回答
0

facebook 中的某些链接调用 ajax 函数,因此大多数时候单击 facebook 中的链接不会更改页面,只是通过 ajax 加载内容。所以你的内容脚本只执行一次。

有两种可能的解决方案,

  • 您还可以添加一个 DOM 更改侦听器,如 DOMSubtreeModified,并在每次更改内容时运行代码。

  • 您可以将 CSS 代码添加到页面,因此即使通过 ajax 更改页面也不需要每次都运行它。

像这样,

清单.json

{
  "name": "NewsBlock",
  "description": "NewsBlock - Facebook Newsfeed Hider",
  "version": "1.0.0",
  "background": {
    "scripts": ["background.js"]
  },
  "permissions": [
    "tabs", "http://*/*", "https://*/*", "storage"
  ],
  "browser_action": {
      "default_title": "NewsBlock",
      "default_icon": "icon.png"
  },
    "content_scripts": [
    {
        "matches": ["https://www.facebook.com/"],
        "js": ["myscript.js"],
        "css": ["mystyle.css"]
    }
    ],
  "manifest_version": 2
}

我的样式.css

#home_stream, #pagelet_home_stream {
  visibility: hidden;
}
于 2013-08-01T18:50:58.427 回答