- How to detect when the images are loaded
- Загрузка ресурсов: onload и onerror
- Загрузка скриптов
- script.onload
- script.onerror
- Другие ресурсы
- Ошибка в скрипте с другого источника
- Итого
- Задачи
- Загрузите изображения с колбэком
- How to Use Image onload Event in JavaScript
- How to Use Image onload JavaScript Event?
- Method 1: Use Image onload Event in JavaScript with document.querySelector()
- Method 2: Use Image onload Event in JavaScript with User-defined Function
- Conclusion
- About the author
- Sharqa Hameed
How to detect when the images are loaded
It is simple to load images to the page using JavaScript. We can create it using two methods then append it to the DOM.
var img1 = document.createElement("img"); var img2 = new Image(); img1.src = "path/to/image1.jpg"; img2.src = "path/to/image2.jpg"; document.body.append(img1); document.body.append(img2);
That was easy. Images take time to load however. If the images are very big, they won’t be loaded by the time they are added to the DOM. We can detect this event using onload.
Note that the order of your code does matter. The onload function has to be defined before the src of the image is set:
img1.src = "path/to/image.jpg"; img1.onload = function() < // this may not run // especially if the image is small >; img2.onload = function() < // this will run when the image is ready >img2.src = "path/to/image.png";
You can also run a function when an image fails to load using the onerror event. The process is to define the function to run when the image is loaded, the function to run when the image fails to load, then you set the source path to the image.
var img = new Image(); img.onload = function() < // the image is ready >; img.onerror = function() < // the image has failed >; img.src = "path/to/image.jpg";
A good example where you can make use of those events is if you are creating a photo gallery. When you select an image, you can add a the words «Loading» while the images are loading in the background. Only when the image is loaded you show it to the user.
Do you use these events for something else? Feel free to share it.
Did you like this article? You can subscribe to read more awesome ones. RSS
Sign up for the Newsletter.
Загрузка ресурсов: onload и onerror
Браузер позволяет отслеживать загрузку сторонних ресурсов: скриптов, ифреймов, изображений и др.
Для этого существуют два события:
Загрузка скриптов
Допустим, нам нужно загрузить сторонний скрипт и вызвать функцию, которая объявлена в этом скрипте.
Мы можем загрузить этот скрипт динамически:
let script = document.createElement('script'); script.src = "my.js"; document.head.append(script);
…Но как нам вызвать функцию, которая объявлена внутри того скрипта? Нам нужно подождать, пока скрипт загрузится, и только потом мы можем её вызвать.
Для наших собственных скриптов мы можем использовать JavaScript-модули, но они не слишком широко распространены в сторонних библиотеках.
script.onload
Главный помощник – это событие load . Оно срабатывает после того, как скрипт был загружен и выполнен.
let script = document.createElement('script'); // мы можем загрузить любой скрипт с любого домена script.src = "https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.3.0/lodash.js" document.head.append(script); script.onload = function() < // в скрипте создаётся вспомогательная переменная с именем "_" alert(_.VERSION); // отображает версию библиотеки >;
Таким образом, в обработчике onload мы можем использовать переменные, вызывать функции и т.д., которые предоставляет нам сторонний скрипт.
…А что если во время загрузки произошла ошибка? Например, такого скрипта нет (ошибка 404), или сервер был недоступен.
script.onerror
Ошибки, которые возникают во время загрузки скрипта, могут быть отслежены с помощью события error .
Например, давайте запросим скрипт, которого не существует:
let script = document.createElement('script'); script.src = "https://example.com/404.js"; // такого файла не существует document.head.append(script); script.onerror = function() < alert("Ошибка загрузки " + this.src); // Ошибка загрузки https://example.com/404.js >;
Обратите внимание, что мы не можем получить описание HTTP-ошибки. Мы не знаем, была ли это ошибка 404 или 500, или какая-то другая. Знаем только, что во время загрузки произошла ошибка.
Обработчики onload / onerror отслеживают только сам процесс загрузки.
Ошибки обработки и выполнения загруженного скрипта ими не отслеживаются. Чтобы «поймать» ошибки в скрипте, нужно воспользоваться глобальным обработчиком window.onerror .
Другие ресурсы
События load и error также срабатывают и для других ресурсов, а вообще, для любых ресурсов, у которых есть внешний src .
let img = document.createElement('img'); img.src = "https://js.cx/clipart/train.gif"; // (*) img.onload = function() < alert(`Изображение загружено, размеры $x$`); >; img.onerror = function() < alert("Ошибка во время загрузки изображения"); >;
Однако есть некоторые особенности:
- Большинство ресурсов начинают загружаться после их добавления в документ. За исключением тега
. Изображения начинают загружаться, когда получают src (*) .
- Для событие load срабатывает по окончании загрузки как в случае успеха, так и в случае ошибки.
Такое поведение сложилось по историческим причинам.
Ошибка в скрипте с другого источника
Есть правило: скрипты с одного сайта не могут получить доступ к содержимому другого сайта. Например, скрипт с https://facebook.com не может прочитать почту пользователя на https://gmail.com .
Или, если быть более точным, один источник (домен/порт/протокол) не может получить доступ к содержимому с другого источника. Даже поддомен или просто другой порт будут считаться разными источниками, не имеющими доступа друг к другу.
Это правило также касается ресурсов с других доменов.
Если мы используем скрипт с другого домена, и в нем имеется ошибка, мы не сможем узнать детали этой ошибки.
Для примера давайте возьмём мини-скрипт error.js , который состоит из одного-единственного вызова функции, которой не существует:
Теперь загрузим этот скрипт с того же сайта, на котором он лежит:
Мы видим нормальный отчёт об ошибке:
Uncaught ReferenceError: noSuchFunction is not defined https://javascript.info/article/onload-onerror/crossorigin/error.js, 1:1
А теперь загрузим этот же скрипт с другого домена:
Детали отчёта могут варьироваться в зависимости от браузера, но основная идея остаётся неизменной: любая информация о внутреннем устройстве скрипта, включая стек ошибки, спрятана. Именно потому, что скрипт загружен с другого домена.
Зачем нам могут быть нужны детали ошибки?
Существует много сервисов (и мы можем сделать наш собственный), которые обрабатывают глобальные ошибки при помощи window.onerror , сохраняют отчёт о них и предоставляют доступ к этому отчёту для анализа. Это здорово, потому что мы можем увидеть реальные ошибки, которые случились у наших пользователей. Но если скрипт – с другого домена, то информации об ошибках в нём почти нет, как мы только что видели.
Похожая кросс-доменная политика (CORS) внедрена и в отношении других ресурсов.
Чтобы разрешить кросс-доменный доступ, нам нужно поставить тегу атрибут crossorigin , и, кроме того, удалённый сервер должен поставить специальные заголовки.
Существует три уровня кросс-доменного доступа:
- Атрибут crossorigin отсутствует – доступ запрещён.
- crossorigin=»anonymous» – доступ разрешён, если сервер отвечает с заголовком Access-Control-Allow-Origin со значениями * или наш домен. Браузер не отправляет авторизационную информацию и куки на удалённый сервер.
- crossorigin=»use-credentials» – доступ разрешён, если сервер отвечает с заголовками Access-Control-Allow-Origin со значением наш домен и Access-Control-Allow-Credentials: true . Браузер отправляет авторизационную информацию и куки на удалённый сервер.
Почитать больше о кросс-доменных доступах вы можете в главе Fetch: запросы на другие сайты. Там описан метод fetch для сетевых запросов, но политика там точно такая же.
Такое понятие как «куки» (cookies) не рассматривается в текущей главе, но вы можете почитать о них в главе Куки, document.cookie.
В нашем случае атрибут crossorigin отсутствовал. Поэтому кросс-доменный доступ был запрещён. Давайте добавим его.
Мы можем выбрать «anonymous» (куки не отправляются, требуется один серверный заголовок) или «use-credentials» (куки отправляются, требуются два серверных заголовка) в качестве значения атрибута.
Если куки нас не волнуют, тогда смело выбираем «anonymous» :
Теперь при условии, что сервер предоставил заголовок Access-Control-Allow-Origin , всё хорошо. У нас есть полный отчёт по ошибкам.
Итого
Изображения , внешние стили, скрипты и другие ресурсы предоставляют события load и error для отслеживания загрузки:
Единственное исключение – это : по историческим причинам срабатывает всегда load вне зависимости от того, как завершилась загрузка, даже если страница не была найдена.
Событие readystatechange также работает для ресурсов, но используется редко, потому что события load/error проще в использовании.
Задачи
Загрузите изображения с колбэком
Обычно изображения начинают загружаться в момент их создания. Когда мы добавляем на страницу, пользователь не увидит его тут же. Браузер сначала должен его загрузить.
Чтобы показать изображение сразу, мы можем создать его «заранее»:
let img = document.createElement('img'); img.src = 'my.jpg';
Браузер начнёт загружать изображение и положит его в кеш. Позже, когда такое же изображение появится в документе (не важно как), оно будет показано мгновенно.
Создайте функцию preloadImages(sources, callback) , которая загружает все изображения из массива sources и, когда все они будут загружены, вызывает callback .
В данном примере будет показан alert после загрузки всех изображений.
function loaded() < alert("Изображения загружены") >preloadImages(["1.jpg", "2.jpg", "3.jpg"], loaded);
В случае ошибки функция должна считать изображение «загруженным».
Другими словами, callback выполняется в том случае, когда все изображения либо загружены, либо в процессе их загрузки возникла ошибка.
Такая функция полезна, например, когда нам нужно показать галерею с маленькими скролящимися изображениями, и мы хотим быть уверены, что все из них загружены.
В песочнице подготовлены ссылки к тестовым изображениям, а также код для проверки их загрузки. Код должен выводить 300 .
- Создадим img для каждого ресурса.
- Добавим обработчики onload/onerror для каждого изображения.
- Увеличиваем счётчик при срабатывании onload или onerror .
- Когда значение счётчика равно количеству ресурсов – тогда вызываем callback() .
How to Use Image onload Event in JavaScript
In JavaScript, the Image “onload” event occurs when the image is loaded successfully on a web page. This feature can be utilized when we need to load images on our web pages to make them attractive. Image onload event is also used in the development of websites that display the products’ images, logos, and banners.
This article will highlight the image onload event using JavaScript.
How to Use Image onload JavaScript Event?
You can utilize the following methods for performing image onload event operation in JavaScript:
We will now go through each of the mentioned approaches one by one!
Method 1: Use Image onload Event in JavaScript with document.querySelector()
The “document.querySelector()” method is primarily used to return the first element that matches with a particular selector within the document. For instance, it can be utilized to define an event for accessing an image from the HTML file.
The below-given example will use the document.querySelector() method to define an image on load event.
First, we will add the image source “src” in the HTML file:
Now, move to the JavaScript file and call the “addEventListener()” method with the window object. This method will be used to add an event listener to load the desired image with the help of the “document.querySelector()” method. After that, add a pop-up alert with the stated message:
window.addEventListener ( «load» , event = > {
var img = document.querySelector ( ‘img’ ) ;
alert ( «Image is Loaded Successfully» ) ;
} ) ;
Lastly, specify the source of the JavaScript file in the head or body tag:
Opening the given HTML file will show the following output:
After loading the selected image, the following alert box will also pop up with a message:
Method 2: Use Image onload Event in JavaScript with User-defined Function
A user-defined function can also be utilized for the image on loading process, which is accessed in “HTML” file via “onload”. This function will return the image status in an alert box.
Check out the following example to understand the stated concept.
First, we will define an “Imageonload()” function and show the status of the image to be loaded via alert box:
Next, we will add the path of the image that needs to be downloaded and call the defined “Imageonload()” function as “onload” event. Moreover, we will also specify the source of the JavaScript file in the HTML file:
We have provided different methods to use the image onload event in JavaScript.
Conclusion
To use the image onload event in JavaScript, you can use the document.querySelector() method or user-defined function. In the first approach, the addEventListener() method is called with the window object used to add an event listener to the document.querySelector() method. For the second approach, a user-defined object can be created, which is accessed in the HTML file via onload event. This write-up discussed the method to use an onload JavaScript event.
About the author
Sharqa Hameed
I am a Linux enthusiast, I love to read Every Linux blog on the internet. I hold masters degree in computer science and am passionate about learning and teaching.