如何防止在Chrome扩展程序中重新加载页面?

时间:2012-11-20 11:52:18

标签: google-chrome google-chrome-extension

我已经在浏览器的地址栏中写了一个清除TYPO3 CMS缓存的Chrome扩展程序。

现在我想添加一个可选功能,以便在页面刷新时自动清除缓存。这意味着,当用户按下F5,CTRL + R时,单击工具栏中的重新加载图标或单击上下文菜单中的“重新加载”,首先应执行我的ajax脚本(清除CMS缓存),然后页面可能得到重新加载。

是否有可能使用Chrome API执行此操作?

我首先尝试了内容脚本中的window.onbeforeupdate事件 - 这在页面重新加载时会被触发,但是如果我关闭窗口或切换到另一个网站也是如此。此外,我不能告诉浏览器在这里等待我的ajax请求。

使用控制键在document.onkeydown事件中检查键116(F5)和82(R)并使用event.preventDefault()。但这不会涵盖刷新缓存的其他两种可能情况。

谢谢!

1 个答案:

答案 0 :(得分:1)

我找到了解决方案。它并不符合我的要求,但它可以工作(甚至更好)。

Chrome提供webRequest API,可让您修改或屏蔽所有http请求。

chrome.webRequest.onBeforeRequest.addListener(
  function (details) {
    if (!severalConditionsToCheckIfIWantToDoTheMagic) {
        return;
    }

    $.ajax(url, {
        async:false,
        complete:function () {
          return {redirectUrl:details.url};
        }
    });
  },
  {urls:["<all_urls>"]},
  ["blocking"]
);

在这个例子中,首先我检查是否要执行ajax请求。如果是,则下一步是不执行ajax请求。重要的是,请求是异步的。完成后,我返回请求的原始URL,这基本上只是重新加载。

它之所以不符合我的要求,是因为它会在任何请求时始终触发,而不仅仅是重新加载。这意味着在我的条件下我必须检查:

  • 其他网站
  • 其他请求类型(加载css,js或图像也是请求),我只需要'main_frame'类型
  • 属于我的扩展程序的一些变量

现在,当我点击网站上的链接时,也会触发脚本 - 但对于我的情况,这很好。