使用AJAX HTTP请求检索'favicon.ico'图像时出现问题

时间:2011-08-27 14:01:52

标签: jquery favicon

我正在使用Ruby on Rails v3.0.9和jQuery 1.6。我正在尝试从某些网站检索并显示favicon图像。

例如,为了对单个网站执行此操作,我使用以下代码:

$jQ.ajax({
  type:    'GET',
  url:     'http://www.facebook.com/favicon.ico',
  data:    '',
  error:   function(jqXHR, textStatus, errorThrown) {
    $jQ('#facebook_favicon').replaceWith('ERROR');
  },
  success: function(data, textStatus, jqXHR) {
    $jQ('#facebook_favicon').replaceWith("<img width='16px' height='16px' src='http://www.facebook.com/favicon.ico' />");
  }
});

我使用上面执行HTTP请求的代码来检查是否找到了favicon:如果是这样(在成功上),它将替换与HTML相关的#facebook_favicon使用刚刚找到的favicon.ico图片标记,否则将使用ERROR文字替换该图片。

但是,当我加载放置上述JavaScript的页面并检查Firebug控制台时,我得到以下内容:

firebug console errors

表示请求已成功执行(HTTP状态代码全部为200,但Gmail除外)但我无法在成功时显示图标图像为什么?有什么问题?

我注意到在Firebug响应中都是空白的,如下所示:

firebug console errors

我可以做些什么来完成我想做的事(我主要是指检查是否找到了网站的网站图标)


如果我使用如下代码,它将起作用,但它不会检查favicon存在:

$jQ('#facebook_favicon').replaceWith("<img width='16px' height='16px' src='http://www.facebook.com/favicon.ico' />");

2 个答案:

答案 0 :(得分:6)

您不能对与当前页面不在同一域/端口/协议上的URL执行XmlHttpRequests。

但是,您可以使用Image对象以及onload和onerror事件来检查图像是否存在:

var img = new Image;
var src = 'http://www.facebook.com/favicon.ico';
img.onload = function() {
    // the image exists, display it
};
img.src = src;

您可以将其包装在一个函数中:

function imageExists(src, callback) {
    var img = new Image;
    img.onload = function() {
        callback(src, true);
    };
    img.onerror = function() {
        callback(src, false);
    };
    img.src=src;
}

并像这样使用它:

imageExists('http://www.facebook.com/favicon.ico', function(src, exists) {
    if (exists) {
        $('body').append('<p>The image loaded correctly!</p>');
        $('<img>').attr('src', src).appendTo('body');
    } else {
        $('body').append('<p>oops, error</p>');
    }
});

在此测试:http://jsfiddle.net/YpBsJ/2/

答案 1 :(得分:0)

Same-origin-policy禁止跨域请求