Попытка использовать getBoundingClientRect() для добавленного элемента программно возвращает ширину и высоту 0
Я пытаюсь получить getBoundingClientRect()
из object
элемент, который я только что добавил в body
, но это возвращает width
а также height
0. В настоящее время я исправил проблему, добавив SVG к HTML, содержащему ту же картинку, и установил видимость скрытым, а затем получил ширину и высоту. Размер объекта - это процент от размера окна, поэтому я не знаю об этом заранее.
let bulletSVG = document.createElement("object");
bulletSVG.setAttribute("class", "bullet");
bulletSVG.setAttribute("type", "image/svg+xml");
bulletSVG.setAttribute("data", "imgs/bullet.svg");
document.body.appendChild(bulletSVG);
console.log(bulletSVG.getBoundingClientRect());
Я бы предпочел не добавлять SVG в тело, чтобы получить ширину и высоту. Как я могу сделать?
1 ответ
Мое обоснованное предположение состоит в том, что браузер еще не знает размер изображения, так как вы не ожидаете полной загрузки изображения. Я бы сделал что-то подобное:
const load = (obj) =>
new Promise(resolve => obj.onload = resolve);
async function addSVG() {
let bulletSVG = document.createElement("object");
bulletSVG.setAttribute("class", "bullet");
bulletSVG.setAttribute("type", "image/svg+xml");
bulletSVG.setAttribute("data", "imgs/bullet.svg");
document.body.appendChild(bulletSVG);
await load(bulletSVG);
console.log(bulletSVG.getBoundingClientRect());
}
addSVG();
ОБНОВЛЕНИЕ Если ваш браузер не поддерживает обещания, и вы не можете / не хотите использовать транспортер (такой как Babel 7); Вы заставляете это работать, используя непосредственно обработчик событий, хотя это не будет так элегантно:
function addSVG() {
let bulletSVG = document.createElement("object");
bulletSVG.setAttribute("class", "bullet");
bulletSVG.setAttribute("type", "image/svg+xml");
bulletSVG.setAttribute("data", "imgs/bullet.svg");
document.body.appendChild(bulletSVG);
bulletSVG.onload = function() {
console.log(bulletSVG.getBoundingClientRect());
}
}