在Chrome扩展程序中删除后重新添加Javascript侦听器

时间:2018-12-15 04:39:53

标签: javascript google-chrome-extension httpwebrequest

我正在测试chrome扩展程序。

它应该如何工作,它会阻止除Google(或其他域)之外的所有请求

问题是当您访问Google.com时,Google发出了后续请求,但这些请求被阻止了,所以我添加了removeListener函数。

我现在遇到的问题是在删除侦听器后将其重新添加。我以为会在窗口对象完成加载后发生,但是我不确定我是否正在正确考虑。

如何重新添加此侦听器,或者还有其他方法可以解决我没有想到的问题?谢谢。

function create<T extends new(...args: any[]) => any>(
    cls: T, ...args: ConstructorParameters<T>): InstanceType<T> {
  return new cls(...args);
}


interface BarConstructor<T, C> {
  new(a: T, b: string): C;
}

class BarImpl<T> {
  constructor(a: T, b: string) {}
}

function Bar<T>(): BarConstructor<T, BarImpl<T>> {
  return BarImpl;
}


let b = create(Bar(), "asdf", "a"); // OK because Bar() by itself implies Bar<{}>(),
                                   // and "asdf" is assignable to {}
  // you can turn it into an error by having `never` as default for T like this
  // function Bar<T = never>()

let c = create(Bar<number>(), "asdf", "a"); // error as expected
let d = create(Bar<number>(), 20, "a");    // OK

1 个答案:

答案 0 :(得分:0)

基于@wOxxOm的评论,我可以通过在webRequest完成后重新初始化侦听器来使其正常工作。这就是它的样子……

var blocked_domains = [
"*://*/*"
];

var requestGuard = function(details) {
        if (details.url == "https://www.google.com/") {
            chrome.webRequest.onBeforeRequest.removeListener(requestGuard)
            return {cancel: false };
        } else {
            return {cancel: true };
        }
}

chrome.webRequest.onBeforeRequest.addListener(
    requestGuard, {urls: blocked_domains}, ["blocking"]
)

chrome.webNavigation.onCompleted.addListener(function() {
    chrome.webRequest.onBeforeRequest.addListener(
        requestGuard, {urls: blocked_domains}, ["blocking"]
    )
})

它可以写得更好,有一些重复代码,但是可以用