2014-11-20 2 views
0

Я стараюсь, чтобы получить высоту/ширину от некоторых фоновых изображений, но как получить эти значения в некоторых переменныеЗначение, возвращаемое из image.onload (функция() является 0 или не определен

var bgobj = jQuery(this); // assigning the object   
    var url = bgobj.css('background-image').replace(/url\(|\)$|"/ig, ''); 

    var img = new Image(); 

    img.src = url; 

Вариант 1?: .

alert('img.width: ' + img.width); // alert: " img.width: 0 " 

Возможно, изображение не загружается Так что я стараюсь OnLoad: вариант 2:

jQuery(bgimg).on('load', function() { 
      height = jQuery(bgimg).height(); 
      //alert('height ' + height); //'480px' which is correct! 
    }); 

Невозможно получить выгоду для дальнейшего использования !? Поэтому я стараюсь обратного вызова: Вариант 3:

 var imageSize = function(url, callback) { 

      var img = new Image(); 
      img.onload = function(){ 

       var response = {}; 
       var img = new Image(); 
       img.onload = function() { 
        var x = img.width; 
        var y = img.height; 
        var z = y/x; 
        response = {width:x,height:y}; 
        if(callback) callback(response); 
       } 
       img.src = url; 
      }    
      img.onload();    

    } 
    var getSize = function(url, callback) { 
     imageSize(url, function(response) { 
      var dim = response; 
     }) 
     callback(dim); 
    } 
    var h; 
    imageSize(img.src, function(response) { 
      h=response.height; 
      //alert(h); // 800px (OK)) 
    }) 
    //alert(h); //undefined  
    //alert(imageSize.height); //undefined 
    //alert(imageSize.h); //undefined 
    //alert(imageSize.response.h); //undefined 

Все еще не способ получить значение в обычной переменной. Где я ошибся?

+0

Ваша единственная проблема - неотъемлемый асинхронный характер этой проблемы. Браузер должен загрузить изображение, прежде чем вы сможете получить доступ к каким-либо его свойствам. Таким образом, вы не сможете получить размеры этого изображения в строго синхронизированном рабочем процессе. – Sirko

ответ

1

Вы слишком усложнили его, но вариант 3 - один способ сделать это.

var imageSize = function(url, callback) { 
 
    var img = new Image(); 
 
    img.onload = function(){   
 
     if(callback) callback(img.width,img.height);  
 
    } 
 
    img.src = url;  
 
} 
 

 
$(function(){ 
 
    var url = $('#foo').css('background-image').replace(/url\(|\)$|"/ig, ''); 
 
    imageSize(url,function(w,h){ 
 
     alert("width=" + w + ", height=" + h); 
 
    }) 
 
});
#foo{ 
 
    background-image:url(http://lorempixel.com/100/100/) 
 
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> 
 
<div id="foo">test</div>

Важно помнить, что метод imageSize является асинхронным, так что вы должны передать его обратного вызова, которая будет вызвана, когда изображение загружается. У вас нет другого метода, когда вы рассматриваете его как синхронный вызов, который просто не работает.

+0

Отлично! Единственное, что я пропустил сейчас, это как передать значения w и h в (глобальные) переменные вне этой функции? Почему-то я не могу найти объяснения. – knottulf

+0

@knottulf - Точно так же, как и в вашем примере, но это не имеет смысла. Эта переменная будет установлена ​​только после вызова callback, поэтому попытка прочитать их сразу после этого не будет работать. Любая работа, которую вам нужно делать с 'w' и' h', должна быть вызвана обратным вызовом. – Jamiec

+0

Что мне действительно нужно здесь, это ширина/высота пропорций, которые мне нужно повторно использовать. Например, чтобы разрешить перепозиционирование в прокрутке параллакса, изменение ориентации и многое другое. Так почему-то мне придется передать значения другим функциям? – knottulf