我也看到了这个问题,这真的很令人讨厌。
据我所知,Chrome 会在您访问 URL 后填充 chrome://favicon/ 缓存(如果有,则省略 URL 的 #hash 部分)。它似乎通常在页面完全加载后的某个时间填充此缓存。如果您在相关页面完全加载之前尝试访问 chrome://favicon/ http://yoururl.com ,您通常会返回默认的“地球图标”。随后刷新您正在显示图标的页面将修复它们。
因此,如果可以的话,可能只是在向用户显示图标之前刷新您正在显示图标的页面,这可能会起到修复的作用。
在我的用例中,我实际上是在打开要从中获取网站图标的选项卡。到目前为止,我发现获得它们的最可靠方法大致如下:
chrome.webNavigation.onCompleted.addListener(onCompleted);
function onCompleted(details)
{
if (details.frameId > 0)
{
// we don't care about activity occurring within a subframe of a tab
return;
}
chrome.tabs.get(details.tabId, function(tab) {
var url = tab.url ? tab.url.replace(/#.*$/, '') : ''; // drop #hash
var favicon;
var delay;
if (tab.favIconUrl && tab.favIconUrl != ''
&& tab.favIconUrl.indexOf('chrome://favicon/') == -1) {
// favicon appears to be a normal url
favicon = tab.favIconUrl;
delay = 0;
}
else {
// couldn't obtain favicon as a normal url, try chrome://favicon/url
favicon = 'chrome://favicon/' + url;
delay = 100; // larger values will probably be more reliable
}
setTimeout(function() {
/// set favicon wherever it needs to be set here
console.log('delay', delay, 'tabId', tab.id, 'favicon', favicon);
}, delay);
});
}
这种方法在大约 95% 的时间为新 URL 返回正确的网站图标,使用延迟 = 100。如果您可以接受,增加延迟会提高可靠性(我的用例使用 1500 毫秒,并且在新 URL 上错过了 <1% 的时间;当同时打开许多选项卡时,这种可靠性会恶化)。显然,这是使其工作的一种非常不精确的方法,但它是迄今为止我想出的最好的方法。
另一种可能的方法是从http://www.google.com/s2/favicons?domain=somedomain.com中提取网站图标。我不太喜欢这种方法,因为它需要访问外部网络,依赖于无法保证启动的服务,并且本身有些不可靠;我已经看到它不一致地返回 www.domain.com URL 的“地球”图标,但只返回 domain.com 的正确图标。
希望这在某种程度上有所帮助。