en.javascript.info/2-ui/3-event-details/11-onload-onerror/article.md
reigningmetal c97f53563c Spelling Continued
Checked some spelling further along in the article files. Made some
small grammatical fixes, but mostly spelling.
2017-06-12 20:26:14 -04:00

91 lines
2.7 KiB
Markdown

# Resource loading: onload and onerror
The browser allows to track the loading of external resources -- scripts, iframes, pictures and so on.
There are two events for it:
- `onload` -- successful load,
- `onerror` -- an error occurred.
## Loading a script
Let's say we need to call a function that resides in an external script.
We can load it dynamically, like this:
```js
let script = document.createElement('script');
script.src = "my.js";
document.head.append(script);
```
...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.
### script.onload
The main helper is the `load` event. It triggers after the script was loaded and executed.
For instance:
```js run untrusted
let script = document.createElement('script');
// can load any script, from any domain
script.src = "https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.3.0/lodash.js"
document.head.append(script);
*!*
script.onload = function() {
// the script creates a helper function "_"
alert(_); // the function is available
};
*/!*
```
So in `onload` we can use script variables, run functions etc.
...And what if the loading failed? For instance, there's no such script (error 404) or the server or the server is down (unavailable).
### script.onerror
Errors that occur during the loading (but not execution) of the script can be tracked on `error` event.
For instance, let's request a script that doesn't exist:
```js run
let script = document.createElement('script');
script.src = "https://example.com/404.js"; // no such script
document.head.append(script);
*!*
script.onerror = function() {
alert("Error loading " + this.src); // Error loading https://example.com/404.js
};
*/!*
```
Please note that we can't get error details here. We don't know was it error 404 or 500 or something else. Just that the loading failed.
## Other resources
The `load` and `error` events also work for other resources. There may be minor differences though.
For instance:
`<img>`, `<link>` (external stylesheets)
: Both `load` and `error` events work as expected.
`<iframe>`
: Only `load` event when the iframe loading finished. It triggers both for successful load and in case of an error. That's for historical reasons.
## Summary
Pictures `<img>`, external styles, scripts and other resources provide `load` and `error` events to track their loading:
- `load` triggers on a successful load,
- `error` triggers on a failed load.
The only exception is `<iframe>`: for historical reasons it always triggers `load`, for any load completion, even if the page is not found.
The `readystatechange` event also works for resources, but is rarely used, because `load/error` events are simpler.