Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/454.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript jQuery.ajax调用在Chrome扩展中失败_Javascript_Jquery_Google Chrome_Google Chrome Extension - Fatal编程技术网

Javascript jQuery.ajax调用在Chrome扩展中失败

Javascript jQuery.ajax调用在Chrome扩展中失败,javascript,jquery,google-chrome,google-chrome-extension,Javascript,Jquery,Google Chrome,Google Chrome Extension,我正在将我的一个Firefox扩展移植到Chrome上,我遇到了一个AJAX查询的小问题。以下代码在FF扩展中工作正常,但在Chrome中状态为“0”时失败 function IsImage(url) { var isImage = false; var reImageContentType = /image\/(jpeg|pjpeg|gif|png|bmp)/i; var reLooksLikeImage = /\.(jpg|jpeg|gif|png|bmp)/i;

我正在将我的一个Firefox扩展移植到Chrome上,我遇到了一个AJAX查询的小问题。以下代码在FF扩展中工作正常,但在Chrome中状态为“0”时失败

function IsImage(url) {
    var isImage = false;
    var reImageContentType = /image\/(jpeg|pjpeg|gif|png|bmp)/i;
    var reLooksLikeImage = /\.(jpg|jpeg|gif|png|bmp)/i;

    if(!reLooksLikeImage.test(url)) 
    {
        return false;
    }

    var xhr = $.ajax({
        async: false,
        type: "HEAD",
        url: url,
        timeout: 1000,
        complete : function(xhr, status) {
            switch(status)
            {
                case "success":
                    isImage = reImageContentType.test(xhr.getResponseHeader("Content-Type"));
                    break;
            }
        },
    });

    return isImage;
}
扩展的这个特定部分检查剪贴板上的内容(我已经解决了另一个Chrome问题),如果是图像URL,它会发送一个HEAD请求并检查“Content Type”响应头以确保它是图像。如果是这样,它将返回true,将剪贴板文本粘贴到IMG标记中。否则,如果它看起来像一个普通的URL,而不是一个图像,它会将其包装在一个标记中。如果它不是一个URL,它只是做一个简单的粘贴

无论如何,被检查的url肯定是一个图像,在FF中工作正常,但在完整函数中,xhr.status为“0”,函数完成时status为“error”。将超时时间增加到10秒没有帮助。我已验证测试图像在运行时应返回为“image/jpeg”:

curl -i -X HEAD <imageURL>
curl-i-X头

我也知道我应该使用success和error回调而不是complete,但是它们也不起作用。有什么想法吗?

检查您的清单文件。扩展是否具有访问该url的权限

如果这有助于解决第二个问题(或任何其他问题): 您可以向后台页面发送请求,如:

chrome.extension.sendRequest({var1: "var1value", var2: "value", etc}, 
 function(response) {
    //Do something once the request is done.
}); 
变量
response
可以是您想要的任何内容。它可以是一个success或deny字符串。由你决定

在背景页面上,您可以添加一个侦听器:

chrome.extension.onRequest.addListener(
function(request, sender, sendResponse) {
      // Do something here
      // Once done you can send back all the info via:
      sendResponse( anything you want here );

      // and it'll be passed back to your content script.
});

有了它,您可以将AJAX请求的响应传递回内容脚本,并在那里执行任何您想执行的操作。

我已经解决了部分问题,实际上是大部分问题。首先,正如Brennan和我昨天提到的,我需要在manifest.json中设置权限

"permissions": [
    "http://*/*",
    "https://*/*"
],
给每个域授予权限并不理想,但因为可以从任何域托管图像,所以必须这样做,而且我必须防止XSS

另一个问题是,Chrome确实阻止了content_scripts部分中的任何内容进行AJAX调用,并以静默方式失败。但是,如果您有后台页面,则后台页面上没有此类限制。该页面可以进行它想要的任何AJAX调用,Chrome有一个API允许您的脚本打开一个端口并将请求传递到该后台页面。有人编写了一个称为变通方法的脚本,我对其进行了修改,以获得适当的响应头。它起作用了


我现在唯一的问题是如何让脚本等待事件中设置的调用结果,而不是立即返回。

正如您所了解的,在内容脚本中,您不能执行任何跨域XHR。您必须在扩展页面(如后台、弹出窗口)中执行这些操作,甚至可以在选项中执行这些操作

有关内容脚本限制的更多信息,请参阅:

有关xhr限制的更多信息,请参阅:
公认的答案已过时

清单中需要允许相关URL:

{
  "name": "My extension",
  ...
  "permissions": [
    "http://www.google.com/"
  ],
  ...
}
您还可以使用以下表达式:

"http://*.google.com/"
"http://*/"
以获取更多常规权限


这可能是对来自Extension的所有AJAX请求的安全限制吗?
不应该返回isImage是完整回调的一部分吗?@pixieline:可以。这只是为了有一个返回点,但它甚至没有走那么远,因为开关(状态)为“错误”,所以该分支从未被调用。@Ivan:我打赌这就是问题所在,但除了alert()调用之外,我还没有弄清楚登录Chrome,所以我不确定它是否在默默地失败或者是否存在其他问题。xhr.responseText也为空。是否确定键入“HEAD”
?文档说它应该是GET或POST,其他的是允许的,但不是所有浏览器都支持。这可能是因为它在FF中工作,但在chrome中不工作。这是问题之一。另一个原因是内容脚本不能发送AJAX请求。但是,背景页面可以,我将在我自己的回答中解释。对于在这个页面上绊倒的任何人来说,这是嘿,这不再适用,内容脚本现在可以发出xml请求,请参阅我的回答。