All language subtitles for 4. How the DOM Really Works

af Afrikaans
sq Albanian
am Amharic
ar Arabic
hy Armenian
az Azerbaijani
eu Basque
be Belarusian
bn Bengali
bs Bosnian
bg Bulgarian
ca Catalan
ceb Cebuano
ny Chichewa
zh-CN Chinese (Simplified)
zh-TW Chinese (Traditional)
co Corsican
hr Croatian
cs Czech
da Danish
nl Dutch
en English
eo Esperanto
et Estonian
tl Filipino
fi Finnish
fr French
fy Frisian
gl Galician
ka Georgian
de German
el Greek
gu Gujarati
ht Haitian Creole
ha Hausa
haw Hawaiian
iw Hebrew
hi Hindi
hmn Hmong
hu Hungarian
is Icelandic
ig Igbo
id Indonesian
ga Irish
it Italian
ja Japanese
jw Javanese
kn Kannada
kk Kazakh
km Khmer
ko Korean
ku Kurdish (Kurmanji)
ky Kyrgyz
lo Lao
la Latin
lv Latvian
lt Lithuanian
lb Luxembourgish
mk Macedonian
mg Malagasy
ms Malay
ml Malayalam
mt Maltese
mi Maori
mr Marathi
mn Mongolian
my Myanmar (Burmese)
ne Nepali
no Norwegian
ps Pashto
fa Persian Download
pl Polish
pt Portuguese
pa Punjabi
ro Romanian
ru Russian
sm Samoan
gd Scots Gaelic
sr Serbian
st Sesotho
sn Shona
sd Sindhi
si Sinhala
sk Slovak
sl Slovenian
so Somali
es Spanish
su Sundanese
sw Swahili
sv Swedish
tg Tajik
ta Tamil
te Telugu
th Thai
tr Turkish
uk Ukrainian
ur Urdu
uz Uzbek
vi Vietnamese
cy Welsh
xh Xhosa
yi Yiddish
yo Yoruba
zu Zulu
or Odia (Oriya)
rw Kinyarwanda
tk Turkmen
tt Tatar
ug Uyghur
Would you like to inspect the original subtitles? These are the user uploaded subtitles that are being translated: 1 1 00:00:01,180 --> 00:00:03,410 Let's start this section by learning 2 2 00:00:03,410 --> 00:00:05,866 how the DOM really works behind the scenes 3 3 00:00:05,866 --> 00:00:10,866 and more specifically how the DOM is organized internally. 4 4 00:00:11,450 --> 00:00:14,510 This will make it easier to understand everything else 5 5 00:00:14,510 --> 00:00:16,623 that's gonna follow in this section. 6 6 00:00:18,410 --> 00:00:21,170 So first, remember that the DOM 7 7 00:00:21,170 --> 00:00:25,280 is basically the interface between all JavaScript code 8 8 00:00:25,280 --> 00:00:29,770 and the browser, or more specifically HTML documents 9 9 00:00:29,770 --> 00:00:33,620 that are rendered in and by the browser. 10 10 00:00:33,620 --> 00:00:37,120 Now we have written a ton of JavaScript code 11 11 00:00:37,120 --> 00:00:38,910 in this course so far, 12 12 00:00:38,910 --> 00:00:42,120 but many times completely without interacting 13 13 00:00:42,120 --> 00:00:45,860 with the browser so without using the DOM. 14 14 00:00:45,860 --> 00:00:47,420 Right? 15 15 00:00:47,420 --> 00:00:50,900 But now we're back to working with webpages 16 16 00:00:50,900 --> 00:00:53,570 and therefore with the DOM 17 17 00:00:53,570 --> 00:00:56,261 and this time we're going to learn as much as possible 18 18 00:00:56,261 --> 00:01:01,261 about the DOM and how to create amazing dynamic effects. 19 19 00:01:01,660 --> 00:01:05,460 So let's remember what we already know about the DOM, 20 20 00:01:05,460 --> 00:01:07,810 which is that we can use it to make 21 21 00:01:07,810 --> 00:01:10,940 JavaScript interact with the browser 22 22 00:01:10,940 --> 00:01:14,220 and again more specifically we can create 23 23 00:01:14,220 --> 00:01:17,050 and modify and delete elements, 24 24 00:01:17,050 --> 00:01:20,340 set styles and classes and attributes 25 25 00:01:20,340 --> 00:01:23,053 and listen and respond to events. 26 26 00:01:23,970 --> 00:01:27,070 In practice this works because a DOM tree 27 27 00:01:27,070 --> 00:01:30,970 is generated from any HTML document 28 28 00:01:30,970 --> 00:01:35,420 and a DOM tree is a tree like structure made out of nodes 29 29 00:01:35,420 --> 00:01:38,300 which looks something like this. 30 30 00:01:38,300 --> 00:01:40,870 And we can then interact with this tree 31 31 00:01:40,870 --> 00:01:44,900 as we already did a couple of times in this course. 32 32 00:01:44,900 --> 00:01:47,882 Now how does that interaction actually work? 33 33 00:01:47,882 --> 00:01:52,340 Well the DOM is a very complex API 34 34 00:01:52,340 --> 00:01:56,383 which remember stands for application programming interface. 35 35 00:01:57,849 --> 00:02:00,080 So it's the interface we can use to 36 36 00:02:00,080 --> 00:02:03,720 programmatically interact with the DOM. 37 37 00:02:03,720 --> 00:02:06,300 In practice that means that the DOM 38 38 00:02:06,300 --> 00:02:08,867 contains a ton of methods and properties 39 39 00:02:08,867 --> 00:02:12,470 that we use to interact with the DOM tree 40 40 00:02:12,470 --> 00:02:14,620 such as the querySelector, addEventListener 41 41 00:02:15,949 --> 00:02:18,570 or createElement methods, 42 42 00:02:18,570 --> 00:02:23,516 or also the innerHTML, textContent or children properties 43 43 00:02:23,516 --> 00:02:25,373 and many, many more. 44 44 00:02:26,250 --> 00:02:30,050 Now in the DOM there are different types of nodes 45 45 00:02:30,050 --> 00:02:32,470 just as I mentioned before. 46 46 00:02:32,470 --> 00:02:35,750 For example some nodes are HTML elements 47 47 00:02:35,750 --> 00:02:39,240 but others are just text, remember? 48 48 00:02:39,240 --> 00:02:41,940 And this is really important to understand 49 49 00:02:41,940 --> 00:02:44,556 because all these DOM methods and properties 50 50 00:02:44,556 --> 00:02:49,073 are organized into these different types of objects. 51 51 00:02:50,710 --> 00:02:53,970 And so let's now take a look at how the DOM API 52 52 00:02:53,970 --> 00:02:56,780 is organized behind the scenes. 53 53 00:02:56,780 --> 00:02:59,977 So first, every single note in the DOM tree 54 54 00:02:59,977 --> 00:03:02,720 is of the type, node. 55 55 00:03:02,720 --> 00:03:05,670 And such as everything else in JavaScript, 56 56 00:03:05,670 --> 00:03:10,092 each node is represented in JavaScript by an object. 57 57 00:03:10,092 --> 00:03:13,690 This object gets access to special node methods 58 58 00:03:13,690 --> 00:03:17,640 and properties, such as text content, child nodes, 59 59 00:03:17,640 --> 00:03:21,063 parent nodes, clone nodes and many others. 60 60 00:03:21,900 --> 00:03:25,320 Now we already know that there are different types of nodes. 61 61 00:03:25,320 --> 00:03:27,000 Right? 62 62 00:03:27,000 --> 00:03:30,167 So how should these be represented? 63 63 00:03:30,167 --> 00:03:35,167 Well, this node type has a couple of child types so to say. 64 64 00:03:35,660 --> 00:03:39,480 And these are the element type, the text type, 65 65 00:03:39,480 --> 00:03:43,588 the comment type and also the document type. 66 66 00:03:43,588 --> 00:03:47,800 So whenever there is text inside any element, 67 67 00:03:47,800 --> 00:03:50,587 we already know that it gets its own node. 68 68 00:03:50,587 --> 00:03:52,080 Right? 69 69 00:03:52,080 --> 00:03:55,890 And that node will be of the type, text. 70 70 00:03:55,890 --> 00:03:59,930 And the same actually happens for HTML comments 71 71 00:03:59,930 --> 00:04:03,060 and that's because the rule is that everything 72 72 00:04:03,060 --> 00:04:07,870 that's in the HTML has to go into the DOM as well. 73 73 00:04:07,870 --> 00:04:10,400 Now for the element itself there is 74 74 00:04:10,400 --> 00:04:12,830 the element type of node. 75 75 00:04:12,830 --> 00:04:16,773 And this type of node gives each HTML access 76 76 00:04:16,773 --> 00:04:19,112 to a ton of useful properties 77 77 00:04:19,112 --> 00:04:24,112 such as innerHTML, classList, children or parent element. 78 78 00:04:25,065 --> 00:04:28,300 There are also many useful methods 79 79 00:04:28,300 --> 00:04:33,300 like append, remove, insertAdjacentHTML, querySelector, 80 80 00:04:33,300 --> 00:04:36,783 closest and that's just to name a few. 81 81 00:04:37,670 --> 00:04:41,763 So again, each element will be represented internally 82 82 00:04:41,763 --> 00:04:44,070 as an object. 83 83 00:04:44,070 --> 00:04:46,120 Now just to make this complete, 84 84 00:04:46,120 --> 00:04:50,180 the element type has internally an HTML element, 85 85 00:04:50,180 --> 00:04:51,698 child type. 86 86 00:04:51,698 --> 00:04:56,590 And that element type itself has exactly one child type 87 87 00:04:56,590 --> 00:05:01,227 for each HTML element that exists in HTML. 88 88 00:05:01,227 --> 00:05:04,530 So we have a special type for buttons, 89 89 00:05:04,530 --> 00:05:06,520 a special type for images, 90 90 00:05:06,520 --> 00:05:09,900 for links, and so on and so forth. 91 91 00:05:09,900 --> 00:05:14,070 And that's important because each of these HTML elements 92 92 00:05:14,070 --> 00:05:16,830 can have different unique properties. 93 93 00:05:16,830 --> 00:05:21,190 For example and image has a source attribute in HTML 94 94 00:05:21,190 --> 00:05:22,913 which no other element has. 95 95 00:05:24,287 --> 00:05:25,750 Or the anchor element for links 96 96 00:05:25,750 --> 00:05:30,520 has the HREF attribute which also no other element has. 97 97 00:05:30,520 --> 00:05:32,950 And so the DOM needs a way of storing 98 98 00:05:32,950 --> 00:05:34,700 these different attributes 99 99 00:05:34,700 --> 00:05:36,790 and therefore different types 100 100 00:05:36,790 --> 00:05:40,593 of HTML elements were created in the DOM API. 101 101 00:05:41,510 --> 00:05:44,614 And just to make sure that we're all on the same page here, 102 102 00:05:44,614 --> 00:05:47,280 this diagram that I'm showing you here 103 103 00:05:47,280 --> 00:05:50,320 is of course not a DOM tree. 104 104 00:05:50,320 --> 00:05:51,400 Right? 105 105 00:05:51,400 --> 00:05:56,290 So this is not a representation of any HTML document. 106 106 00:05:56,290 --> 00:05:59,560 This is just a way that different types of nodes 107 107 00:05:59,560 --> 00:06:03,610 are represented behind the scenes in the DOM API. 108 108 00:06:03,610 --> 00:06:04,443 Now, right? 109 109 00:06:05,320 --> 00:06:09,460 But anyway, now comes the really important part, 110 110 00:06:09,460 --> 00:06:11,930 because what makes all of this work 111 111 00:06:11,930 --> 00:06:14,193 is something called inheritance. 112 112 00:06:15,170 --> 00:06:17,503 So what is inheritance? 113 113 00:06:17,503 --> 00:06:21,840 Well inheritance means that all the child types 114 114 00:06:21,840 --> 00:06:24,791 will also get access to the methods and properties 115 115 00:06:24,791 --> 00:06:28,260 of all their parent node types. 116 116 00:06:28,260 --> 00:06:32,760 For example an HTML element will get access to everything 117 117 00:06:32,760 --> 00:06:37,760 from the element type, like innerHTML, or classList 118 118 00:06:38,350 --> 00:06:41,710 or all these other methods and properties. 119 119 00:06:41,710 --> 00:06:45,080 And besides that it will also get access to everything 120 120 00:06:45,080 --> 00:06:49,382 from the node type because that is also its parent type. 121 121 00:06:49,382 --> 00:06:51,220 Okay? 122 122 00:06:51,220 --> 00:06:53,330 So we can think of this as though 123 123 00:06:53,330 --> 00:06:56,310 the HTML button element for example, 124 124 00:06:56,310 --> 00:06:59,950 is also an element and also a node. 125 125 00:06:59,950 --> 00:07:01,400 All right? 126 126 00:07:01,400 --> 00:07:05,010 Now this might seem all a bit weird and confusing 127 127 00:07:05,010 --> 00:07:06,430 but don't worry. 128 128 00:07:06,430 --> 00:07:10,640 We will learn why this kind of inheritance works very soon 129 129 00:07:10,640 --> 00:07:14,670 when we finally talk about object oriented JavaScript. 130 130 00:07:14,670 --> 00:07:18,330 For now, what I want you to understand is that a DOM API 131 131 00:07:18,330 --> 00:07:22,520 is broken up into these different types of nodes. 132 132 00:07:22,520 --> 00:07:25,140 I also want you to understand that each 133 133 00:07:25,140 --> 00:07:26,690 of these types of nodes 134 134 00:07:26,690 --> 00:07:30,080 has access to different properties and methods 135 135 00:07:30,080 --> 00:07:31,150 and that some of them 136 136 00:07:31,150 --> 00:07:33,910 even inherit more properties and methods 137 137 00:07:33,910 --> 00:07:37,770 from their ancestors in this organization. 138 138 00:07:37,770 --> 00:07:38,603 All right? 139 139 00:07:39,500 --> 00:07:43,840 Now we didn't talk yet about the documents node type. 140 140 00:07:43,840 --> 00:07:48,329 So document, which we use all the time in DOM manipulation 141 141 00:07:48,329 --> 00:07:51,470 is in fact just another type of node 142 142 00:07:52,380 --> 00:07:54,650 so it contains important methods, 143 143 00:07:54,650 --> 00:07:56,980 such as querySelector, createElement 144 144 00:07:58,368 --> 00:08:00,480 and getElement by I.D. 145 145 00:08:00,480 --> 00:08:02,100 And note how querySelector 146 146 00:08:02,100 --> 00:08:07,100 is available on both the document and element types. 147 147 00:08:07,290 --> 00:08:11,073 So keep this in mind because it will be important later on. 148 148 00:08:12,060 --> 00:08:14,160 All right, and now there is just 149 149 00:08:14,160 --> 00:08:16,320 one final missing piece here 150 150 00:08:16,320 --> 00:08:19,081 because the DOM API actually needs a way 151 151 00:08:19,081 --> 00:08:24,081 of allowing all the node types to listen to events. 152 152 00:08:24,300 --> 00:08:28,080 And remember we usually listen for events by calling the 153 153 00:08:28,080 --> 00:08:32,550 addEventListener method on an element or the document. 154 154 00:08:32,550 --> 00:08:33,840 Right? 155 155 00:08:33,840 --> 00:08:36,253 So why does that actually work? 156 156 00:08:37,150 --> 00:08:40,660 Well its because there is a special node type called 157 157 00:08:40,660 --> 00:08:45,410 EventTarget which is a parent of both the node type 158 158 00:08:45,410 --> 00:08:48,310 and also the window node type. 159 159 00:08:48,310 --> 00:08:51,120 And so with this, thanks to inheritance, 160 160 00:08:51,120 --> 00:08:55,180 we can call addEventListener on every single type of node 161 161 00:08:55,180 --> 00:08:58,291 in the DOM API because all elements 162 162 00:08:58,291 --> 00:09:01,280 as well as document and window, 163 163 00:09:01,280 --> 00:09:05,830 and even text and comment will inherit this method 164 164 00:09:05,830 --> 00:09:09,720 and therefore we will be able to use addEventListener 165 165 00:09:09,720 --> 00:09:13,920 on all of them just as if it was their own method. 166 166 00:09:13,920 --> 00:09:16,330 Now just to be clear, we do never 167 167 00:09:16,330 --> 00:09:19,510 manually create an eventTarget object. 168 168 00:09:19,510 --> 00:09:20,530 Okay. 169 169 00:09:20,530 --> 00:09:22,693 This is just an abstract type 170 170 00:09:22,693 --> 00:09:25,010 that we do not use in practice. 171 171 00:09:25,010 --> 00:09:27,373 This all really happens behind the scenes 172 172 00:09:27,373 --> 00:09:32,270 to make all the functionality work as we expect it to work. 173 173 00:09:32,270 --> 00:09:36,496 So in a nutshell this is how the DOM API works 174 174 00:09:36,496 --> 00:09:39,770 and is structured behind the scenes. 175 175 00:09:39,770 --> 00:09:42,370 There are still some simplifications here 176 176 00:09:42,370 --> 00:09:44,960 but this is all that really matters. 177 177 00:09:44,960 --> 00:09:48,690 And I really wish that I could have had this diagram 178 178 00:09:48,690 --> 00:09:51,750 when I learnt JavaScript for the first time. 179 179 00:09:51,750 --> 00:09:55,030 Because I really think this helps structuring 180 180 00:09:55,030 --> 00:09:58,080 all this information in your mind. 181 181 00:09:58,080 --> 00:10:00,820 Now if you want to go even deeper than this 182 182 00:10:00,820 --> 00:10:03,160 there is still tons of material 183 183 00:10:03,160 --> 00:10:06,710 that you can check out in the MDN documentation 184 184 00:10:06,710 --> 00:10:10,740 and if you ask me it's all really fascinating. 185 185 00:10:10,740 --> 00:10:13,040 But again, all that you need to know 186 186 00:10:13,040 --> 00:10:15,370 is really in this lecture. 187 187 00:10:15,370 --> 00:10:18,800 It took me a lot of hours to put this one together 188 188 00:10:18,800 --> 00:10:21,360 but I think it was well worth it 189 189 00:10:21,360 --> 00:10:23,670 and I hope you think the same. 190 190 00:10:23,670 --> 00:10:25,690 But anyway lets now move on 191 191 00:10:25,690 --> 00:10:28,520 to the practical part Of this section 192 192 00:10:28,520 --> 00:10:29,580 were we will then 193 193 00:10:29,580 --> 00:10:32,713 finally use many of these things in action. 16837

Can't find what you're looking for?
Get subtitles in any language from opensubtitles.com, and translate them here.