【发布时间】:2009-12-23 20:40:33
【问题描述】:
我正在将我的一个 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,它会将其包装在 A 标记中。如果它不是一个 URL,它只是做一个简单的粘贴。
无论如何,被检查的url肯定是一个图像,在FF中可以正常工作,但是在完整的函数中,xhr.status为“0”,函数完成时状态为“error”。将超时时间增加到 10 秒并没有帮助。我已经验证测试图像在运行时应该返回为“image/jpeg”:
curl -i -X HEAD <imageURL>
我也知道我应该使用成功和错误回调而不是完成,但它们也不起作用。有什么想法吗?
【问题讨论】:
-
可能是对所有来自扩展的 AJAX 请求的安全限制吗?
-
不应该
return isImage;是完整回调的一部分吗? -
@pixieline:可以。那只是有一个返回点,但它甚至没有走那么远,因为 switch(status) 是“错误”,因此永远不会调用该分支。
-
@Ivan:我打赌这就是问题所在,但除了 alert() 调用之外,我还没有想出登录 Chrome,所以我不确定它是静默失败还是有其他一些问题。 xhr.responseText 也是空白的。
-
你确定
type: "HEAD"吗?文档说它应该是 GET 或 POST,其他是允许的,但并非所有浏览器都支持。可能就是这种情况,因为它在 FF 中有效,但在 chrome 中无效。
标签: javascript jquery google-chrome google-chrome-extension