Skip to content

Commit 9be50d6

Browse files
authored
Merge pull request #258 from TevaHenry/resource-loading
Resource loading: onload and onerror
2 parents fef69b8 + a15c5e2 commit 9be50d6

File tree

4 files changed

+80
-78
lines changed

4 files changed

+80
-78
lines changed
Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11

2-
The algorithm:
3-
1. Make `img` for every source.
4-
2. Add `onload/onerror` for every image.
5-
3. Increase the counter when either `onload` or `onerror` triggers.
6-
4. When the counter value equals to the sources count -- we're done: `callback()`.
2+
L'algorithme:
3+
1. Créez `img` pour chaque source.
4+
2. Ajoutez `onload/onerror` pour chaque image.
5+
3. Augmentez le compteur lorsque `onload` ou `onerror` se déclenchent.
6+
4. Lorsque la valeur du compteur est égale au nombre de sources -- nous avons terminé: `callback()`.

2-ui/5-loading/03-onload-onerror/1-load-img-callback/task.md

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -2,22 +2,22 @@ importance: 4
22

33
---
44

5-
# Load images with a callback
5+
# Charger des images avec une fonction de rappel
66

7-
Normally, images are loaded when they are created. So when we add `<img>` to the page, the user does not see the picture immediately. The browser needs to load it first.
7+
Normalement, les images sont chargées lors de leur création. Ainsi, lorsque nous ajoutons `<img>` à la page, l'utilisateur ne voit pas l'image immédiatement. Le navigateur doit d'abord le charger.
88

9-
To show an image immediately, we can create it "in advance", like this:
9+
Pour afficher une image immédiatement, nous pouvons la créer "à l'avance", comme ceci:
1010

1111
```js
1212
let img = document.createElement('img');
1313
img.src = 'my.jpg';
1414
```
1515

16-
The browser starts loading the image and remembers it in the cache. Later, when the same image appears in the document (no matter how), it shows up immediately.
16+
Le navigateur commence à charger l'image et s'en souvient dans le cache. Plus tard, lorsque la même image apparaît dans le document (peu importe comment), elle apparaît immédiatement.
1717

18-
**Create a function `preloadImages(sources, callback)` that loads all images from the array `sources` and, when ready, runs `callback`.**
18+
**Créez une fonction `preloadImages(sources, callback)` qui charge toutes les images du tableau `sources` et, une fois prête, exécute `callback`.**
1919

20-
For instance, this will show an `alert` after the images are loaded:
20+
Par exemple, cela affichera `alert` après le chargement des images:
2121

2222
```js
2323
function loaded() {
@@ -27,10 +27,10 @@ function loaded() {
2727
preloadImages(["1.jpg", "2.jpg", "3.jpg"], loaded);
2828
```
2929

30-
In case of an error, the function should still assume the picture "loaded".
30+
En cas d'erreur, la fonction doit toujours supposer que l'image est "chargée".
3131

32-
In other words, the `callback` is executed when all images are either loaded or errored out.
32+
En d'autres termes, le `callback` est exécuté lorsque toutes les images sont chargées ou en erreur.
3333

34-
The function is useful, for instance, when we plan to show a gallery with many scrollable images, and want to be sure that all images are loaded.
34+
La fonction est utile, par exemple, lorsque nous prévoyons d'afficher une galerie avec de nombreuses images déroulantes et que nous voulons être sûrs que toutes les images sont chargées.
3535

36-
In the source document you can find links to test images, and also the code to check whether they are loaded or not. It should output `300`.
36+
Dans le document source, vous pouvez trouver des liens vers des images de test, ainsi que le code pour vérifier si elles sont chargées ou non. Il devrait afficher `300`.
Lines changed: 64 additions & 62 deletions
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,17 @@
1-
# Resource loading: onload and onerror
1+
# Chargement des ressources: onload et onerror
22

3-
The browser allows us to track the loading of external resources -- scripts, iframes, pictures and so on.
3+
Le navigateur nous permet de suivre le chargement des ressources externes - scripts, iframes, images, etc.
44

5-
There are two events for it:
5+
Il y a deux événements pour cela:
66

7-
- `onload` -- successful load,
8-
- `onerror` -- an error occurred.
7+
- `onload` - chargement réussi,
8+
- `onerror` - une erreur s'est produite.
99

10-
## Loading a script
10+
## Chargement d'un script
1111

12-
Let's say we need to load a third-party script and call a function that resides there.
12+
Disons que nous devons charger un script tiers et appeler une fonction qui y réside.
1313

14-
We can load it dynamically, like this:
14+
Nous pouvons le charger dynamiquement, comme ceci:
1515

