Chrome扩展本应在所有Facebook页面上运行,但只有当我点击刷新时才会运行

Chrome Extension which is supposed to run on all Facebook pages only runs when I hit refresh

本文关键字:运行 刷新 扩展 Facebook Chrome      更新时间:2023-09-26

这是我编写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所说,这是因为当你点击主页按钮或其他按钮时,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);

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

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

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

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