Подтвердить что ты не робот

Получить высоту ширины удаленного изображения из URL-адреса

Таким образом, предупреждение дает значения undefined для ширины и высоты. Я думаю, что значения w и h изображения из расчета img.onload не передаются возвращаемым значениям, или они могут возвращать w и h до, когда onload вычисляет их:

function getMeta(url){
 var w; var h;
 var img=new Image;
 img.src=url;
 img.onload=function(){w=this.width; h=this.height;};
 return {w:w,h:h}    
}

// "http://snook.ca/files/mootools_83_snookca.png" //1024x678
// "http://shijitht.files.wordpress.com/2010/08/github.png" //128x128

var end = getMeta("http://shijitht.files.wordpress.com/2010/08/github.png");
var w = end.w;
var h = end.h;
alert(w+'width'+h+'height');

Как я могу показать предупреждение о правильной ширине и высоте?

http://jsfiddle.net/YtqXk/

4b9b3361

Ответ 1

Получить размер изображения с помощью jQuery

function getMeta(url){
    $("<img/>",{
        load : function(){
            alert(this.width+' '+this.height);
        },
        src  : url
    });
}

Получить размер изображения с помощью JavaScript

function getMeta(url){   
    var img = new Image();
    img.onload = function(){
        alert( this.width+' '+ this.height );
    };
    img.src = url;
}

Получить размер изображения с помощью JavaScript (современные браузеры, IE9 +)

function getMeta(url){   
    var img = new Image();
    img.addEventListener("load", function(){
        alert( this.naturalWidth +' '+ this.naturalHeight );
    });
    img.src = url;
}

Используйте приведенное выше просто как: getMeta( "http://example.com/img.jpg" );

https://developer.mozilla.org/en/docs/Web/API/HTMLImageElement

Ответ 2

Просто передайте обратный вызов как аргумент следующим образом:

function getMeta(url, callback) {
    var img = new Image();
    img.src = url;
    img.onload = function() { callback(this.width, this.height); }
}
getMeta(
  "http://snook.ca/files/mootools_83_snookca.png",
  function(width, height) { alert(width + 'px ' + height + 'px') }
);

Ответ 3

Переменные w и h в функции img.onload не совпадают с getMeta() функции getMeta(). Один из способов сделать это заключается в следующем:

Скрипка: http://jsfiddle.net/ppanagi/28UES/2/

function getMeta(varA, varB) {
    if (typeof varB !== 'undefined') {
       alert(varA + ' width ' + varB + ' height');
    } else {
       var img = new Image();
       img.src = varA;
       img.onload = getMeta(this.width, this.height);
    }
}


getMeta("http://snook.ca/files/mootools_83_snookca.png");

Ответ 4

ES6: Используя async/await вы можете выполнять нижеприведенную функцию getMeta в виде последовательности и использовать ее следующим образом (что практически идентично коду в вашем вопросе (я добавляю ключевое слово await и меняю переменную end на img, а меняю var на let ключевое слово let). Вам нужно запустить getMeta помощью await только из async функции (run).

function getMeta(url) {
    return new Promise((resolve, reject) => {
        let img = new Image();
        img.onload = () => resolve(img);
        img.onerror = reject;
        img.src = url;
    });
}

async function run() {

  let img = await getMeta("http://shijitht.files.wordpress.com/2010/08/github.png");

  let w = img.width;
  let h = img.height; 

  size.innerText = w+' width, '+h+' height';
  size.appendChild(img);
}

run();
<div id="size" />