Существует ли 'готовое' событие, запущенное, когда элемент jQuery создается на лету?

Я пытаюсь реализовать что-то как фото кольцевая галерея в jQuery. Эта кольцевая галерея могла быть заполнена изображениями с помощью массива источников изображения (я выполняю ajax запрос, который возвращает json с этими данными), и, однажды заполнено, можно назвать несколько методов, предыдущих () и затем () для перемещения кольцевой галереи назад и вперед соответственно.

Вещь состоит в том, что эта функциональность уже реализована и работа, но я не могу решить проблему об изменении размеров процесса. Для избегают, чтобы изображения превысили границы контейнера, у меня есть метод для создания и изменения размеров изображений в случае необходимости.

this.getImageResized = function(imageSrc) {

    var image = $('<img />', {src : imageSrc});

    // Container ratio
    var ratio = this.itemMaxWidth / this.itemMaxHeight;

    // Target image ratio is WIDER than container ratio
    if((image[0].width / image[0].height) > ratio) {
        if(image[0].width > this.itemMaxWidth) {
            image.css('width', this.itemMaxWidth + 'px');
            image.css('height', 'auto');
        }
    // HIGHER
    } else {
        if(image[0].height > this.itemMaxHeight) {
            image.css('width', 'auto');
            image.css('height', this.itemMaxHeight + 'px');
        }
    }

    // Embeds image into a wrapper with item's width and height
    var wrapper = $('<span style="display : block; float : left; width : ' + this.itemMaxWidth + 'px; height : ' + this.itemMaxHeight + 'px"></span>');

    image.appendTo(wrapper);

    return wrapper;
};

Тестируя эту функцию, я нашел, что иногда, изображения не изменены как ожидалось. Я использовал поджигателя console.log () для входа изображения [0] .width чуть ниже создания элемента jQuery, узнавая, что иногда значение 0.

Я не эксперт по jQuery, но я предполагаю, что то, когда это происходит (значение 0), - то, потому что элемент не готов.

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

Действительно ли что-то вроде этого возможно?

var image = $('<img />', {src : imageSrc}).ready(function() {
    // But image[0].width it's not available here!
});

Спасибо за помощь!

7
задан Roberto Adarve 22 June 2010 в 21:36
поделиться

3 ответа

В этом случае вы хотите использовать событие load , например:

var image = $('<img />', {src : imageSrc}).one('load', function() {
  // use this.width, etc
}).each(function() {
  if(this.complete) $(this).load();
});

Последний бит запускает событие load , если оно еще не было запущено ... чего не происходит в некоторых браузерах при загрузке изображения из кеша, используя .one ( ) , чтобы запустить его только один раз, и .complete , чтобы проверить, загружен ли он.

4
ответ дан 7 December 2019 в 12:14
поделиться

Согласно предоставленному ответу здесь , я собрал рабочую демонстрацию:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
 <head>
  <script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.4.2/jquery.js"></script>
  <script type="text/javascript">
   //<![CDATA[
    $(window).load(function(){
     //window load already fired
     setTimeout(function(){ 
      var img=$('<img />'); 
      img.appendTo($("body"));
      img.load(function(){alert("img is "+$(this).width()+"px wide.")});
     },5000) //5 secs delay. definitely adding "dinamically" 
      img.attr("src","http://sstatic.net/so/img/sprites.png");
    });
   //]]>
  </script>
 </head>
 <body>

 </body>
</html>
0
ответ дан 7 December 2019 в 12:14
поделиться

Нет совместимых с платформой способов проверить, готов ли объект DOM, см. https://developer.mozilla.org/en/DOM_Events , чтобы узнать о конкретных событиях для гекконов

1
ответ дан 7 December 2019 в 12:14
поделиться
Другие вопросы по тегам:

Похожие вопросы: