Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Асинхронность с offsetWidth (https://javascript.ru/forum/misc/79977-asinkhronnost-s-offsetwidth.html)

AndrewKokorev 12.04.2020 22:08

Асинхронность с offsetWidth
 
Привет, парни)
В общем в Google chrome свойство без проблем показывает результат. Но в Firefox почему-то показывает 0, если загнать в setTimeout(()=>{wrapper.offsetWidth},200), то без проблем отрабатывает и показывает ширину элемента. В чём может быть проблема?

рони 12.04.2020 22:45

AndrewKokorev,
возможно хром использует кеш, а вы грузите html или css.

AndrewKokorev 13.04.2020 18:08

Размер элемента динамический и постоянно у него разная ширина при загрузке. Потому кэш тут не при чём думаю.

voraa 13.04.2020 20:05

Вы хоть пример кода приведите.
Как он создается, где и когда ширина не берется?

AndrewKokorev 14.04.2020 14:05

function renderCanvas() {
  canvasLayer_1.width = 40;
  canvasPixelWidth = Math.floor((canvasBase.offsetWidth * 0.99) / canvasLayer_1.width); //здесь проблема с canvasBase.offsetWidth
  canvasWrapper.style.width = `${canvasLayer_1.width * canvasPixelWidth}px`;
  canvasLayer_1.height = Math.floor(canvasBase.offsetHeight * 0.99 / canvasPixelWidth);
  canvasWrapper.style.height = `${canvasLayer_1.height * canvasPixelWidth}px`;
}


Сначала задаётся ширина канвасу, потом в зависимости от ширины идёт расчёт какое количество пикселей(у меня пиксельная рисовалка) влезет во внешний контейнер и от этого уже расчитывается ширина контейнера канваса. canvasBase это контейнер в котором лежат canvas.

Rise 14.04.2020 14:36

AndrewKokorev,
Когда элемент скрыт, например, style.display none, тогда offsetWidth равно 0, здесь написано.

AndrewKokorev 14.04.2020 15:10

Элемент не скрыт. Просто такое ощущение чтоб в мозиле возможно код выполняется в то время когда еще не отработал CSS, но такого быть не должно, т.к. js подключен в конце документа. Проблема в том что в Chrome и Opera, у которых один движок всё работает норм, в Firefox и Edge появляется эта проблема что ширина на момент работы функции равна 0. И чтобы у элемента ширина была больше 0, нужно задать очень большую задержку минимум в 250 секунд

SuperZen 14.04.2020 16:53

https://developer.mozilla.org/en-US/...dow/load_event

voraa 14.04.2020 18:50

Цитата:

но такого быть не должно, т.к. js подключен в конце документа.
Где именно в конце?
Код, который стоит в теле <body> </body>, выполняется сразу, не дожидаясь загрузки всего остального. Так, что CSS еще имеет право не примениться. Даже размещение элементов имело право не произойти, т.к. Дерево DOM построено не до конца.

AndrewKokorev 17.04.2020 23:46

В общем сделал просто через async/await. JS подключен в конце в конце body. Всегда думал что js код выполняется после загрузки HTML и CSS , если ставить в конце body, а тут оказывается что даже дерево может даже до конца не сформироваться))Спасиб за пояснение


Часовой пояс GMT +3, время: 13:59.