图像属性是DOM的一部分(jQuery – webkit与其他浏览器不一致)吗?

我使用jQuery在Chrome和Safari上遇到了一个问题,使用一条图像的宽度进行一些计算。

使用我的计算时:

$(document).ready(function() { /* some calculations with $("img").width() */ }); 

在IE6 +和Firefox中一切正常,但它不适用于Chrome和Safari:$(img).width()是0,无论图像是否已经缓存。

使用:

 $(window).load(function() { /* some calculations with $("img").width() */ }); 

它适用于所有上述浏览器,但问题是它只在所有图像完全加载时才开始。

webkit行为是预期的行为还是有一些webkit / jQuery错误导致图像属性不是DOM的一部分?

如果它是webkit / jQuery的问题:有没有办法让我的脚本比上面提到的解决方案更早执行?

顺便说一句,我没有使用图像尺寸的任何内联属性。

尝试在img标记中指定尺寸:

  

快速谷歌搜索: http : //www.websiteoptimization.com/speed/tweak/size/

我推断的是因为没有加载图像,webkit只会将0作为“未知”大小返回,直到图像被加载。 具体说明大小可能会解决这个问题。

我觉得这更像是hack-ish方式,但它似乎有效(从我测试过):

 function callback(){ var el = $(this); // if this element was processed or width is 0 (for webkit), then skip if(el.data('loaded') || el.width() === 0) return; el.data('loaded', 1); // marked this element as "processed" // do whatever you want to do with el.width() console.log(el.width()); } $(function(){ // Non-webkit-based browsers will call callback() here // otherwise, after each image loads, the callback will execute // (for webkit browsers), when the size will be correct. $('img').load(callback).each(callback); }) 

Webkit浏览器仍然会比其他浏览器略慢,因为它是在每个图像完成加载后,但它比等待加载所有图像更快。

我不喜欢将任务卸载到应该在服务器上处理的客户端。

真正的解决方案是在将图像大小添加到数据库时计算图像大小,然后在将宽度和高度属性发送到客户端之前正确生成标记。

在初始计算中产生的任何开销(以及之后从数据库中提取值)与首先将其上载到数据库的过程相比将是微不足道的 – 更不用说以后随后每次检索它。

结果是一个语义上有意义的HTML标记,可以在你关心的所有浏览器中使用jQuery,那么为什么要避免呢?

我在使用.load()动态加载图像时发现了这种指定图像大小的方法,我使用带回调的图像加载function

 loadImage: function(src, callback){ $("").attr("src", src).load(callback); } 

然后我可以使用img-element(报告正确的大小)来设置回调内的img-attributes

 $(this).attr({ id: img, width: this.width, height: this.height }); 

现在我可以使用,例如,使用适当的widht和高度

 var contentWidth = $("#img").attr("width");