1616
```js
1717
let script = document.createElement('script');
@@ -20,68 +20,69 @@ script.src = "my.js";
2020
document.head.append(script);
2121
```
2222

23-
...But how to run the function that is declared inside that script? We need to wait until the script loads, and only then we can call it.
23+
...Mais comment exécuter la fonction déclarée dans ce script? Nous devons attendre que le script se charge pour l'appeler.
2424

2525
```smart
26-
For our own scripts we could use [JavaScript modules](info:modules) here, but they are not widely adopted by third-party libraries.
26+
Pour nos propres scripts, nous pourrions utiliser des [modules JavaScript] (info:modules) ici, mais ils ne sont pas largement adoptés par les bibliothèques tierces.
2727
```
2828

2929
### script.onload
3030

31-
The main helper is the `load` event. It triggers after the script was loaded and executed.
31+
L'assistant principal est l'événement `load`. Il se déclenche après le chargement et l'exécution du script.
3232

33-
For instance:
33+
Par exemple:
3434

3535
```js run untrusted
3636
let script = document.createElement('script');
3737

38-
// can load any script, from any domain
38+
// peut charger n'importe quel script, depuis n'importe quel domaine
3939
script.src = "https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.3.0/lodash.js"
4040
document.head.append(script);
4141

4242
*!*
4343
script.onload = function() {
44-
// the script creates a variable "_"
45-
alert( _.VERSION ); // shows library version
44+
// le script crée une variable "_"
45+
alert( _.VERSION ); // affiche la version de la bibliothèque
46+
4647
};
4748
*/!*
4849
```
4950

50-
So in `onload` we can use script variables, run functions etc.
51+
Donc, dans `onload`, nous pouvons utiliser des variables de script, exécuter des fonctions, etc.
5152

52-
...And what if the loading failed? For instance, there's no such script (error 404) or the server is down (unavailable).
53+
...Et si le chargement échouait? Par exemple, il n'y a pas de tel script (erreur 404) ou le serveur est en panne (indisponible).
5354

5455
### script.onerror
5556

56-
Errors that occur during the loading of the script can be tracked in an `error` event.
57+
Les erreurs qui se produisent pendant le chargement du script peuvent être suivies dans un événement `error`.
5758

58-
For instance, let's request a script that doesn't exist:
59+
Par exemple, demandons un script qui n'existe pas:
5960

6061
```js run
6162
let script = document.createElement('script');
62-
script.src = "https://example.com/404.js"; // no such script
63+
script.src = "https://example.com/404.js"; // pas de tel script
6364
document.head.append(script);
6465

6566
*!*
6667
script.onerror = function() {
67-
alert("Error loading " + this.src); // Error loading https://example.com/404.js
68+
alert("Error loading " + this.src); // Erreur de chargement de https://example.com/404.js
6869
};
6970
*/!*
7071
```
7172

72-
Please note that we can't get HTTP error details here. We don't know if it was an error 404 or 500 or something else. Just that the loading failed.
73+
Veuillez noter que nous ne pouvons pas obtenir les détails des erreurs HTTP ici. Nous ne savons pas si c'était une erreur 404 ou 500 ou autre chose. Juste que le chargement a échoué.
7374

7475
```warn
75-
Events `onload`/`onerror` track only the loading itself.
76+
Les événements `onload`/`onerror` ne suivent que le chargement lui-même.
7677
77-
Errors that may occur during script processing and execution are out of scope for these events. That is: if a script loaded successfully, then `onload` triggers, even if it has programming errors in it. To track script errors, one can use `window.onerror` global handler.
78+
Les erreurs qui peuvent survenir lors du traitement et de l'exécution du script sont hors de portée de ces événements. C'est-à-dire: si un script s'est chargé avec succès, alors `onload` se déclenche, même s'il contient des erreurs de programmation. Pour suivre les erreurs de script, on peut utiliser le gestionnaire global `window.onerror`.
7879
```
7980

80-
## Other resources
81+
## Autres ressources
8182

82-
The `load` and `error` events also work for other resources, basically for any resource that has an external `src`.
83+
Les événements `load` et `error` fonctionnent aussi pour d'autres ressources, essentiellement pour toute ressource qui a un `src` externe.
8384

84-
For example:
85+
Par exemple:
8586

8687
```js run
8788
let img = document.createElement('img');
@@ -96,30 +97,31 @@ img.onerror = function() {
9697
};
9798
```
9899

99-
There are some notes though:
100+
Il y a quelques notes cependant:
101+
102+
- La plupart des ressources commencent à se charger lorsqu'elles sont ajoutées au document. Mais `<img>` est une exception. Elle commence à se charger lorsqu'elle obtient un src `(*)`.
103+
- Pour `<iframe>`, l'événement `iframe.onload` se déclenche lorsque le chargement de l'iframe est terminé, à la fois pour un chargement réussi et en cas d'erreur.
100104

