Javascript jQuery.ajax调用在Chrome扩展中失败
我正在将我的一个Firefox扩展移植到Chrome上,我遇到了一个AJAX查询的小问题。以下代码在FF扩展中工作正常,但在Chrome中状态为“0”时失败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;
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请求,请参阅我的回答。