All language subtitles for 192 Event Delegation_ Implementing Page Navigation.en_US1

af Afrikaans
ak Akan
sq Albanian
am Amharic
ar Arabic
hy Armenian
az Azerbaijani
eu Basque
be Belarusian
bem Bemba
bn Bengali
bh Bihari
bs Bosnian
br Breton
bg Bulgarian
km Cambodian
ca Catalan
ceb Cebuano
chr Cherokee
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
ee Ewe
fo Faroese
tl Filipino
fi Finnish
fr French
fy Frisian
gaa Ga
gl Galician
ka Georgian
de German
el Greek
gn Guarani
gu Gujarati
ht Haitian Creole
ha Hausa
haw Hawaiian
iw Hebrew
hi Hindi
hmn Hmong
hu Hungarian Download
is Icelandic
ig Igbo
id Indonesian
ia Interlingua
ga Irish
it Italian
ja Japanese
jw Javanese
kn Kannada
kk Kazakh
rw Kinyarwanda
rn Kirundi
kg Kongo
ko Korean
kri Krio (Sierra Leone)
ku Kurdish
ckb Kurdish (Soranî)
ky Kyrgyz
lo Laothian
la Latin
lv Latvian
ln Lingala
lt Lithuanian
loz Lozi
lg Luganda
ach Luo
lb Luxembourgish
mk Macedonian
mg Malagasy
ms Malay
ml Malayalam
mt Maltese
mi Maori
mr Marathi
mfe Mauritian Creole
mo Moldavian
mn Mongolian
my Myanmar (Burmese)
sr-ME Montenegrin
ne Nepali
pcm Nigerian Pidgin
nso Northern Sotho
no Norwegian
nn Norwegian (Nynorsk)
oc Occitan
or Oriya
om Oromo
ps Pashto
fa Persian
pl Polish
pt-BR Portuguese (Brazil)
pt Portuguese (Portugal)
pa Punjabi
qu Quechua
ro Romanian
rm Romansh
nyn Runyakitara
ru Russian
sm Samoan
gd Scots Gaelic
sr Serbian
sh Serbo-Croatian
st Sesotho
tn Setswana
crs Seychellois Creole
sn Shona
sd Sindhi
si Sinhalese
sk Slovak
sl Slovenian
so Somali
es Spanish
es-419 Spanish (Latin American)
su Sundanese
sw Swahili
sv Swedish
tg Tajik
ta Tamil
tt Tatar
te Telugu
th Thai
ti Tigrinya
to Tonga
lua Tshiluba
tum Tumbuka
tr Turkish
tk Turkmen
tw Twi
ug Uighur
uk Ukrainian
ur Urdu
uz Uzbek
vi Vietnamese
cy Welsh
wo Wolof
xh Xhosa
yi Yiddish
yo Yoruba
zu Zulu
Would you like to inspect the original subtitles? These are the user uploaded subtitles that are being translated: 1 00:00:01,410 --> 00:00:04,380 Let's now use the power of event bubbling 2 00:00:04,380 --> 00:00:07,413 to implement something called event delegation. 3 00:00:09,050 --> 00:00:10,440 So what we're gonna do, 4 00:00:10,440 --> 00:00:13,400 is to implement a smooth scrolling behavior 5 00:00:13,400 --> 00:00:14,840 in the navigation, 6 00:00:14,840 --> 00:00:17,800 so that when we click one of these links here, 7 00:00:17,800 --> 00:00:21,120 it will then automatically scroll smoothly 8 00:00:21,120 --> 00:00:24,163 to the corresponding section, all right? 9 00:00:25,690 --> 00:00:28,550 So right now, as we click one of these links, 10 00:00:28,550 --> 00:00:30,330 it actually moves there, 11 00:00:30,330 --> 00:00:33,570 but of course we want this to happen smoothly. 12 00:00:33,570 --> 00:00:36,760 And so let's now go ahead, and use event delegation 13 00:00:36,760 --> 00:00:38,563 to implement this navigation. 14 00:00:39,970 --> 00:00:43,890 And actually let's do that here at the top of the file. 15 00:00:43,890 --> 00:00:46,680 So here in the beginning, I will have all the code 16 00:00:46,680 --> 00:00:49,560 that is actually really related to the page, 17 00:00:49,560 --> 00:00:51,503 while down here, we then have the code 18 00:00:51,503 --> 00:00:54,733 that we have been using to experiment with some stuff. 19 00:00:56,440 --> 00:00:58,070 All right? 20 00:00:58,070 --> 00:01:02,540 So page navigation comes the right here 21 00:01:02,540 --> 00:01:04,023 after the model window. 22 00:01:04,870 --> 00:01:08,570 Let's grab this separator code here. 23 00:01:08,570 --> 00:01:12,120 And in fact, we can also put this code here, 24 00:01:12,120 --> 00:01:13,503 which was for scrolling. 25 00:01:15,240 --> 00:01:17,780 So this code, we also need it active 26 00:01:17,780 --> 00:01:21,423 in order to make this button here work, right? 27 00:01:22,620 --> 00:01:24,793 So let's put that actually here second, 28 00:01:26,716 --> 00:01:28,256 (mouse clicks) 29 00:01:28,256 --> 00:01:29,247 and okay. 30 00:01:29,247 --> 00:01:30,080 (mouse clicks) 31 00:01:30,080 --> 00:01:31,953 And this here, 32 00:01:31,953 --> 00:01:34,786 (keyboard clicks) 33 00:01:37,380 --> 00:01:38,330 All right. 34 00:01:38,330 --> 00:01:40,210 And these selections, 35 00:01:40,210 --> 00:01:43,803 I will put all of them here at the top, all right? 36 00:01:44,870 --> 00:01:48,090 So that's a little bit of a nicer organization 37 00:01:48,090 --> 00:01:50,870 having just like in the last project, 38 00:01:50,870 --> 00:01:55,870 all of the selection in one nice line, all right? 39 00:01:58,240 --> 00:02:00,650 (mouse clicks) 40 00:02:00,650 --> 00:02:02,490 Now we get this error here, 41 00:02:02,490 --> 00:02:05,630 that, btnScrollTo has already been declared. 42 00:02:05,630 --> 00:02:09,690 Oh, and that's because we actually wanted to cut this code. 43 00:02:09,690 --> 00:02:11,373 So we no longer want it here. 44 00:02:13,549 --> 00:02:14,470 (mouse clicks) 45 00:02:14,470 --> 00:02:15,310 Okay. 46 00:02:15,310 --> 00:02:17,770 So with is, we clean it up a little bit. 47 00:02:17,770 --> 00:02:21,040 And so let's no go actually to the place in code 48 00:02:21,040 --> 00:02:24,650 where we want to implement the page navigation. 49 00:02:24,650 --> 00:02:26,850 Now let's actually first implement this 50 00:02:26,850 --> 00:02:29,290 without using event delegation 51 00:02:29,290 --> 00:02:32,030 so that you can see the problem in the approach 52 00:02:32,030 --> 00:02:34,280 that we've been using so far. 53 00:02:34,280 --> 00:02:38,173 And so let's now select all of these three links here. 54 00:02:40,050 --> 00:02:43,263 So document.querySelector, 55 00:02:44,330 --> 00:02:46,977 and actually it's gotta be querySelectorAll, 56 00:02:46,977 --> 00:02:48,600 (mouse clicks) 57 00:02:48,600 --> 00:02:51,380 and then as we already saw in the previous video, 58 00:02:51,380 --> 00:02:54,533 they are called, nav__link, okay? 59 00:02:57,770 --> 00:03:00,470 So this will return a node list, 60 00:03:00,470 --> 00:03:02,470 and now we can use it for each method 61 00:03:02,470 --> 00:03:06,170 in order to attach an event handler to each of the elements 62 00:03:06,170 --> 00:03:08,160 that are in the node list. 63 00:03:08,160 --> 00:03:11,074 So actually just as we did up here, 64 00:03:11,074 --> 00:03:12,530 (mouse clicks) 65 00:03:12,530 --> 00:03:13,363 right? 66 00:03:14,480 --> 00:03:15,313 Okay. 67 00:03:16,170 --> 00:03:19,273 So for each, 68 00:03:20,820 --> 00:03:24,313 and so, our callback function here, 69 00:03:25,660 --> 00:03:29,493 which gets access to the current element in a node list. 70 00:03:30,450 --> 00:03:32,300 And so to each element, 71 00:03:32,300 --> 00:03:36,273 let's now use the add event listener method. 72 00:03:38,720 --> 00:03:42,460 So I click, and then another callback function. 73 00:03:42,460 --> 00:03:45,310 So now we have callback inside of callback, 74 00:03:45,310 --> 00:03:48,760 but that's not a problem at all, all right? 75 00:03:48,760 --> 00:03:51,940 So here we again want access to the event, 76 00:03:51,940 --> 00:03:56,670 and now let's just start by logging to console, link, 77 00:03:56,670 --> 00:03:57,673 just like this. 78 00:03:59,500 --> 00:04:03,160 So indeed we get link here, and on this one, 79 00:04:03,160 --> 00:04:05,780 and also on this one. 80 00:04:05,780 --> 00:04:08,010 So a three times link. 81 00:04:08,010 --> 00:04:10,450 Now you already start to see the problem, 82 00:04:10,450 --> 00:04:14,020 which is that by default clicking one of these links, 83 00:04:14,020 --> 00:04:16,810 will scroll to the position in the HTML. 84 00:04:16,810 --> 00:04:19,543 And that's because of these so-called anchors. 85 00:04:20,550 --> 00:04:22,950 Let me show it to you in the HTML. 86 00:04:22,950 --> 00:04:26,420 And so these here are called anchors. 87 00:04:26,420 --> 00:04:29,910 So hash, and then some name here, 88 00:04:29,910 --> 00:04:32,840 will automatically move to page two of the element, 89 00:04:32,840 --> 00:04:35,303 which has the ID of this. 90 00:04:36,380 --> 00:04:38,863 So let's see, down here we have, 91 00:04:41,240 --> 00:04:45,450 yeah, here we have this section with the ID section two. 92 00:04:45,450 --> 00:04:47,350 And so as we click here then, 93 00:04:47,350 --> 00:04:50,770 it will automatically move to exactly that section. 94 00:04:50,770 --> 00:04:55,520 And we can see it here also in the URL bar, right? 95 00:04:55,520 --> 00:05:00,370 So we basically need to prevent that from happening. 96 00:05:00,370 --> 00:05:02,670 Let me just put this back here, 97 00:05:02,670 --> 00:05:07,460 because in our last lecture we deleted this section one 98 00:05:07,460 --> 00:05:08,293 that was here. 99 00:05:11,130 --> 00:05:12,590 And so, as I was saying, 100 00:05:12,590 --> 00:05:17,590 we need to prevent these default behavior. 101 00:05:17,780 --> 00:05:18,853 And so for that, 102 00:05:20,100 --> 00:05:25,090 we use once more event or E in this case, 103 00:05:25,090 --> 00:05:26,743 dot preventDefault. 104 00:05:28,220 --> 00:05:29,523 And so let's see now, 105 00:05:30,990 --> 00:05:33,440 and indeed now nothing happens. 106 00:05:33,440 --> 00:05:36,060 So we no longer scroll to the page, 107 00:05:36,060 --> 00:05:38,410 and you see that the URL bar 108 00:05:38,410 --> 00:05:42,650 is actually also no longer changing as we click here. 109 00:05:42,650 --> 00:05:44,530 So that problem is fixed, 110 00:05:44,530 --> 00:05:47,373 and so now let's implement the smooth navigation, 111 00:05:48,670 --> 00:05:51,680 or the smooth scrolling, actually. 112 00:05:51,680 --> 00:05:54,640 Because if we didn't want the scrolling to be smooth, 113 00:05:54,640 --> 00:05:57,230 then we actually wouldn't need any of this, 114 00:05:57,230 --> 00:05:59,100 because we already saw that the browser 115 00:05:59,100 --> 00:06:02,380 will actually automatically move to that place. 116 00:06:02,380 --> 00:06:05,820 So to that anchor that we defined in HTML. 117 00:06:05,820 --> 00:06:08,700 Now, that anchor, however, 118 00:06:08,700 --> 00:06:12,890 so basically this part here is still gonna be very useful 119 00:06:12,890 --> 00:06:16,570 because we can now take this href attribute. 120 00:06:16,570 --> 00:06:19,580 So basically we can take this value here, 121 00:06:19,580 --> 00:06:22,690 and select the element that we want to scroll to, 122 00:06:22,690 --> 00:06:24,370 based on this. 123 00:06:24,370 --> 00:06:26,290 Because if we think about this, 124 00:06:26,290 --> 00:06:29,350 this actually looks pretty much like a selector 125 00:06:29,350 --> 00:06:31,173 for an ID, right? 126 00:06:32,350 --> 00:06:34,100 So let me write the code here, 127 00:06:34,100 --> 00:06:36,200 and then I will explain a little bit more. 128 00:06:37,240 --> 00:06:42,240 So let's get that href actually, and I'm gonna call it ID. 129 00:06:44,620 --> 00:06:49,620 So that is at This, which is the current element remember, 130 00:06:49,840 --> 00:06:53,643 dot getAttribute, and then the href. 131 00:06:58,040 --> 00:06:58,950 Okay? 132 00:06:58,950 --> 00:07:02,050 And I used the getAttribute function here 133 00:07:02,050 --> 00:07:04,150 because as we learned before, 134 00:07:04,150 --> 00:07:08,700 I actually only want that part that we literally write here. 135 00:07:08,700 --> 00:07:11,900 So I don't want the absolute URL, 136 00:07:11,900 --> 00:07:16,900 and so that's why I cannot write simply this.href. 137 00:07:20,140 --> 00:07:20,973 Remember that. 138 00:07:22,540 --> 00:07:24,590 Anyway, let's now log this to the console 139 00:07:26,460 --> 00:07:28,423 to see again what we're doing here. 140 00:07:29,470 --> 00:07:32,560 And so, you see we get now a section one here, 141 00:07:32,560 --> 00:07:34,890 two, and three. 142 00:07:34,890 --> 00:07:37,370 And now, as I was saying before, 143 00:07:37,370 --> 00:07:41,880 this here looks pretty much like a selector already. 144 00:07:41,880 --> 00:07:45,220 And so we can now take this, and select an element, 145 00:07:45,220 --> 00:07:49,420 based on this, and then simply scroll to that element. 146 00:07:49,420 --> 00:07:50,253 So for that, 147 00:07:50,253 --> 00:07:54,840 we're gonna use the scrollIntoView method here again. 148 00:07:54,840 --> 00:07:56,203 So let me show that to you. 149 00:07:57,710 --> 00:08:00,853 So document.querySelector, 150 00:08:02,020 --> 00:08:05,837 and now all I need to pass in, is this ID, right? 151 00:08:07,540 --> 00:08:09,830 Because again, this exact string 152 00:08:09,830 --> 00:08:12,400 that we get from the href attribute, 153 00:08:12,400 --> 00:08:14,490 is already the perfect selector. 154 00:08:14,490 --> 00:08:16,053 So we can just use that. 155 00:08:17,140 --> 00:08:18,210 Okay? 156 00:08:18,210 --> 00:08:20,330 And so this is a pretty common technique 157 00:08:20,330 --> 00:08:24,130 that we use for implementing a navigation like this. 158 00:08:24,130 --> 00:08:27,810 So we put the ID of the elements that we want to scroll to 159 00:08:27,810 --> 00:08:29,910 here in the href attribute, 160 00:08:29,910 --> 00:08:31,680 so that then in the JavaScript, 161 00:08:31,680 --> 00:08:33,570 we can read that, 162 00:08:33,570 --> 00:08:37,430 so we can read that href, and then we can select the element 163 00:08:37,430 --> 00:08:39,260 that we want to scroll to. 164 00:08:39,260 --> 00:08:43,480 So in this case, is the element with the ID, section one. 165 00:08:43,480 --> 00:08:46,191 And that is exactly this one here. 166 00:08:46,191 --> 00:08:47,350 (mouse clicks) 167 00:08:47,350 --> 00:08:49,333 So exactly the first section. 168 00:08:51,590 --> 00:08:52,423 All right? 169 00:08:53,570 --> 00:08:56,220 So here, we have the element now selected, 170 00:08:56,220 --> 00:08:59,447 and now all we need is to call, scrollIntoView, 171 00:09:01,101 --> 00:09:03,800 and then with behavior set to smooth. 172 00:09:03,800 --> 00:09:08,660 Just like we did already here before, okay? 173 00:09:08,660 --> 00:09:10,643 And that's actually already it. 174 00:09:13,460 --> 00:09:16,083 So, that worked beautifully, right? 175 00:09:20,070 --> 00:09:23,893 All right, and now the third one, and here we go. 176 00:09:27,050 --> 00:09:28,750 Well, that didn't really scroll 177 00:09:28,750 --> 00:09:30,783 to where I thought it should go. 178 00:09:32,140 --> 00:09:33,163 Now, but now it did. 179 00:09:34,331 --> 00:09:37,890 Apparently something weird happened there, 180 00:09:37,890 --> 00:09:39,253 but that's not a problem. 181 00:09:40,110 --> 00:09:43,760 Now, as you see, this actually works just fine, 182 00:09:43,760 --> 00:09:47,380 but the problem is that it's not really efficient. 183 00:09:47,380 --> 00:09:52,283 So we are adding here the exact same callback function, 184 00:09:53,670 --> 00:09:56,060 so this event handler here, 185 00:09:56,060 --> 00:10:00,220 we are adding it once to each of these three elements. 186 00:10:00,220 --> 00:10:03,140 So the exact same function is now attached 187 00:10:03,140 --> 00:10:04,980 to these three elements. 188 00:10:04,980 --> 00:10:07,600 And that's kind of unnecessary. 189 00:10:07,600 --> 00:10:11,470 I mean, of course it would be fine for only three elements, 190 00:10:11,470 --> 00:10:16,380 but what if we had 1000, or like 10,000 elements? 191 00:10:16,380 --> 00:10:18,320 If we were to attach an event handler 192 00:10:18,320 --> 00:10:21,130 to 10,000 elements like this, 193 00:10:21,130 --> 00:10:24,150 so like we did here with the forEach function, 194 00:10:24,150 --> 00:10:27,660 then we would effectively be creating 10,000 copies 195 00:10:27,660 --> 00:10:30,090 of this same function here. 196 00:10:30,090 --> 00:10:33,620 And so that would then certainly impact the performance. 197 00:10:33,620 --> 00:10:37,360 And it's really just not a clean solution in that case. 198 00:10:37,360 --> 00:10:40,200 And so, the better solution without a doubt, 199 00:10:40,200 --> 00:10:42,580 is to use events delegation. 200 00:10:42,580 --> 00:10:44,090 So in event delegation, 201 00:10:44,090 --> 00:10:47,040 we use the fact that events bubble up. 202 00:10:47,040 --> 00:10:49,490 And we do that by putting the eventListener 203 00:10:49,490 --> 00:10:52,210 on a common parent of all the elements 204 00:10:52,210 --> 00:10:54,210 that we are interested in. 205 00:10:54,210 --> 00:10:55,810 And so in our example, 206 00:10:55,810 --> 00:11:00,810 it's this container that's around all of these links, 207 00:11:01,050 --> 00:11:03,490 and that we saw in the previous video. 208 00:11:03,490 --> 00:11:07,970 So remember, that is this element here. 209 00:11:07,970 --> 00:11:11,450 So we will put our event handler on this element here, 210 00:11:11,450 --> 00:11:14,730 and then when a user clicks one of the links, 211 00:11:14,730 --> 00:11:17,860 the event is generated, and bubbles up, 212 00:11:17,860 --> 00:11:20,460 just as we saw in the last video. 213 00:11:20,460 --> 00:11:23,490 And then we can basically catch that event 214 00:11:23,490 --> 00:11:26,820 in this common parent element, and handle it there. 215 00:11:26,820 --> 00:11:30,770 Because we also know where the event actually originated. 216 00:11:30,770 --> 00:11:31,830 Right? 217 00:11:31,830 --> 00:11:33,220 So we can figure that out 218 00:11:33,220 --> 00:11:35,803 by looking at the events.target property. 219 00:11:38,010 --> 00:11:40,920 So that's what event delegation is, 220 00:11:40,920 --> 00:11:43,783 and so let's now go ahead and implement it. 221 00:11:46,240 --> 00:11:49,280 All right, so in event delegation, 222 00:11:49,280 --> 00:11:51,870 we basically need two steps. 223 00:11:51,870 --> 00:11:55,560 First, we add the event listener to a common parent element 224 00:11:55,560 --> 00:11:58,350 of all the elements that we're interested in. 225 00:11:58,350 --> 00:12:00,110 So let me actually write it here, 226 00:12:00,110 --> 00:12:02,823 because this is a really important technique. 227 00:12:04,410 --> 00:12:05,660 (keyboard clicks) 228 00:12:05,660 --> 00:12:10,660 So as I said, add event listener to common parent element. 229 00:12:13,620 --> 00:12:15,383 And then in that event listener, 230 00:12:17,090 --> 00:12:20,533 determine what element originated the event. 231 00:12:24,490 --> 00:12:27,930 So that we can then work with that element 232 00:12:27,930 --> 00:12:29,893 where the event was actually created. 233 00:12:31,700 --> 00:12:33,393 So, let's do that. 234 00:12:34,830 --> 00:12:36,503 Document.querySelector, 235 00:12:39,570 --> 00:12:43,890 and so remember the common element of all these links, 236 00:12:43,890 --> 00:12:44,723 is nav__links. 237 00:12:46,400 --> 00:12:47,853 So again, it's this, 238 00:12:49,550 --> 00:12:50,863 yeah, it's this element. 239 00:12:52,030 --> 00:12:54,599 And so this is where we add the event listener, 240 00:12:54,599 --> 00:12:57,432 (keyboard clicks) 241 00:13:02,930 --> 00:13:04,700 and now we just need to figure out 242 00:13:04,700 --> 00:13:07,250 where the event actually happened. 243 00:13:07,250 --> 00:13:12,250 And remember that, that is stored in event.target, right? 244 00:13:14,080 --> 00:13:17,350 So event.target becomes really, really useful now 245 00:13:17,350 --> 00:13:18,700 in this strategy, 246 00:13:18,700 --> 00:13:21,240 because we can now use this information 247 00:13:21,240 --> 00:13:25,793 exactly to basically see where that event happened. 248 00:13:27,410 --> 00:13:30,123 So as I click here, we can now see, 249 00:13:32,330 --> 00:13:36,170 well, that the event occurred from this element. 250 00:13:36,170 --> 00:13:40,090 And as we click here, then we see it originated of course, 251 00:13:40,090 --> 00:13:41,910 from this one. 252 00:13:41,910 --> 00:13:42,810 Okay? 253 00:13:42,810 --> 00:13:45,600 And as we click somewhere here in the middle, 254 00:13:45,600 --> 00:13:48,030 then we see that the click of course happened 255 00:13:48,030 --> 00:13:51,900 in this entire element, not in one of the links. 256 00:13:51,900 --> 00:13:54,440 And this part is actually important to notice 257 00:13:54,440 --> 00:13:57,080 because now we actually only want to work 258 00:13:57,080 --> 00:14:00,470 with the clicks that happened on one of the links. 259 00:14:00,470 --> 00:14:02,860 So only this one, or this one, 260 00:14:02,860 --> 00:14:06,740 but the click that happens here on this nav__links element, 261 00:14:06,740 --> 00:14:08,500 is not relevant at all. 262 00:14:08,500 --> 00:14:11,820 And so now we need a matching strategy here 263 00:14:11,820 --> 00:14:13,910 in order to match only the elements 264 00:14:13,910 --> 00:14:17,370 that we are actually interested in now, right? 265 00:14:17,370 --> 00:14:19,410 And in this case, the best way to do that, 266 00:14:19,410 --> 00:14:24,003 is to simply check if the target has this nav__link class. 267 00:14:25,570 --> 00:14:26,403 Now, right? 268 00:14:28,830 --> 00:14:32,330 So this is the matching strategy. 269 00:14:32,330 --> 00:14:35,470 And this can sometimes be one of the hardest things 270 00:14:35,470 --> 00:14:37,849 to come up, when you use this technique. 271 00:14:37,849 --> 00:14:38,682 (keyboard clicks) 272 00:14:38,682 --> 00:14:41,900 But many times, I actually do it like this. 273 00:14:41,900 --> 00:14:46,550 So I check if the target element contains the class 274 00:14:46,550 --> 00:14:47,850 that we are interested in. 275 00:14:48,950 --> 00:14:50,610 So classList, 276 00:14:50,610 --> 00:14:53,333 and then remember we can use the contains method, 277 00:14:55,180 --> 00:14:56,980 and then we can simply check 278 00:14:56,980 --> 00:14:59,957 if it contains the class nav__link. 279 00:15:01,480 --> 00:15:05,560 And so that's then this one here, right? 280 00:15:05,560 --> 00:15:10,193 And only if it does, then let's log link. 281 00:15:11,510 --> 00:15:12,343 So let's see. 282 00:15:13,580 --> 00:15:16,813 So as we click, we get link, and you see, 283 00:15:17,800 --> 00:15:21,130 or another one, and we also get link. 284 00:15:21,130 --> 00:15:23,020 But then as we click somewhere else, 285 00:15:23,020 --> 00:15:26,353 like here in the middle, then we do not get link. 286 00:15:27,230 --> 00:15:28,290 Now, right? 287 00:15:28,290 --> 00:15:30,260 And so now we successfully 288 00:15:30,260 --> 00:15:34,240 basically only selected the link elements itself. 289 00:15:34,240 --> 00:15:37,130 And so now we can basically do exactly 290 00:15:37,130 --> 00:15:38,513 what we did here before. 291 00:15:39,530 --> 00:15:42,683 So we actually also need to prevent the default, 292 00:15:44,300 --> 00:15:46,023 and so let's get all of this, 293 00:15:50,720 --> 00:15:52,280 and replace that here. 294 00:15:52,280 --> 00:15:57,260 Get rid of the comments, and this one here, 295 00:15:57,260 --> 00:15:59,110 so preventing the default, 296 00:15:59,110 --> 00:16:01,600 we actually always want to want that, 297 00:16:02,450 --> 00:16:03,573 or to do that. 298 00:16:04,410 --> 00:16:06,680 So no matter where we are clicking, 299 00:16:06,680 --> 00:16:09,883 nothing should happen now, right? 300 00:16:10,850 --> 00:16:12,703 So, let's try that. 301 00:16:13,970 --> 00:16:16,120 Now, and here we get this error, 302 00:16:16,120 --> 00:16:19,290 and we had null, on line 87. 303 00:16:19,290 --> 00:16:21,010 So that's this now. 304 00:16:21,010 --> 00:16:24,150 And of course, we still have a problem here 305 00:16:24,150 --> 00:16:28,000 because the href attribute is now not on this, 306 00:16:28,000 --> 00:16:31,200 but it is on the element that was clicked. 307 00:16:31,200 --> 00:16:34,963 And so that is again e.target. 308 00:16:35,950 --> 00:16:39,480 So that's the whole reason why we're using e.target 309 00:16:39,480 --> 00:16:40,623 in the first place. 310 00:16:41,500 --> 00:16:44,590 So let's try now, and beautiful. 311 00:16:44,590 --> 00:16:46,223 Now it actually works. 312 00:16:47,440 --> 00:16:50,230 So you see, we still get the same sections here 313 00:16:50,230 --> 00:16:52,070 also locked to the console, 314 00:16:52,070 --> 00:16:55,453 and it scrolls to exactly where we want it to go. 315 00:16:56,526 --> 00:16:57,670 (mouse clicks) 316 00:16:57,670 --> 00:16:58,503 Awesome. 317 00:16:59,440 --> 00:17:01,670 So this works beautifully, 318 00:17:01,670 --> 00:17:06,170 and yeah, we successfully implemented event delegation, 319 00:17:06,170 --> 00:17:09,700 which is a lot better, and a lot more efficient 320 00:17:09,700 --> 00:17:12,290 than simply attaching the same event handler 321 00:17:12,290 --> 00:17:14,020 to multiple elements. 322 00:17:14,020 --> 00:17:17,560 Instead, we simply edit one big event handler function 323 00:17:17,560 --> 00:17:20,060 to the parent element of all the elements 324 00:17:20,060 --> 00:17:21,630 that we're interested in, 325 00:17:21,630 --> 00:17:23,030 and then we simply determined 326 00:17:23,030 --> 00:17:25,363 where the click event came from. 327 00:17:27,770 --> 00:17:30,900 And then we also needed this matching strategy 328 00:17:30,900 --> 00:17:33,820 because we wanted to basically ignore clicks 329 00:17:33,820 --> 00:17:38,193 that did not happen right on one of these links. 330 00:17:39,130 --> 00:17:41,870 And coming up with this matching strategy, 331 00:17:41,870 --> 00:17:43,550 as I like to call it, 332 00:17:43,550 --> 00:17:45,280 is probably the hardest part 333 00:17:45,280 --> 00:17:47,470 of implementing event delegation. 334 00:17:47,470 --> 00:17:51,180 But don't worry because there will be plenty of examples 335 00:17:51,180 --> 00:17:53,090 throughout the rest of the course. 336 00:17:53,090 --> 00:17:54,830 And so, at some point, 337 00:17:54,830 --> 00:17:57,440 it will all make a lot of sense to you. 338 00:17:57,440 --> 00:18:00,480 So I hope that you're convinced that event delegation 339 00:18:00,480 --> 00:18:02,410 is a much better strategy, 340 00:18:02,410 --> 00:18:05,720 even though it requires a little bit more work 341 00:18:05,720 --> 00:18:08,520 than the first implementation that we did. 342 00:18:08,520 --> 00:18:09,353 And in fact, 343 00:18:09,353 --> 00:18:12,310 there is actually an even more important use case 344 00:18:12,310 --> 00:18:13,910 of event delegation, 345 00:18:13,910 --> 00:18:16,640 which is when we are working with elements 346 00:18:16,640 --> 00:18:20,380 that are not yet on the page on runtime. 347 00:18:20,380 --> 00:18:22,700 So by the time the page loads. 348 00:18:22,700 --> 00:18:24,550 And a great example are buttons 349 00:18:24,550 --> 00:18:28,370 that are added dynamically while using the application. 350 00:18:28,370 --> 00:18:31,080 So it's not possible to add event handlers 351 00:18:31,080 --> 00:18:34,110 on two elements that do not exist, 352 00:18:34,110 --> 00:18:36,760 but we will still be able to handle events 353 00:18:36,760 --> 00:18:40,070 on elements that don't exist at the beginning 354 00:18:40,070 --> 00:18:43,500 by using event delegation one more time. 355 00:18:43,500 --> 00:18:46,333 And we will actually do this later in this section. 25505

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