我正在创建一个jQuery插件 .
如何在Safari中使用Javascript获得真实的图像宽度和高度?
以下适用于Firefox 3,IE7和Opera 9:
var pic = $("img")
// need to remove these in of case img-element has set width and height
pic.removeAttr("width");
pic.removeAttr("height");
var pic_real_width = pic.width();
var pic_real_height = pic.height();
但在像Safari和Google Chrome这样的Webkit浏览器中,值为0 .
30 回答
使用HTML5中的
naturalHeight
和naturalWidth
属性 .例如:
适用于IE9,Chrome,Firefox,Safari和Opera(stats) .
我查看了Dio的答案,它对我很有用 .
$('#image').fadeIn(10,function () {var tmpW = $(this).width(); var tmpH = $(this).height(); });
确保您调用所有功能 . 在fadeIn()的recaller函数中处理图像大小 .
谢谢你 .
正如卢克史密斯所说,image load is a mess . 它在所有浏览器上都不可靠 . 这个事实给了我很大的痛苦 . 在某些浏览器中,缓存的图像根本不会触发事件,因此那些说"image load is better than setTimeout"的人是错误的 .
Luke Smith的解决方案是here.
关于如何在jQuery 1.4中处理这个混乱,有an interesting discussion .
我发现将宽度设置为0非常可靠,然后等待“complete”属性为true,width属性大于零 . 你也应该注意错误 .
Webkit浏览器在加载图像后设置height和width属性 . 我建议使用图像的onload事件,而不是使用超时 . 这是一个简单的例子:
为了避免CSS可能对图像的尺寸产生任何影响,上面的代码会在内存中复制图像 . 这是FDisk建议的一个非常聪明的解决方案 .
您还可以使用
naturalHeight
和naturalWidth
HTML5属性 .我们如何在没有闪烁真实图像的情况下获得正确的尺寸:
它适用于<img class =“toreaddimensions”......
我的情况可能有点不同 . 我通过javascript动态更改图像的src,并且需要确保新图像的大小按比例调整以适合固定容器(在照片库中) . 我最初只是在加载图像后(通过图像的加载事件)删除了图像的宽度和高度属性,并在计算首选尺寸后重置这些属性 . 但是,这在Safari和IE浏览器中不起作用(我没有在IE中彻底测试过,但图像甚至没有显示,所以......) .
无论如何,Safari保留了上一个图像的尺寸,因此尺寸始终是一个图像 . 我认为这与缓存有关 . 所以最简单的解决方案就是克隆图像并将其添加到DOM(重要的是将它添加到DOM中获取with和height) . 为图像提供隐藏的可见性值(不要使用display none,因为它不起作用) . 获得维度后删除克隆 .
这是我使用jQuery的代码:
该解决方案无论如何都适用 .
偶然发现这个线程试图找到我自己的问题的答案 . 我试图在加载器之后的函数中获得图像的宽度/高度,并且不断提出0.我觉得这可能是你正在寻找的东西,因为它适用于我:
另一个建议是使用imagesLoaded plugin .
我使用不同的方法,只是使用Ajax调用服务器来获取图像对象时的图像大小 .
当然还有服务器端代码:
这适用于我(safari 3.2),通过在
window.onload
事件中触发:这是一个跨浏览器解决方案,可以在加载所选图像时触发事件:http://desandro.github.io/imagesloaded/您可以在imagesLoaded()函数中查找高度和宽度 .
最近我需要找到宽度和高度来设置表示图形的.dialog的默认大小 . 我使用的解决方案是:
对我来说,这适用于FF3,Opera 10,IE 8,7,6
附:您可能会在LightBox或ColorBox等插件中找到更多解决方案
如果图像已经使用过,那么你就会嗤之以鼻:
image.css('width','initial'); image.css('height','initial');
var originalWidth = $(this).width(); var originalHeight = $(this).height();
我已经使用imagesLoaded jquery插件完成了一些变通办法实用程序功能:https://github.com/desandro/imagesloaded
您可以通过传递url,函数及其上下文来使用它 . 加载图像后执行功能并返回创建的图像,宽度和高度 .
适用于您不想更改原始位置或图像的功能 .
您可以使用HTML图像元素的naturalWidth和naturalHeight属性 . (这里更多info) .
你会像这样使用它:
似乎这适用于所有浏览器,除了从版本8及更低版本的IE .
//此代码有助于显示200 * 274维度的图像
image.naturalHeight
和image.naturalWidth
属性怎么样?似乎工作得很好Chrome,Safari和Firefox中的版本,但在IE8甚至IE9中都没有 .
Jquery有两个名为naturalWidth和naturalHeight的属性,你可以这样使用 .
my-img是用于选择我的图像的类名 .
为了增加Xavi的答案,Paul Irish的github David Desandro's gitgub offers a function called imagesLoaded()以相同的原则工作,并解决了一些浏览器缓存图像的问题,没有触发.load()事件(使用聪明的original_src - > data_uri - > original_src切换) .
它被广泛使用和定期更新,这有助于它成为解决问题的最强大的解决方案,IMO .
这适用于跨浏览器
通过使用获得尺寸
干杯!
现在有一个jQuery插件
event.special.load
来处理缓存图像上的加载事件不会触发的情况:http://github.com/peol/jquery.imgloaded/raw/master/ahpi.imgload.js在接受的答案中有很多关于如果从WebKit缓存加载图像时
onload
事件不会触发的问题的讨论 .在我的情况下,
onload
触发缓存图像,但高度和宽度仍为0.一个简单的setTimeout
为我解决了这个问题:我不能说为什么
onload
事件即使从缓存加载图像时也会被触发(jQuery 1.4 / 1.5的改进?) - 但如果你仍然遇到这个问题,可能是我的答案和var src = img.src; img.src = ""; img.src = src;
的组合技术会起作用 .(请注意,就我的目的而言,我并不关心图像属性或CSS样式中的预定义尺寸 - 但您可能希望根据Xavi的答案删除它们 . 或者克隆图像 . )
您无需从图像或图像尺寸属性中删除样式 . 只需使用javascript创建一个元素并获取创建的对象宽度 .
如前所述,如果图像在缓存中,Xavi answer将不起作用 . 该问题响应webkit未在缓存的图像上触发加载事件,因此如果未在img标记中显式设置宽度/高度attrs,则获取图像的唯一可靠方法是等待
window.load
事件被触发 .window.load
事件将触发 always ,因此在没有任何技巧的情况下访问宽度/高度和img是安全的 .如果需要获取可能缓存(先前加载)的动态加载图像的大小,可以使用Xavi方法加上查询字符串来触发缓存刷新 . 缺点是它将导致另一个请求到服务器,对于已经缓存并且应该已经可用的img . 愚蠢的Webkit .
ps:如果
img.src
中已有QueryString,则必须parse it并添加额外的参数以清除缓存 .在github中查看此存储库!
使用Javascript检查宽度和高度的绝佳示例
https://github.com/AzizAK/ImageRealSize
---一些评论要求编辑..
Javascript代码:
和HTML代码:
根本问题是WebKit浏览器(Safari和Chrome)并行加载JavaScript和CSS信息 . 因此,JavaScript可以在计算CSS的样式效果之前执行,返回错误的答案 . 在jQuery中,我发现解决方案是等到document.readyState =='complete', . e.g . ,
就宽度和高度而言...取决于你正在做什么,你可能想要offsetWidth和offsetHeight,其中包括边框和填充等内容 .
来自Chris的评论:http://api.jquery.com/load-event/
这适用于缓存和动态加载的图像 .
要使用此脚本:
演示:http://jsfiddle.net/9543z/2/
您可以使用Javascript以编程方式获取图像并检查尺寸,而不必弄乱DOM .