图像属性是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");