Fra*_*ter 275 javascript safari jquery webkit google-chrome
我正在创建一个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.
Xav*_*avi 354
Webkit浏览器在加载图像后设置height和width属性.我建议使用图像的onload事件,而不是使用超时.这是一个简单的例子:
var img = $("img")[0]; // Get my img elem
var pic_real_width, pic_real_height;
$("<img/>") // Make in memory copy of image to avoid css issues
    .attr("src", $(img).attr("src"))
    .load(function() {
        pic_real_width = this.width;   // Note: $(this).width() will not
        pic_real_height = this.height; // work for in memory images.
    });
为了避免CSS可能对图像的尺寸产生任何影响,上面的代码会在图像的内存中复制.这是FDisk建议的一个非常聪明的解决方案.
您还可以使用naturalHeight和naturalWidthHTML5属性.
san*_*rom 280
使用HTML5中的naturalHeight和naturalWidth属性.
例如:
var h = document.querySelector('img').naturalHeight;
适用于IE9 +,Chrome,Firefox,Safari和Opera(统计数据).
FDi*_*isk 60
function getOriginalWidthOfImg(img_element) {
    var t = new Image();
    t.src = (img_element.getAttribute ? img_element.getAttribute("src") : false) || img_element.src;
    return t.width;
}
您无需从图像或图像尺寸属性中删除样式.只需使用javascript创建一个元素并获取创建的对象宽度.
小智 16
根本问题是WebKit浏览器(Safari和Chrome)并行加载JavaScript和CSS信息.因此,JavaScript可以在计算CSS的样式效果之前执行,返回错误的答案.在jQuery中,我发现解决方案是等到document.readyState =='complete',.eg,
jQuery(document).ready(function(){
  if (jQuery.browser.safari && document.readyState != "complete"){
    //console.info('ready...');
    setTimeout( arguments.callee, 100 );
    return;
  } 
  ... (rest of function) 
就宽度和高度而言...取决于你正在做什么,你可能想要offsetWidth和offsetHeight,其中包括边框和填充等内容.
JKS*_*JKS 16
在接受的答案中有很多关于onload如果从WebKit缓存加载图像时事件不会触发的问题的讨论.
在我的情况下,onload火灾缓存图像,但高度和宽度仍为0.一个简单的setTimeout解决了我的问题:
$("img").one("load", function(){
    var img = this;
    setTimeout(function(){
        // do something based on img.width and/or img.height
    }, 0);
});
onload即使从缓存加载图像(jQuery 1.4/1.5的改进?),我也无法说出为什么事件会被触发 - 但是如果你仍然遇到这个问题,可能我的答案和var src = img.src; img.src = ""; img.src = src;技术的组合将会工作.
(请注意,就我的目的而言,我并不关心图像属性或CSS样式中的预定义尺寸 - 但您可能希望根据Xavi的答案删除它们.或者克隆图像.)
Owe*_*wen 11
这适用于我(safari 3.2),通过在window.onload事件中解雇:
$(window).load(function() {
  var pic = $('img');
  pic.removeAttr("width"); 
  pic.removeAttr("height");
  alert( pic.width() );
  alert( pic.height() );
});
您可以通过编程方式获取图像并使用Javascript检查尺寸,而无需使用DOM.
var img = new Image();
img.onload = function() {
  console.log(this.width + 'x' + this.height);
}
img.src = 'http://www.google.com/intl/en_ALL/images/logo.gif';
怎么样image.naturalHeight和image.naturalWidth属性?
似乎可以在Chrome,Safari和Firefox中使用很多版本,但在IE8甚至IE9中都没有.
我们如何在没有闪烁真实图像的情况下获得正确的尺寸:
(function( $ ){
   $.fn.getDimensions=function(){
         alert("First example:This works only for HTML code without CSS width/height definition.");
         w=$(this, 'img')[0].width;
         h=$(this, 'img')[0].height;
         alert("This is a width/height on your monitor: " + $(this, 'img')[0].width+"/"+$(this, 'img')[0].height);
         //This is bad practice - it shows on your monitor
         $(this, 'img')[0].removeAttribute( "width" );
         $(this, 'img')[0].removeAttribute( "height" );
         alert("This is a bad effect of view after attributes removing, but we get right dimensions: "+  $(this, 'img')[0].width+"/"+$(this, 'img')[0].height);
         //I'am going to repare it
         $(this, 'img')[0].width=w;
         $(this, 'img')[0].height=h;
         //This is a good practice - it doesn't show on your monitor
         ku=$(this, 'img').clone(); //We will work with a clone
         ku.attr( "id","mnbv1lk87jhy0utrd" );//Markup clone for a final removing
         ku[0].removeAttribute( "width" );
         ku[0].removeAttribute( "height" );
         //Now we still get 0
         alert("There are still 0 before a clone appending to document: "+ $(ku)[0].width+"/"+$(ku)[0].height);
         //Hide a clone
         ku.css({"visibility" : "hidden",'position':'absolute','left':'-9999px'}); 
         //A clone appending
         $(document.body).append (ku[0]);
         alert("We get right dimensions: "+ $(ku)[0].width+"/"+$(ku)[0].height);
         //Remove a clone
         $("#mnbv1lk87jhy0utrd").remove();
         //But a next resolution is the best of all. It works in case of CSS definition of dimensions as well.
         alert("But if you want to read real dimensions for image with CSS class definition outside of img element, you can't do it with a clone of image. Clone method is working with CSS dimensions, a clone has dimensions as well as in CSS class. That's why you have to work with a new img element.");
         imgcopy=$('<img src="'+ $(this, 'img').attr('src') +'" />');//new object 
         imgcopy.attr( "id","mnbv1lk87jhy0aaa" );//Markup for a final removing
         imgcopy.css({"visibility" : "hidden",'position':'absolute','left':'-9999px'});//hide copy 
         $(document.body).append (imgcopy);//append to document 
         alert("We get right dimensions: "+ imgcopy.width()+"/"+imgcopy.height());
         $("#mnbv1lk87jhy0aaa").remove();
   }
})( jQuery );
$(document).ready(function(){
   $("img.toreaddimensions").click(function(){$(this).getDimensions();});
});
它适用于<img class ="toreaddimensions"......
jQuery具有两个属性naturalWidth和naturalHeight,您可以通过这种方式使用。
$('.my-img')[0].naturalWidth 
$('.my-img')[0].naturalHeight
其中my-img是用于选择我的图像的类名。
| 归档时间: | 
 | 
| 查看次数: | 377955 次 | 
| 最近记录: |