From 799a7e220a614f6a31f2d791d402e3fd2f62f189 Mon Sep 17 00:00:00 2001 From: Ilya Kantor Date: Sun, 29 Jan 2017 02:57:35 +0300 Subject: [PATCH] up --- 1-js/08-error-handling/1-try-catch/article.md | 15 +- .../2-custom-errors/1-format-error/task.md | 8 +- .../2-custom-errors/article.md | 65 +++--- .../1-browser-environment/article.md | 104 +++++++++ .../1-browser-environment/windowObjects.png | Bin 0 -> 21248 bytes .../windowObjects@2x.png | Bin 0 -> 51109 bytes .../2-dom-nodes/1-body-from-head/solution.md | 20 ++ .../2-dom-nodes/1-body-from-head/task.md | 26 +++ 2-ui/1-document/2-dom-nodes/article.md | 203 ++++++++++++++++++ 2-ui/1-document/index.md | 3 + 2-ui/index.md | 3 + 11 files changed, 410 insertions(+), 37 deletions(-) create mode 100644 2-ui/1-document/1-browser-environment/article.md create mode 100644 2-ui/1-document/1-browser-environment/windowObjects.png create mode 100644 2-ui/1-document/1-browser-environment/windowObjects@2x.png create mode 100644 2-ui/1-document/2-dom-nodes/1-body-from-head/solution.md create mode 100644 2-ui/1-document/2-dom-nodes/1-body-from-head/task.md create mode 100644 2-ui/1-document/2-dom-nodes/article.md create mode 100644 2-ui/1-document/index.md create mode 100644 2-ui/index.md diff --git a/1-js/08-error-handling/1-try-catch/article.md b/1-js/08-error-handling/1-try-catch/article.md index 228aad47..afd9c674 100644 --- a/1-js/08-error-handling/1-try-catch/article.md +++ b/1-js/08-error-handling/1-try-catch/article.md @@ -575,11 +575,11 @@ In the code above, an error inside `try` always falls out, because there's no `c The information from this section is not a part of the core Javascript. ``` -Let's imagine we've got a fatal error outside of `try..catch`, and the script died. Like a programming error that no `try..catch` doesn't know how to handle, or something else terrible. +Let's imagine we've got a fatal error outside of `try..catch`, and the script died. Like a programming error or something else terrible. -Is there a way to react on such happening? We may want to log the error, show something to the user (normally he doesn't see the error message) etc. +Is there a way to react on such a happening? We may want to log the error, show something to the user (normally he doesn't see error messages) etc. -There is none in the specification, but environments usually provide it, because it's really handy. For instance, Node.JS has [process.on('uncaughtException')](https://nodejs.org/api/process.html#process_event_uncaughtexception) for that. And in the browser we can assign a function to special [window.onerror](mdn:api/GlobalEventHandlers/onerror) property. It will run in case of an uncaught error. +There is none in the specification, but environments usually provide it, because it's really useful. For instance, Node.JS has [process.on('uncaughtException')](https://nodejs.org/api/process.html#process_event_uncaughtexception) for that. And in the browser we can assign a function to special [window.onerror](mdn:api/GlobalEventHandlers/onerror) property. It will run in case of an uncaught error. The syntax: @@ -621,7 +621,14 @@ For instance: The role of the global handler `window.onerror` is usually not to recover the script execution -- that's probably impossible in case of programming errors, but to send the error message to developers. -There are also web-services that provide error-logging facilities for such cases, like or . They give a script with custom `window.onerror` function, and once inserted into a page, it reports about all errors it gets to their server. Afterwards developers can browse them and get notifications on email about fresh errors. +There are also web-services that provide error-logging for such cases, like or . + +They work like this: + +1. We register at the service and get a piece of JS (or a script URL) from them to insert on pages. +2. That JS script has a custom `window.onerror` function. +3. When an error occurs, it sends a network request about it to the service. +4. We can log in to the service web interface and see errors. ## Summary diff --git a/1-js/08-error-handling/2-custom-errors/1-format-error/task.md b/1-js/08-error-handling/2-custom-errors/1-format-error/task.md index 03532d32..2c8e910f 100644 --- a/1-js/08-error-handling/2-custom-errors/1-format-error/task.md +++ b/1-js/08-error-handling/2-custom-errors/1-format-error/task.md @@ -4,9 +4,12 @@ importance: 5 # Inherit from SyntaxError -Create an error `FormatError` that inherits from `SyntaxError`. +Create a class `FormatError` that inherits from the built-in `SyntaxError` class. + +It should support `message`, `name` and `stack` properties. Usage example: + ```js let err = new FormatError("formatting error"); @@ -14,5 +17,6 @@ alert( err.message ); // formatting error alert( err.name ); // FormatError alert( err.stack ); // stack -alert( err instanceof SyntaxError ); // true +alert( err instanceof FormatError ); // true +alert( err instanceof SyntaxError ); // true (because inherits from SyntaxError) ``` diff --git a/1-js/08-error-handling/2-custom-errors/article.md b/1-js/08-error-handling/2-custom-errors/article.md index 572ecdc6..8541078c 100644 --- a/1-js/08-error-handling/2-custom-errors/article.md +++ b/1-js/08-error-handling/2-custom-errors/article.md @@ -1,36 +1,35 @@ # Custom errors, extending Error -When we develop our software, we need our own error classes. For network operations we may need `HttpError`, for database operations `DbError`, for searching operations `NotFoundError` and so on. +When we develop something, we often need our own error classes to reflect specific things that may go wrong in our tasks. For errors in network operations we may need `HttpError`, for database operations `DbError`, for searching operations `NotFoundError` and so on. -Our errors should inherit from with the basic `Error` class and have basic error properties like `message`, `name` and, preferably, `stack`. But they also may have other properties of their own, e.g. `HttpError` objects may have `statusCode` property, that is `404` for the "page not found" error. +Our errors should inherit from basic `Error` class and support basic error properties like `message`, `name` and, preferably, `stack`. But they also may have other properties of their own, e.g. `HttpError` objects may have `statusCode` property with a value like `404` or `403` or `500`. -Technically, we can use standalone classes for errors, because Javascript allows to use `throw` with any argument. But if we inherit from `Error`, then we can use `obj instanceof Error` check to identify error objects. So it's better to inherit from it. +Technically, we can use standalone classes for our errors, because Javascript allows to use `throw` with any argument. But if we inherit from `Error`, then it becomes possible to use `obj instanceof Error` check to identify error objects. So it's better to inherit from it. As we build our application, our own errors naturally form a hierarchy, for instance `HttpTimeoutError` may inherit from `HttpError`. Examples will follow soon. ## Extending Error -As an example, let's create a function `readUser(json)` that should read JSON with user data. We are getting that data from a remote server or, maybe it may be altered by a visitor, or just for the sheer safety -- we should to be aware of possible errors in `json`. +As an example, let's consider a function `readUser(json)` that should read JSON with user data. Here's an example of how a valid `json` may look: ```js let json = `{ "name": "John", "age": 30 }`; ``` -If the function receives malformed `json`, then it should throw `SyntaxError`. Fortunately, `JSON.parse` does exactly that. +If `JSON.parse` receives malformed `json`, then it throws `SyntaxError`. But even if `json` is syntactically correct, it may don't have the necessary data. For instance, if may not have `name` and `age` properties that are essential for our users. -...But if the `json` is correct, that doesn't mean it has all the data. For instance, if may not have `name` or `age`. +That's called "data validation" -- we need to ensure that the data has all the necessary fields. And if the validation fails, then it not really a `SyntaxError`, because the data is syntactically correct. Let's create `ValidationError` -- the error object of our own with additional information about the offending field. -That's called "data validation" -- we need to ensure that the data has all the necessary fields. And if the validation fails, then throwing `SyntaxError` would be wrong, because the data is syntactically correct. So we should throw `ValidationError` -- the error object of our own with the proper message and, preferable, with additional information about the offending field. - -Let's make the `ValidationError` class. But to better understand what we're extending -- here's the approximate code for built-in [Error class](https://tc39.github.io/ecma262/#sec-error-message): +Our `ValidationError` should inherit from the built-in `Error` class. To better understand what we're extending -- here's the approximate code for built-in [Error class](https://tc39.github.io/ecma262/#sec-error-message): ```js +// "pseudocode" for the built-in Error class defined by Javascript itself class Error { constructor(message) { this.message = message; - this.name = "Error"; // (different names for different built-in errors) - this.stack = ; // non-standard! most environments support it + this.name = "Error"; // (different names for different built-in error classes) + this.stack = ; // non-standard, but most environments support it } } ``` @@ -38,7 +37,9 @@ class Error { Now let's inherit from it: ```js run untrusted +*!* class ValidationError extends Error { +*/!* constructor(message) { super(message); // (1) this.name = "ValidationError"; // (2) @@ -58,11 +59,10 @@ try { } ``` -Notes: - -1. In the line `(1)` we call the parent constructor to set the message. Javascript requires us to call `super` in the child constructor anyway. -2. The `name` property for our own errors should be assigned manually, otherwise it would be set by the superclass (to `"Error"`). +Please note: +1. In the line `(1)` we call the parent constructor to set the message. Javascript requires us to call `super` in the child constructor. +2. The parent constructor sets the `name` property to `"Error"`, so here we reset it to the right value. Let's try to use it in `readUser(json)`: @@ -105,15 +105,15 @@ try { } ``` -Everything works -- both our `ValidationError` and the built-in `SyntaxError` from `JSON.parse` are correctly handled. +Everything works -- both our `ValidationError` and the built-in `SyntaxError` from `JSON.parse` can be generated and handled. -Please note how the code check for the error type in `catch (err) { ... }`. We could use `if (err.name == "ValidationError")`, but `if (err instanceof ValidationError)` is much better, because in the future we are going to extend `ValidationError`, make new subtypes of it, namely `PropertyRequiredError`. And `instanceof` check will continue to work. So that's future proof. +Please take a look at how the code checks for the error type in `catch (err) { ... }`. We could use `if (err.name == "ValidationError")`, but `if (err instanceof ValidationError)` is much better, because in the future we are going to extend `ValidationError`, make new subtypes of it, namely `PropertyRequiredError`. And `instanceof` check will continue to work. So that's future-proof. -Also it's important that if we meet an unknown error, then we just rethrow it. The `catch` only knows how to handle validation and syntax errors, other kinds (due to a typo in the code or such) should fall through. +Also it's important that if `catch` meets an unknown error, then it rethrows it. The `catch` only knows how to handle validation and syntax errors, other kinds (due to a typo in the code or such) should fall through. ## Further inheritance -The `ValidationError` class is very generic. Let's make a more concrete class `PropertyRequiredError`, exactly for the absent properties. It will carry additional information about the property that's missing. +The `ValidationError` class is very generic. Many things may be wrong. The property may be absent or it may be in a wrong format (like a string value for `age`). Let's make a more concrete class `PropertyRequiredError`, exactly for absent properties. It will carry additional information about the property that's missing. ```js run class ValidationError extends Error { @@ -166,13 +166,11 @@ try { } ``` -The new class `PropertyRequiredError` is easier to use, because we just pass the property name to it: `new PropertyRequiredError(property)`. The human-readable `message` is generated by the constructor. +The new class `PropertyRequiredError` is easy to use: we only need to pass the property name: `new PropertyRequiredError(property)`. The human-readable `message` is generated by the constructor. -Plese note that `this.name` in `PropertyRequiredError` once again assigned manually. We could evade that by using `this.constructor.name` for `this.name` in the superclass. +Plese note that `this.name` in `PropertyRequiredError` once again assigned manually. We could make our own "basic error" class, name it `MyError` that removes this burden from our shoulders by using `this.constructor.name` for `this.name` in the constructor. And then inherit from it. -The generic solution would be to make `MyError` class that takes care of it, and inherit from it. - -For instance: +Here we go: ```js run class MyError extends Error { @@ -193,21 +191,21 @@ class PropertyRequiredError extends ValidationError { } } +// name is correct alert( new PropertyRequiredError("field").name ); // PropertyRequiredError ``` +Now the inheritance became simpler, as we got rid of the `"this.name = ..."` line in the constructor. ## Wrapping exceptions -The purpose of the function `readUser` in the code above is -- to "read the user data", right? There may occur different kinds of errors in the process, not only `SyntaxError` and `ValidationError`, but probably others if we continue developing it. +The purpose of the function `readUser` in the code above is "to read the user data", right? There may occur different kinds of errors in the process. Right now we have `SyntaxError` and `ValidationError`, but there may appear more if we put more stuff into it. -Right now the code which calls `readUser` uses multiple `if` in `catch` to check for different error types and rethrow if the error is unknown. +Right now the code which calls `readUser` uses multiple `if` in `catch` to check for different error types. The important questions is: do we really want to check for all error types one-by-one every time we call `readUser`? -But the important questions is: do we want to check for all these types every time we call `readUser`? +Often the answer is: "No". The outer code wants to be "one level above all that". It wants to have some kind of "data reading error". Why exactly it happened -- is usually irrelevant (the message has the info). Or, even better if there is a way to get more details, but only if we need to. -Often the answer is: "No". The outer code wants to be "one level above all that". It wants to have some kind of "data reading error", and why exactly it happened -- is usually irrelevant (the message has the info). Or, even better if there is a way to get more details, but only if it wants to. - -In our case, when a data-reading error occurs, we will create an object of the new class `ReadError`, that will provide the proper message. And we'll also keep the original error in its `cause` property, just in case. +So let's make a new class `ReadError` to represent such errors. If an error occurs inside `readUser`, we'll catch it there and generate `ReadError`. We'll also keep the reference to the original error in the `cause` property. ```js run class ReadError extends Error { @@ -237,21 +235,25 @@ function readUser(json) { try { user = JSON.parse(json); } catch (err) { +*!* if (err instanceof SyntaxError) { throw new ReadError("Syntax Error", err); } else { throw err; } +*/!* } try { validateUser(user); } catch (err) { +*!* if (err instanceof ValidationError) { throw new ReadError("Validation Error", err); } else { throw err; } +*/!* } } @@ -271,8 +273,9 @@ try { } ``` -The approach is called "wrapping exceptions", because we take "low level exceptions" and "wrap" them into `ReadError` that is more abstract and more convenient to use for the calling code. +In the code above, `readUser` does exactly as described -- catches syntax and validation errors and throws `ReadError` errors instead (unknown errors are rethrown as usual). +The approach is called "wrapping exceptions", because we take "low level exceptions" and "wrap" them into `ReadError` that is more abstract and more convenient to use for the calling code. It is widely used in object-oriented programming. ## Summary diff --git a/2-ui/1-document/1-browser-environment/article.md b/2-ui/1-document/1-browser-environment/article.md new file mode 100644 index 00000000..39573e16 --- /dev/null +++ b/2-ui/1-document/1-browser-environment/article.md @@ -0,0 +1,104 @@ +# Browser environment, specs + +The Javascript language was born for web browsers. But as of now, it evolved and became a language with many use cases, not tied to browsers. + +The Javascript standard though assumes that the execution happens in a *host environment*, say Node.JS server, or a web-browser. + +That host environment may provide additional objects and functions though. Web browsers provide means to control web pages. Node.JS provides server-side features. There are other host environments too. + +[cut] + +Here's a bird-eye view of what we have when Javascript runs in a web-browser: + +![](windowObjects.png) + +On the top, there's `window` -- the object has two meanings: + +1. First, it is a [global object](info:global-object) in terms of Javascript. +2. Second, it represents the "browser window" object, supports methods to control it and read its parameters. + +For instance, to see the window height: + +```js run +alert(window.innerHeight); // some number +``` + +Now we go from left to right. + +## Document Object Model (DOM) + +The `document` object gives access to a webpage contents. We can change or create literally anything. + +For instance: +```js run +document.body.style.background = 'red'; +alert('The element became red! In 1 second it will become normal.'); +setTimeout(() => document.body.style.background = '', 1000); +``` + +There are two working groups who develop the standard: + +1. [W3C](https://en.wikipedia.org/wiki/World_Wide_Web_Consortium) -- the documentation is at . +2. [WhatWG](https://en.wikipedia.org/wiki/WHATWG), publishing at . + +About 99.9% of time these two groups agree, so the actual documentation is almost the same. There are very minor differences that you shouldn't even notice that in practice. + +I find more pleasant to use. + +Historically, once there was no standard at all -- each browser did whatever it wanted. So different browsers had different methods and properties, and we had to find different code for each of them. Yeah, terrible, please don't remind. + +Then the DOM standard appeared, in an attempt to bring them to an agreement. The first version is now called DOM Level 1. Then it was extended by DOM Level 2, new methods got added, then DOM Level 3, and now DOM Level 4. + +People from WhatWG got tired of version and are calling that just "DOM", without a number. So will do we. + +```smart header="DOM is not only for browsers" +The DOM specification explains the tree structure of a document and methods to manipulate it. There are non-browser instruments that use it as well. For instance, server-side tools that download HTML pages and process them. They may support only a part of the specification though. +``` + +```smart header="CSSOM for styling" +CSS styles and stylesheets are organized not like HTML. They form a standalone domain. + +So there's a separate specification [CSSOM](https://www.w3.org/TR/cssom-1/) that explains how CSS styles and rules can be read and modified as objects, how to read and write them in the document. + +If you're interested to read about general document structure, creating and modifying elements -- then it's DOM. But if it's about styles, then it's CSSOM. +``` + +## BOM (part of HTML spec) + +Browser Object Model (BOM) are objects to work with anything except the document. + +For instance: + +- The [navigator](mdn:api/Window/navigator) object provides background information about the browser and the operation system. There are many properties, but two most widely known are: `navigator.userAgent` -- about the current browser, and `navigator.platform` -- about the platform (can help to differ between Windows/Linux/Mac etc). +- The [location](mdn:api/Window/location) object allows to read the current URL and redirect the browser to a new one. +- Functions `alert/confirm/prompt` -- are also a part of BOM, they are not related to "document". +- ...and so on. + +Here's how we can use the `location`: + +```js run +alert(location.href); // shows current URL +``` + +```smart header="HTML specification" +BOM is the part of the general [HTML specification](https://html.spec.whatwg.org). + +Yes, right. The HTML spec at covers not only the "HTML language" (tags, attributes), but also a bunch of objects, methods and browser-specific DOM extensions, including those listed above. +``` + +## Summary + +So, talking about general standards, we have: + +DOM specification +: Describes the document structure, manipulations and events, see . + +CSSOM specification +: Describes styles, manipulations with them and their binding to documents, see . + +HTML specification +: Describes HTML language and also BOM (browser object model) -- various browser functions: `setTimeout`, `alert`, `location` and so on, see . + +Now we'll get down to learning DOM, because the document plays the central role in the UI, and working with it is the most complex part. + +Please note the links above, because there's so many stuff to learn, it's impossible to cover and remember everything. When you'd like to read about a property or a method -- can go , but looking up the corresponding spec is even better. Longer to read, but will make your fundamental knowledge stronger. diff --git a/2-ui/1-document/1-browser-environment/windowObjects.png b/2-ui/1-document/1-browser-environment/windowObjects.png new file mode 100644 index 0000000000000000000000000000000000000000..c44b9ab8532a36f5b69a0646415362179d68cf37 GIT binary patch literal 21248 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 literal 0 HcmV?d00001 diff --git a/2-ui/1-document/1-browser-environment/windowObjects@2x.png b/2-ui/1-document/1-browser-environment/windowObjects@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..d79481dbb1c2580d8a93d0b44313d8b7a9b607f8 GIT binary patch literal 51109 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 literal 0 HcmV?d00001 diff --git a/2-ui/1-document/2-dom-nodes/1-body-from-head/solution.md b/2-ui/1-document/2-dom-nodes/1-body-from-head/solution.md new file mode 100644 index 00000000..1618f182 --- /dev/null +++ b/2-ui/1-document/2-dom-nodes/1-body-from-head/solution.md @@ -0,0 +1,20 @@ +Выведет `null`, так как на момент выполнения скрипта тег `` ещё не обработан браузером. + +Попробуйте в действии: + +```html run + + + + + + + + Привет, мир! + + + +``` + diff --git a/2-ui/1-document/2-dom-nodes/1-body-from-head/task.md b/2-ui/1-document/2-dom-nodes/1-body-from-head/task.md new file mode 100644 index 00000000..1b271f05 --- /dev/null +++ b/2-ui/1-document/2-dom-nodes/1-body-from-head/task.md @@ -0,0 +1,26 @@ +importance: 5 + +--- + +# Что выведет этот alert? + +Что выведет `alert`? + +```html + + + +*!* + +*/!* + + + + Привет, мир! + + + +``` + diff --git a/2-ui/1-document/2-dom-nodes/article.md b/2-ui/1-document/2-dom-nodes/article.md new file mode 100644 index 00000000..9de936f0 --- /dev/null +++ b/2-ui/1-document/2-dom-nodes/article.md @@ -0,0 +1,203 @@ +libs: + - d3 + - domtree + +--- + +# DOM tree + +When we look at HTML we see nested tags, right? According to Document Object Model (DOM), every HTML-tag is an object. Nested tags are his "children". And the text inside it is an object as well. All these objects are accessible using Javascript. + +## An example of DOM + +For instance, let's see the DOM tree for this document: + +```html run no-beautify + + + + About elks + + + The truth about elks. + + +``` + +Here's how it looks: + +
+ + + +There are two types of tree nodes in the example: + +1. Tags are called *element nodes* (or just elements). Naturally, nested tags become children of the enclosing ones. Because of that we have a tree. +2. The text inside elements forms *text nodes*, labelled as `#text`. A text node contains only a string. It may not have children and is always a leaf of the tree. + +```online +**On the picture above element nodes you can click on element nodes. Their children will open/collapse.** +``` + +Please note the special characters in text nodes: + +- a newline: `↵` (in Javascript known as `\n`) +- a space: `␣` + +**Spaces and newlines -- are all valid characters, they form text nodes and become a part of the DOM.** + +For instance, in the example above `` contains not only elements `` and ``, but also the `#text` (spaces, line breaks) between them. + +However, on the topmost level there are exclusions of that rule: spaces and newlines before `` are ignored for historical reasons, and if we put something after ``, then it is considered a malformed HTML, and that text is moved inside the `body`, at the end (there may be nothing after the `body`). + +In other cases everything's honest -- if there are spaces (just like any character) in the document, then they text nodes in DOM, and if we remove them, then there won't be any in DOM, like here: + +```html no-beautify + +About elksThe truth about elks. +``` + +
+ + + +```smart +From here on, spaces and line-breaks on DOM pictures will only be shown for "space-only" nodes that have no other text. +``` + +## Autocorrection + +If the browser encounters malformed HTML, it automatically corrects it when making DOM. + +For instance, the top tag is always ``. Even if it doesn't exist in the document -- it will be in DOM, the browser will create it. The same about ``. + +Like, if the HTML file is a single word `"Hello"`, the browser will wrap it into `` and ``. + +**While generating DOM, browser automatically processes errors in the document, closes tags and so on.** + +Such a document: + +```html no-beautify +

Hello +

  • Mom +
  • and +
  • Dad +``` + +...Will make a respectable DOM, as the browser knows how to read tags (from the spec): + +
    + + + +````warn header="Tables always have ``" +An interesting "special case" is tables. By the DOM specification they must have ``, but HTML text may omit it. Then the browser creates `` on it's own. + +For the HTML: + +```html no-beautify +
    1
    +``` + +DOM-structure will be: +
    + + + +Do you see? The `` has appeared out of nowhere. Should keep in mind while working with tables to evade surprises. +```` + +## Other node types + +Let's add more tags and a comment to the page: + +```html + + + + The truth about elks. +
      +
    1. An elk is a smart
    2. +*!* + +*/!* +
    3. ...and cunning animal!
    4. +
    + + +``` + +
    + + + +Here we see a new tree node type -- *comment node*. + +We may think -- why a comment is added to the DOM? It doesn't affect the visual representation anyway. But there's a rule -- if something's in HTML, then it also must be in the DOM tree. + +**Everything in HTML has its place in DOM.** + +Even the `` directive at the very beginning of HTML is also a DOM node. It's in the DOM tree right before ``. The pictures above don't show that fact, because we are not going to touch that node, but it's there. + +The `document` object that represents the whole document is, formally, a DOM node as well. + +There are 12 node types. In practice we only work with 4 of them: + +1. `document` -- the "entry point" into DOM. +2. element nodes -- HTML-tags, the tree building blocks. +3. text nodes -- they contain text. +4. comments -- sometimes we can put the information there, that won't be shown, but JS can read it from DOM. + +If you want to explore how DOM changes with the document, please consider the [Live DOM Viewer](http://software.hixie.ch/utilities/js/live-dom-viewer/). Just type in/modify the document, and it will show up DOM at instant. + +## Power of DOM + +Why besides nice pictures do we need DOM? To manipulate the page -- read the information from HTML, create and modify elements. + +The `` node is accessible as `document.documentElement`, and `` -- as `document.body`. + +Then we can do something with the node. + +Like changing the color: +```js run +document.body.style.background = 'yellow'; +alert('The body is now yellow'); + +// return back in 3 seconds +setTimeout(() => document.body.style.background = '', 3000); +``` + +...But actually much more. + +In the next chapters we're going to learn it. + +## Summary + +- DOM-модель -- это внутреннее представление HTML-страницы в виде дерева. +- Все элементы страницы, включая теги, текст, комментарии, являются узлами DOM. +- У элементов DOM есть свойства и методы, которые позволяют изменять их. +- IE8- не генерирует пробельные узлы. + +Кстати, DOM-модель используется не только в JavaScript, это известный способ представления XML-документов. + +В следующих главах мы познакомимся с DOM более плотно. diff --git a/2-ui/1-document/index.md b/2-ui/1-document/index.md new file mode 100644 index 00000000..eedfdb9a --- /dev/null +++ b/2-ui/1-document/index.md @@ -0,0 +1,3 @@ +# Document and the web-page. + +Here we'll learn to manipulate a web-page using Javascript. diff --git a/2-ui/index.md b/2-ui/index.md new file mode 100644 index 00000000..358e7cab --- /dev/null +++ b/2-ui/index.md @@ -0,0 +1,3 @@ +# Browser: Document, DOM, Interfaces (in progress) + +Learning how to manage the browser page: add elements, manipulate their size and position, dynamically create interfaces and interact with the visitor.