Не удается получить ширину изображения при загрузке изображения в IE - PullRequest
11 голосов
/ 17 декабря 2010

У меня есть функция изменения размера изображения, которая изменяет размер изображения пропорционально. На каждом изображении загрузите вызов этой функции с изображением и измените размер, если его ширина или высота больше, чем моя максимальная ширина и максимальная высота. Я могу получить img.width и img.height в FF Chrome Opera Safari, но IE не работает. Как я могу справиться с этим?

Позвольте мне объяснить с помощью кода.

<img src="images/img01.png" onload="window.onImageLoad(this, 120, 120)" />

function onImageLoad(img, maxWidth, maxHeight) {
     <b><i>var width = img.width;</i></b> // Problem is in here
     <b><i>var height = img.height</i></b> // Problem is in here
}

В моих выделенных строках img.width не работает на IE серии.

Есть предложения?

Спасибо.

Ответы [ 8 ]

22 голосов
/ 25 июля 2013

Не используйте width и height. Вместо этого используйте naturalWidth и naturalHeight. Они предоставляют немасштабированные пиксельные размеры изображения из файла изображения и будут работать в разных браузерах.

4 голосов
/ 18 июля 2011

Человек, я искал это 2 дня.Спасибо.

Я использую jQuery, но это не имеет значения.Проблема связана с JavaScript в IE.

Мой предыдущий код:

var parentItem = $('<div/>')
   .hide();      // sets display to 'none'

var childImage = $('<img/>')
   .attr("src", src)
   .appendTo(parentItem)   // sets parent to image
   .load(function(){
      alert(this.width);  // at this point image is not displayed, because parents display parameter is set to 'none' - IE gives you value '0'
   });

Это работает в FF, Opera и Safari, но не IEЯ получаю «0» в IE.

Обходной путь для меня:

var parentItem = $('<div/>')
   .hide();

var childImage = $('<img/>')
   .attr("src", src)
   .load(function(){
      alert(this.width);  // at this point image css display is NOT 'none'  - IE gives you correct value
      childImage.appendTo(parentItem);   // sets parent to image
   });
3 голосов
/ 26 ноября 2012

Вот как я это решил (потому что это единственный js на сайте, который я не хотел использовать в библиотеке).

    var imageElement = document.createElement('img');
    imageElement.src = el.href; // taken from a link cuz I want it to work even with no script
    imageElement.style.display      = 'none';

    var imageLoader = new Image();
    imageLoader.src = el.href;
    imageLoader.onload = function() {
        loaderElement.parentElement.removeChild(loaderElement);
        imageElement.style.position     = 'absolute';
        imageElement.style.top          = '50%';
        imageElement.style.left         = '50%';
        // here using the imageLoaders size instead of the imageElement..
        imageElement.style.marginTop    = '-' + (parseInt(imageLoader.height) / 2) + 'px';
        imageElement.style.marginLeft   = '-' + (parseInt(imageLoader.width) / 2) + 'px';
        imageElement.style.display      = 'block';
    }
1 голос
/ 24 апреля 2016

Попробуйте

 function onImageLoad(img, maxWidth, maxHeight) {
   var width = img.width; // Problem is in here
   var height = img.height // Problem is in here
   if (height==0  && img.complete){
       setTimeOut(function(){onImageLoad(img, maxWidth, maxHeight);},50);
   }

 }
1 голос
/ 27 ноября 2012

Это потому, что IE не может рассчитать ширину и высоту display: none изображений. Вместо этого используйте visibility: hidden.

0 голосов
/ 23 июля 2014
getDisplay().getImage().setUrl(imgURL);
final Image img = new Image(imgURL);
int w=img.getWidth();
int h=img.getHeight();
0 голосов
/ 17 декабря 2010

Я бы попробовал это:

function onImageLoad(img, maxWidth, maxHeight) {
   var width, height;
   if ('currentStyle' in img) {
     width = img.currentStyle.width;
     height = img.currentStyle.height;
   }
   else {
     width = img.width;
     height = img.height;
   }
   // whatever
}

изменить & mdash; и, очевидно, если бы я попробовал, я бы узнал, что это не работает :-) Хорошо, хорошо, "ширина" и "высота" определенно кажутся атрибутами <img> элементов в том, что касается IE. Возможно, проблема в том, что событие load запускает элемент не в то время. Чтобы проверить, так ли это, я бы попробовал это:

function onImageLoad(img, maxWidth, maxHeight) {
   var width, height;
   var i = new Image();
   i.onload = function() {
     width = i.width; height = i.height;
     // ... stuff you want to do ...
   };
   i.src = img.href;
}
0 голосов
/ 17 декабря 2010
    var screenW = screen.width;
    var screenH = screen.height;
    //alert( screenW );
    function checkFotoWidth( img, maxw )
    {
        if( maxw==undefined)
            maxw = 200;
        var imgW = GetImageWidth(img.src);
        var imgH = GetImageHeight(img.src);
            //alert(GetImageWidth(img.src).toString()); // img.width); // objToString(img));
        if (imgW > maxw || (img.style.cursor == "hand" && imgW == maxw))
        {
            if (imgW > screenW) winW = screenW;
            else winW = imgW;

            if (imgH > screenH) winH = screenH;
            else winH = imgH;

            img.width=maxw;
            img.style.cursor = "pointer";

            img.WinW = winW;
            img.WinH = winH;
            //alert("winW : " + img.WinW);
            img.onclick = function() { openCenteredWindow("Dialogs/ZoomWin.aspx?img=" + this.src, this.WinW, this.WinH, '', 'resizable=1'); }
            img.alt = "Klik voor een uitvergroting :: click to enlarge :: klicken Sie um das Bild zu vergrössern";
            //alert("adding onclick);
        }
    }

    function GetImageWidth(imgSrc) 
    {
        var img = new Image();
        img.src = imgSrc;
        return img.width;
    } 

    function GetImageHeight(imgSrc) 
    {
        var img = new Image();
        img.src = imgSrc;
        return img.height;
    } 
...