javascript - Chrome 扩展程序 webRequest.onBeforeRequest 取消页面

标签 javascript google-chrome google-chrome-extension

我正在尝试创建一个 Chrome 扩展程序,该扩展程序查询外部源作为阻止或允许通过特定页面的引用。以下是我的代码的一部分。我是 JavaScript 新手,范围似乎总是让我烦恼。

chrome.webRequest.onBeforeRequest.addListener(
    function(details) {

        var http = new XMLHttpRequest();
        var url = "http://xxx.xx.xxxx";
        var params = "urlCheck="+encodeString_(details.url);
        http.open("POST", url, true);
        //Send the proper header information along with the request
        http.setRequestHeader("Content-type", "application/x-www-form-urlencoded");

        http.onreadystatechange = function() {
            if(http.readyState == 4 && http.status == 200) {
                guilt = 0;
                console.log(guilt);
            }else if(http.readyState == 4 && http.status == 404){
                guilt = 1;
                console.log(guilt);
            }
        }
        http.send(params);

    if(guilt == 1){
        return {cancel: true};
        }else{
        return {cancel: false};
        }

    },
    {urls: ["<all_urls>"],
     types:["main_frame"]
    },
    ["blocking"]
    );

任何帮助将不胜感激!谢谢。

最佳答案

你不能这么做。

您的代码无法按预期工作,因为 XHR 是异步的; onreadystatechange 在整个外部函数完成后执行。因此,guilt 将是未定义的,或者更糟糕的是,陈旧的(来自最后一个请求)。

有关更多信息,请参阅此规范问题:Why is my variable unaltered after I modify it inside of a function?

但是,如果您尝试解决此问题,您会发现无法从异步处理程序中返回响应。

这是有意为之:没有任何函数可以传递并稍后调用(例如 Messaging API 中的 sendResponse),因为 Chrome 不会等待您。您应该以确定且快速的方式响应阻塞调用。

If the optional opt_extraInfoSpec array contains the string 'blocking' (only allowed for specific events), the callback function is handled synchronously. That means that the request is blocked until the callback function returns.

可以尝试使用同步 XHR 调用来绕过它。一般来说,这不是一个好主意,因为加载远程响应需要很长时间,并且同步 XHR 被认为已被弃用。即使您将查询限制为“main_frame”请求,这仍然会为每次加载增加不确定的延迟。

正确的方法是从服务器加载一组规则并定期更新,当发生请求时,根据规则的本地副本对其进行验证。这就是 AdBlock 等扩展的使用方法。

关于javascript - Chrome 扩展程序 webRequest.onBeforeRequest 取消页面,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29393189/

相关文章:

javascript - 通过 `href` `onmousedown` 事件更改 ,`click` s 链接

javascript - 如何调用对象文字中作为参数接收的方法

javascript - 如何将 Ember 添加到 Phonegap 中的 onDeviceReady 事件?

javascript - 根据图像位置目录附加 CSS 样式

javascript - 如何在 javascript 上访问 HTML 输入元素

javascript - 使用 jQuery 平滑跨浏览器对 Angular 线滚动

德尔福嵌入式 Chrome

google-chrome - 谷歌浏览器中的溢出问题

javascript - 我应该读/写 XML 文件以将数据保存在本地 Chrome 扩展程序中吗?

javascript - Chrome 扩展开发 : Message passing Problem