【问题标题】:Chrome Extension which is supposed to run on all Facebook pages only runs when I hit refresh应该在所有 Facebook 页面上运行的 Chrome 扩展程序仅在我点击刷新时运行
【发布时间】:2012-04-16 11:13:16
【问题描述】:

这是我第一次编写 Chrome 扩展程序。我希望它在每次加载 Facebook 页面时执行一些非常简单的 JavaScript。它正在做我想要的一切除了,由于某种原因,它只有在我点击刷新按钮时才会运行我的脚本。如果,例如我点击了 Facebook 徽标,或者我从通知中转到某个状态,脚本没有运行……直到我点击刷新。

这是我的清单:

{
    "name": "Anti-social Reader",
    "version": "1.0",
    "description": "Defeats 'social reader' apps on Facebook, by letting you just see the news story directly without installing the app.",
    "content_scripts": [
        {
           "matches": ["http://*.facebook.com/*", "https://*.facebook.com/*"],
           "js": ["kill_social_reader.js"],
           "run_at": "document_end",
           "all_frames": true
        }
     ]
}

我需要它等到 document_end 因为它正在修改加载页面的 DOM。我确定这很愚蠢……有什么想法吗?

【问题讨论】:

  • 感谢您的回答。我检查了 mtk,因为他是第一个响应的 :) 这并不像为 DOM 更改添加监听器那么简单,因为我的脚本会修改 DOM 本身......所以我怀疑这会很糟糕。 :) 我尝试了 Amaan 的解决方案(不理解它),但它对我来说不太合适,但我可能做错了什么——我没有花任何时间调试它。无论如何,我认为我的基本问题已经得到解答,现在只需触发正确的事件即可。感谢您的回答!
  • 请注意,对于主要网站(尤其是单页应用程序)来说,不进行整页重新加载而是进行状态转换变得越来越普遍。例如。 YouTube、特雷罗、推特。这是另一个使用 Chrome webNavigation API 和 tabs API 的解决方案:stackoverflow.com/a/21071357/72321

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


【解决方案1】:

显然这是不可能的。 facebook 页面正在进行大量 ajax 调用,因此页面不会完全重新加载。您需要确定浏览器是否收到了 ajax 调用响应?然后触发所需的事件。我无法评论那部分,因为我在这方面仍然是新手。

【讨论】:

    【解决方案2】:

    我认为您可能已经在 $(function () {}) 中编写了代码,这显然需要加载页面。但是如果页面 DOM 发生变化,您想运行您的代码,那么这可能会有所帮助:

    document.addEventListener('DOMNodeInserted', function (event) {
    
    });
    

    更多信息:http://reminiscential.wordpress.com/2011/10/04/building_google_reader_plugin/

    【讨论】:

    • 记录在案:这个答案现在已被弃用。请参阅DOM MutationObserver 了解现代替代方案。如果作者更新了答案,那就太好了。
    【解决方案3】:

    正如mtk 所说,这是因为当您单击主页按钮或其他任何内容时,Facebook 会使用 AJAX 调用。要在每次进行 AJAX 调用时运行您的代码,您可以劫持 XMLHttpRequest。您可以在内容脚本中添加类似的内容,以便每次打开 AJAX 请求时都会调用您的代码。您也可以添加一个事件侦听器来等待 AJAX 请求完成,然后再运行您的代码。

    (function(open) {
      XMLHttpRequest.prototype.open = function() {
        // add the function you want to run here
        open.apply(null, arguments);
      };
    })(XMLHttpRequest.prototype.open);
    

    【讨论】:

    • 更正:要让它工作,这需要以a page-level script 执行,即使这样也很难实现(它将与其他扩展代码隔离)
    猜你喜欢
    • 1970-01-01
    • 2017-01-30
    • 2014-11-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-06-08
    相关资源
    最近更新 更多