Почему динамически добавляемое изображение всегда имеет offsetWidth 0

Я добавляю изображение через Javascript.

Изображение может быть любого размера, и я хотел бы получить размер (ширину и высоту).

Проблема в том, что offsetWidth и style.width всегда 0

Вот код для репликации

const container = document.getElementById("container");

const img = document.createElement("img");
img.src = "https://images.freeimages.com/images/large-previews/56e/hibiscus-1393855.jpg";
document.body.appendChild(img);
const result = document.getElementById("result");

result.innerText = (img.offsetWidth + " " + img.style.width);
<div id = "container">
</div>

<div id = "result">
</div>

Выше работает. Я запускаю то, что кажется почти идентичным кодом, но он всегда показывает offsetWidth равным 0

Как получить ширину и высоту изображения

Ширина и высота не будут известны до тех пор, пока браузер не получит содержимое изображения с сервера.

Pointy 19.12.2020 17:41

Вы не помещаете img в DOM, поэтому вы не можете рассчитать размер изображения с помощью JS.

pavel 19.12.2020 17:42

Нужен прослушиватель событий загрузки, чтобы получить размеры после загрузки

charlietfl 19.12.2020 17:42

@pavel Не совсем так. Может прослушивать событие загрузки за пределами дома

charlietfl 19.12.2020 17:43

Извините, это моя плохая работа по копированию и вставке - пытаюсь сделать ее краткой. :(

MyDaftQuestions 19.12.2020 17:43
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
1
5
397
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

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

const container = document.getElementById("container");

const img = document.createElement("img");
img.addEventListener('load', function() {
    document.getElementById("result").innerText = img.offsetWidth;
});
img.src = "https://images.freeimages.com/images/large-previews/56e/hibiscus-1393855.jpg";
document.body.appendChild(img);
<div id = "container">
</div>

<div id = "result">
</div>

Я предполагаю, что load асинхронный?

MyDaftQuestions 19.12.2020 17:50

Точно. Вы просто регистрируете обратный вызов на момент появления изображения.

lex82 19.12.2020 17:51

Спасибо. Честно говоря, я думал, что appendChild будет блокирующим вызовом! Ясно, что это не

MyDaftQuestions 19.12.2020 18:00

Нет, подождите. Это. Если вы позже проверите строку, если элемент есть, вы сразу увидите его. Однако вы должны различать html-элемент img и файл src, которые должны загружаться асинхронно. как только он появится, элемент img изменит свои размеры.

lex82 19.12.2020 19:40

Итак... для ясности, appendChild на самом деле не имеет к этому никакого отношения (ожидайте, что он добавит его в DOM). Настройка src — это то, с чего начинается процесс загрузки? Я не ожидаю, что вы знаете ответ, но если я установлю src и не добавлю его в dom, он все равно загрузит изображение:/

MyDaftQuestions 20.12.2020 21:28

Да, я думаю, что возможна предварительная загрузка src перед присоединением к DOM stackoverflow.com/a/58842841/302793

lex82 20.12.2020 22:04

Другие вопросы по теме