Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 26.04.2018, 18:59
Новичок на форуме
Отправить личное сообщение для IlCF Посмотреть профиль Найти все сообщения от IlCF
 
Регистрация: 26.04.2018
Сообщений: 3

Свойства naturalHeight(Width) равны нулю
Доброго времени суток!

Я новичок, потому прошу сильно не ругать, если "дело было не в бобине"
Имеется вот такой код:
var bgimg = new Image();
bgimg.src = 'img/'+picturesNames[currentPic]+'.jpg';
imgWidth = bgimg.naturalWidth;
imgHeight = bgimg.naturalHeight;

console.log(bgimg);
console.log(imgWidth + 'x' + imgHeight);
console.log(bgimg.naturalWidth + 'x' + bgimg.naturalHeight);

После загрузки страницы в консоли наблюдается такая картина:
https://javascript.ru/forum/attachme...d=152475765 3

При этом в самом объекте, если развернуть его свойства, naturalWidth и naturalHeight не нулевые:
https://javascript.ru/forum/attachme...d=152475765 3

Если эту же страницу перезагрузить, то всё нормализуется. Если страницу не перезагружать, а загрузить другую страницу с другим picturesNames[currentPic], а потом снова перейти на предыдущую страницу, то она тоже сработает правильно.

Бьюсь второй день, изобретать "костыли" и идти в обход не хочу, т.к. хочу понять, в чём причина ошибки. Буду признателен за помощь.

P.S. Что-то не могу разобраться, как тут картинки правильно в текст вставлять, сорри.
Изображения:
Тип файла: jpg js_1.jpg (32.7 Кб, 4 просмотров)
Тип файла: jpg js_2.jpg (71.7 Кб, 3 просмотров)
Ответить с цитированием
  #2 (permalink)  
Старый 26.04.2018, 19:00
Аватар для ruslan_mart
Профессор
Отправить личное сообщение для ruslan_mart Посмотреть профиль Найти все сообщения от ruslan_mart
 
Регистрация: 30.04.2012
Сообщений: 3,018

Потому что на тот момент картинка ещё не загрузилась (или не взялась из кеша).

var bgimg = new Image();

bgimg.onload = function() {
   console.log(bgimg.naturalWidth + 'x' + bgimg.naturalHeight);
};

bgimg.src = 'img/'+picturesNames[currentPic]+'.jpg';
Ответить с цитированием
  #3 (permalink)  
Старый 26.04.2018, 19:10
Новичок на форуме
Отправить личное сообщение для IlCF Посмотреть профиль Найти все сообщения от IlCF
 
Регистрация: 26.04.2018
Сообщений: 3

ruslan_mart, спасибо огромное, понял! Никак не могу привыкнуть к тому, что в JS код выполняется не "последовательно", как в "обычных" языках. Правда, нечто подобное имеет место быть и при низкоуровневом программировании всяких железок, когда нужно учитывать задержки распространения сигнала и т.п., но там просто ждёшь и нет никаких "onload".
Ещё раз спасибо!
Ответить с цитированием
  #4 (permalink)  
Старый 26.04.2018, 19:36
Аватар для j0hnik
Профессор
Отправить личное сообщение для j0hnik Посмотреть профиль Найти все сообщения от j0hnik
 
Регистрация: 01.12.2016
Сообщений: 3,650

window.onload = function() {
    // ваш код
  };


пробовали?
Ответить с цитированием
  #5 (permalink)  
Старый 26.04.2018, 21:08
Новичок на форуме
Отправить личное сообщение для IlCF Посмотреть профиль Найти все сообщения от IlCF
 
Регистрация: 26.04.2018
Сообщений: 3

j0hnik,а причём тут window.onload? Да, у меня весь зависящий от загрузки страницы код в window.onload.
Ответить с цитированием
  #6 (permalink)  
Старый 26.04.2018, 22:00
Аватар для Malleys
Профессор
Отправить личное сообщение для Malleys Посмотреть профиль Найти все сообщения от Malleys
 
Регистрация: 20.12.2009
Сообщений: 1,714

"Последовательно" тоже можно

// Это вспомогательная функция
// запускающая переданную в неё функцию
function $(generatorFunction) {
	var iterator = generatorFunction(next);
	iterator.next();

	function next(value) {
		iterator.next(value);
	}
}
	
$(async function*(next) {
	var bgimg = new Image();
	bgimg.src = "https://placeimg.com/640/480/any";

	yield bgimg.onload = next;

	alert(bgimg.naturalWidth + '×' + bgimg.naturalHeight);
});
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как применить свойства css к соседнему элементу thrifty (X)HTML/CSS 2 10.01.2018 17:01
Проверка текущего значения свойства “right” из JS pepel266 Общие вопросы Javascript 4 15.09.2016 17:10
Изменение css свойства Rumis jQuery 2 21.05.2013 11:55
Получить все свойства как строку. boilroom Events/DOM/Window 1 20.06.2011 17:37
Как при чтении или записи свойства объекта вызывать функцию danik.js Общие вопросы Javascript 3 16.09.2010 17:57