Для удобной работы при заказе изображений для фотообоев на сайте Декор Имидж я разрабатывал соответствующий функционал – при вводе размеров изображение разбивается на полосы с указанием размеров.
НО на сайте обнаружился неприятный баг – при переходе на детальную страницу данный функционал работал раз через два – то разобъёт на полосы, то нет.
Причём чаще нет, чем да.
После изучения данной проблемы я экспериментальным путём пришел к выводу, что событие on load к которому я привязывал процедуру по работе с изображением отрабатывало не перманентно.
С коллегами с форума программистов (пост), выяснилось, что событие не отрабатывает если изображение “подтягивается” из кэша браузера (что по моему мнению конечно же недоработка).
Ниже рабочее решение – смысл в том, что для 100% отрабатывания события on load атрибут SRC картинки сначала мы обнуляем, а потом после присвоения с нужным адресом уже слушаем событие load.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 |
/** * TAP-версия загрузки изображения по HTTP * @param {string} url Строка URL * @returns {Promise<void>} Обещание, не возвращающее результат */ function loadImgAsync(img, url) { return new Promise((resolve, reject) => { img.addEventListener(“load”, function loadHandler() { img.removeEventListener(“load”, loadHandler); resolve(); }); img.addEventListener(“error”, function errorHandler() { img.removeEventListener(“error”, errorHandler); reject(new Error(“Ошибка загрузки изображения с адреса: “ + url)); }); img.setAttribute(“src”, “”); // Сделать, чтобы картинка точно грузилась img.setAttribute(“src”, url); }); } let img = document.querySelector(“img”); // img.onload = () => { console.log(“Картинка загрузилась. Обрабатываю.”); }; console.log(img.complete); document.querySelector(“#btn”).onclick = btn_click; async function btn_click() { let url = “wallpaper.jpg”; // let url = “https://dekorimage.ru/upload/iblock/c24/c24e87409cfc786486cd5f3fe893f3cf.jpg”; // let url = “https://dekorimage.ru/upload/iblock/596/596c1129512974610c3a281a99f03db2.jpg”; //let url = “https://cyberstatic.net/images/cyberforum_logo.png”; try { await loadImgAsync(img, url); console.log(“Картинка загружена. Обработка.”); } catch (error) { console.log(error.message); } } |