Я пытаюсь реализовать что-то как фото кольцевая галерея в 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!
});
Спасибо за помощь!
В этом случае вы хотите использовать событие load
, например:
var image = $('<img />', {src : imageSrc}).one('load', function() {
// use this.width, etc
}).each(function() {
if(this.complete) $(this).load();
});
Последний бит запускает событие load
, если оно еще не было запущено ... чего не происходит в некоторых браузерах при загрузке изображения из кеша, используя .one ( )
, чтобы запустить его только один раз, и .complete
, чтобы проверить, загружен ли он.
Согласно предоставленному ответу здесь , я собрал рабочую демонстрацию:
<!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>
Нет совместимых с платформой способов проверить, готов ли объект DOM, см. https://developer.mozilla.org/en/DOM_Events , чтобы узнать о конкретных событиях для гекконов