101-
- Most resources start loading when they are added to the document. But `<img>` is an exception. It starts loading when it gets a src `(*)`.
102-
- For `<iframe>`, the `iframe.onload` event triggers when the iframe loading finished, both for successful load and in case of an error.
105+
C'est pour des raisons historiques.
103106

104-
That's for historical reasons.
107+
## Politique de crossorigin
105108

106-
## Crossorigin policy
109+
Il y a une règle: les scripts d'un site ne peuvent pas accéder au contenu de l'autre site. Donc, par exemple un script sur `https://facebook.com` ne peut pas lire la boîte aux lettres de l'utilisateur sur `https://gmail.com`.
107110

108-
There's a rule: scripts from one site can't access contents of the other site. So, e.g. a script at `https://facebook.com` can't read the user's mailbox at `https://gmail.com`.
111+
Ou, pour être plus précis, une origine (triplet domaine/port/protocole) ne peut pas accéder au contenu à partir d'une autre. Donc, même si nous avons un sous-domaine, ou juste un autre port, ce sont des origines différentes sans accès les uns aux autres.
109112

110-
Or, to be more precise, one origin (domain/port/protocol triplet) can't access the content from another one. So even if we have a subdomain, or just another port, these are different origins with no access to each other.
113+
Cette règle affecte également les ressources d'autres domaines.
111114

112-
This rule also affects resources from other domains.
115+
Si nous utilisons un script d'un autre domaine et qu'il contient une erreur, nous ne pouvons pas obtenir les détails de l'erreur.
113116

114-
If we're using a script from another domain, and there's an error in it, we can't get error details.
117+
Par exemple, prenons un script `error.js` qui consiste en un seul (mauvais) appel de fonction:
115118

116-
For example, let's take a script `error.js` that consists of a single (bad) function call:
117119
```js
118120
// 📁 error.js
119121
noSuchFunction();
120122
```
121123

122-
Now load it from the same site where it's located:
124+
Maintenant, chargez-le depuis le même site où il se trouve:
123125

124126
```html run height=0
125127
<script>
@@ -130,14 +132,14 @@ window.onerror = function(message, url, line, col, errorObj) {
130132
<script src="/article/onload-onerror/crossorigin/error.js"></script>
131133
```
132134

133-
We can see a good error report, like this:
135+
Nous pouvons voir un bon rapport d'erreur, comme ceci:
134136

135137
```
136138
Uncaught ReferenceError: noSuchFunction is not defined
137139
https://javascript.info/article/onload-onerror/crossorigin/error.js, 1:1
138140
```
139141

140-
Now let's load the same script from another domain:
142+
Maintenant, chargeons le même script à partir d'un autre domaine:
141143

142144
```html run height=0
143145
<script>
@@ -148,40 +150,40 @@ window.onerror = function(message, url, line, col, errorObj) {
148150
<script src="https://cors.javascript.info/article/onload-onerror/crossorigin/error.js"></script>
149151
```
150152

151-
The report is different, like this:
153+
Le rapport est différent, comme ceci:
152154

153155
```
154156
Script error.
155157
, 0:0
156158
```
157159

158-
Details may vary depending on the browser, but the idea is the same: any information about the internals of a script, including error stack traces, is hidden. Exactly because it's from another domain.
160+
Les détails peuvent varier en fonction du navigateur, mais l'idée est la même: toute information sur les éléments internes d'un script, y compris les traces de pile d'erreurs, est masquée. Exactement parce que c'est d'un autre domaine.
159161

160-
Why do we need error details?
162+
Pourquoi avons-nous besoin de détails d'erreur?
161163

162-
There are many services (and we can build our own) that listen for global errors using `window.onerror`, save errors and provide an interface to access and analyze them. That's great, as we can see real errors, triggered by our users. But if a script comes from another origin, then there's not much information about errors in it, as we've just seen.
164+
Il existe de nombreux services (et nous pouvons créer le nôtre) qui écoutent les erreurs globales en utilisant `window.onerror`, enregistrent les erreurs et fournissent une interface pour y accéder et les analyser. C'est génial, car nous pouvons voir de vraies erreurs, déclenchées par nos utilisateurs. Mais si un script vient d'une autre origine, alors il n'y a pas beaucoup d'informations sur les erreurs, comme nous venons de le voir.
163165

164-
Similar cross-origin policy (CORS) is enforced for other types of resources as well.
166+
Une politique d’origine croisée similaire (CORS) est également appliquée pour d’autres types de ressources.
165167

