2015-05-08 2 views
0

Я в настоящее время получаю размер некоторых изображений в операторе each().Выполнение JQuery Bind Synchronously

Я привязываю функцию к этому событию загрузки. Хотя, мне нужно, чтобы получить высоту изображения, прежде чем продолжить выполнение кода.

$(window).load(function() { 

     $("element").each(function() { 
      /* 
      . 
      . 
      . 
      . 
      */ 
      var containerHeight = $(this).height(); 
      var imgHeight = 0; 

      //get the size of the full image. 
      var imgLoad = $("<img />"); 
      imgLoad.attr("src", imgSrc); 
      imgLoad.bind("load", function() { imgHeight = this.height; }); 

      heightDiff = (imgHeight - containerHeight); 

      //some methods are called... 
      //imgHeight is still set to 0 
     }); 
}); 

Я рассматривал .trigger("custom-event")

, а затем проверить, если она была вызвана с Jquerys .when() методом

Но есть проще (если не лучше) способ сделать это?

С уважением,

+0

какова фактическая потребность –

+2

Это звучит как XY проблема. Что именно вы должны достичь? –

+0

весь код, который зависит от 'imgHeight' должен быть внутри обратного вызова нагрузки –

ответ

0

Я думаю, что ваш делать это почти правильно, window.load срабатывает, когда все элементы (в том числе изображений) загружаются. чтобы получить высоту каждого использования что-то вроде изображения:

$(window).load(function(){ 

    // triggered when images are loaded 

    $('img').each(function() { 

      // get the height of each image 
      var height = $(this).height(); 

     }); 
}); 
+0

Я вроде как взломаю. поскольку изображения являются фоновым изображением. –

+0

, чтобы получить размер фонового изображения с javascript, здесь ответят: http://stackoverflow.com/questions/3098404/get-the-size-of-a-css-background-image-using-javascript – Michiel

+0

Этот код имеет синтаксические ошибки. – Tomalak

1

В очень классический "how can I return values from an asynchronous function" проблему.

Вы не можете, период. Использовать обратные вызовы.

$("element").each(function() { 
    var containerHeight = $(this).height(), 
     imgSrc = "something"; 

    $("<img />", { src: imgSrc }) 
    .appendTo("#whatever") 
    .on("load", function() { 
     var $img = $(this), 
      heightDiff = ($img.height() - containerHeight); 

     //some methods are called... 
    }); 
}); 
0

Вы не можете договориться загрузка изображения будет сделано синхронно, так что вы должны сделать всю работу в функции нагрузки обратного вызова событие:

var imgLoad = new Image(); 
imgLoad.onload = function() { 
    var imgHeight = this.height, 
    heightDiff = (imgHeight - containerHeight); 
    // do stuff here 
}; 
imgLoad.src = imgSrc; // load image