You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

jQuery鼠标悬停检测外部图片存在性:首次触发显示异常排查

问题分析与解决方案

兄弟,你猜的完全没错!问题的核心就是图片加载的异步特性——你刚给image.src赋值就立刻去读取image.width,这时候外部图片还在网络请求加载中,所以第一次拿到的宽度肯定是0,自然触发了默认图的逻辑;第二次悬停时,图片已经被浏览器缓存了,加载瞬间完成,width就能正常获取,所以显示正常图片。

为什么原代码失效?

当你执行image.src = urllink时,浏览器会异步发起图片加载请求,这个过程不会阻塞后续代码执行。所以紧接着的var imagewidth = image.width拿到的是图片元素的初始默认值0,而非实际加载后的宽度,导致第一次判断错误。

正确的解决方案:利用图片的加载事件

图片元素自带onload(加载成功)和onerror(加载失败)事件,这是判断外部图片是否存在最可靠的方式,而且不受跨域限制(图片资源的跨域加载是浏览器允许的,不像AJAX请求会被CORS拦截)。

修改后的代码如下:

var image = new Image();
// 图片加载成功时,设置目标图片
image.onload = function() {
  $('#cardpicture').attr('src', urllink);
};
// 图片加载失败(比如不存在、404)时,显示默认图
image.onerror = function() {
  $('#cardpicture').attr('src', '../noimg.png');
};
// 最后再设置src,确保事件绑定完成后再触发加载
image.src = urllink;

补充说明

  • 为什么AJAX HEAD方法不行?因为跨域情况下,浏览器的同源策略会拦截AJAX请求,除非目标服务器配置了允许你域名访问的CORS响应头,而图片资源的加载不受这个限制,所以用图片自身的加载事件是最优解。
  • 如果你担心重复加载图片,可以在悬停事件里做个简单的缓存判断,比如记录已经检测过的图片URL状态,避免重复发起请求。

内容的提问来源于stack exchange,提问作者hillcode

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.12 04:40:07