166-
**To allow cross-origin access, the `<script>` tag needs to have the `crossorigin` attribute, plus the remote server must provide special headers.**
168+
**Pour permettre l'accès cross-origin, la balise `<script>` doit avoir l'attribut `crossorigin`, et le serveur distant doit fournir des en-têtes spéciaux.**
167169

168-
There are three levels of cross-origin access:
170+
Il existe trois niveaux d'accès cross-origin:
169171

170-
1. **No `crossorigin` attribute** -- access prohibited.
171-
2. **`crossorigin="anonymous"`** -- access allowed if the server responds with the header `Access-Control-Allow-Origin` with `*` or our origin. Browser does not send authorization information and cookies to remote server.
172-
3. **`crossorigin="use-credentials"`** -- access allowed if the server sends back the header `Access-Control-Allow-Origin` with our origin and `Access-Control-Allow-Credentials: true`. Browser sends authorization information and cookies to remote server.
172+
1. **Aucun attribut `crossorigin`** -- accès interdit.
173+
2. **`crossorigin="anonymous"`** -- accès autorisé si le serveur répond avec l'en-tête `Access-Control-Allow-Origin` avec `*` ou notre origine. Le navigateur n'envoie pas d'autorisationinformation and cookies to remote server.
174+
3. **`crossorigin="use-credentials"`** -- accès autorisé si le serveur renvoie l'en-tête `Access-Control-Allow-Origin` avec notre origine et `Access-Control-Allow-Credentials:true`. Le navigateur envoie des informations d'autorisation et des cookies au serveur distant.
173175

174176
```smart
175-
You can read more about cross-origin access in the chapter <info:fetch-crossorigin>. It describes the `fetch` method for network requests, but the policy is exactly the same.
177+
Vous pouvez en savoir plus sur l'accès cross-origin dans le chapitre <info:fetch-crossorigin>. Il décrit la méthode `fetch` pour les requêtes réseau, mais la politique est exactement la même.
176178
177-
Such thing as "cookies" is out of our current scope, but you can read about them in the chapter <info:cookie>.
179+
Les "cookies" sont hors de notre portée actuelle, mais vous pouvez les lire dans le chapitre <info:cookie>.
178180
```
179181

180-
In our case, we didn't have any crossorigin attribute. So the cross-origin access was prohibited. Let's add it.
182+
Dans notre cas, nous n'avions aucun attribut crossorigin. L'accès cross-origin était donc interdit. Ajoutons-le.
181183

182-
We can choose between `"anonymous"` (no cookies sent, one server-side header needed) and `"use-credentials"` (sends cookies too, two server-side headers needed).
184+
Nous pouvons choisir entre `"anonymous"` (aucun cookie envoyé, un en-tête côté serveur nécessaire) et `"use-credentials"` (envoie également des cookies, deux en-têtes côté serveur nécessaires).
183185

184-
If we don't care about cookies, then `"anonymous"` is the way to go:
186+
Si nous ne nous soucions pas des cookies, alors `"anonymous"` est la voie à suivre:
185187

186188
```html run height=0
187189
<script>
@@ -192,15 +194,15 @@ window.onerror = function(message, url, line, col, errorObj) {
192194
<script *!*crossorigin="anonymous"*/!* src="https://cors.javascript.info/article/onload-onerror/crossorigin/error.js"></script>
193195
```
194196

195-
Now, assuming that the server provides an `Access-Control-Allow-Origin` header, everything's fine. We have the full error report.
197+
Maintenant, en supposant que le serveur fournit un en-tête `Access-Control-Allow-Origin`, tout va bien. Nous avons le rapport d'erreur complet.
196198

197-
## Summary
199+
## Résumé
198200

199-
Images `<img>`, external styles, scripts and other resources provide `load` and `error` events to track their loading:
201+
Les images `<img>`, les styles externes, les scripts et autres ressources fournissent des événements `load` et `error` pour suivre leur chargement:
200202

201-
- `load` triggers on a successful load,
202-
- `error` triggers on a failed load.
203+
- `load` se déclenche en cas de chargement réussi.
204+
- `error` se déclenche en cas d'échec du chargement.
203205

204-
The only exception is `<iframe>`: for historical reasons it always triggers `load`, for any load completion, even if the page is not found.
206+
La seule exception est `<iframe>`: pour des raisons historiques, il déclenche toujours `load`, pour tout achèvement de chargement, même si la page n'est pas trouvée.
205207

206-
The `readystatechange` event also works for resources, but is rarely used, because `load/error` events are simpler.
208+
L'événement `readystatechange` fonctionne également pour les ressources, mais est rarement utilisé, car les événements `load/error` sont plus simples.

2-ui/5-loading/index.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,2 @@
11

2-
# Document and resource loading
2+
# Chargement du document et des ressources

0 commit comments

Comments
 (0)