welcome to the complete JavaScript
course in this course we're going to learn how to build complex websites
using JavaScript from a beginner to a professional level and by the end of
this course we're going to build amazon.com so this is an interactive
multi-page website where we can add products to our cart create an order and
even track our order along the way we're also going to
build some smaller projects like a rock paper scissors game a to-do list and a
calculator now you don't need any previous coding or technical experience
to follow along this course will cover everything that you need to learn
JavaScript we're going to start from the very basics of JavaScript and we're
going to build our way up step by step we're going to learn the major features
of JavaScript and also how to use JavaScript together with other
Technologies like HTML and CSS we're also going to learn more
advanced features like objectoriented programming backend callbacks promises
and async await and we'll use these features together to build a complex
project which is the Amazon Project this will let you practice what
you learn and deepen your understanding you can find the different
lessons of this course course below the video
here and here if you need to you can adjust the
speed of the video here and after each lesson I'm going to
give you a bunch of exercises that you can do on your own to practice the
skills that we learned in total this course will have over
250 exercises so with that said let's get started
before we begin if something in this course is not working properly make sure
to check the first comment below the video for a list of
solutions I'm going to be doing this course on Windows but the steps are the
same if you're using a Mac we're going to start from the very basics of
JavaScript and build our way up step by step first of all what is Javascript
JavaScript is a technology that we use to create websites a website is like
youtube.com or amazon.com it's how we access YouTube
and Amazon on our computer if we were using a phone we usually use an app but
on our computer we use a website so there's actually three
technologies that we use to create websites HTML CSS and JavaScript each of
these Technologies has a specific purpose when creating a website HTML
creates the content of a website it creates all the buttons the text and the
images CSS changes the appearance of the website by adding CSS we can make our
website look nice and finally JavaScript makes our website
interactive so if we only have HTML and CSS and we click one of these buttons
our website doesn't do anything but once we add JavaScript we can make our
website do something when we click a button such as add a product to our cart
or create an order so this course is focused on
JavaScript if you want to learn HTML and CSS in more detail I have a full whole
course just like this one that you can find in the video
description let's get started with JavaScript the first thing we need to do
is to install a piece of software called a web browser a web browser lets us view
websites that we create in this course the most popular web browser for web
development is Google Chrome so I recommend using that if you don't have
Google Chrome you can open the default web browser on your computer for windows
it's Microsoft Edge and for Mac it's Safari type in google.com at the top and
press enter search for Google Chrome click the result and follow the
instructions to download and install once we've installed Chrome we're ready
to begin we're going to start by learning
what exactly is Javascript and how does it work the easiest way to understand
JavaScript is we're basically giving instructions to a computer and then the
computer follows our instructions I find the best way to
learn this is to jump in and give it a try so first let's open Google
Chrome next we're going to click at the top
here and type super
simple dodev slj
s- Basics and press enter and now we'll learn how to give
our computer some instructions to follow to do that we're going to go to a blank
area of the web page we're going to rightclick click
inspect and then click the console tab now if your console doesn't show up
at the bottom like this you can click these three dots here here and then
select this icon okay so inside the console we can
give some instructions for our computer let's learn our first instruction we're
going to type here and we're going to type
alert Open Bracket single quote hello single quote close bracket and
semicolon make sure to type this out exactly as I have it here in JavaScript
if you don't type things out correctly it won't work so this is an instruction
to create a popup with the text hello inside to get the computer to follow our
instruction we can just press enter and as you can see the computer
does exactly what we tell it to do it creates a popup with a text hello
inside now let's press okay and let's give another instruction
to the computer so we're going to type here again and we're going to type alert
again Open Bracket single quote but this time we're going to type a different
message in the popup good job and single quote close
bracket and semicolon so this is an instruction to
create a popup again but this time with a text good job in inside the popup if
we press enter the computer does exactly what we
tell it to do and it creates a popup with the text good job inside and that's
basically the main idea behind JavaScript we're giving instructions to
a computer and then the computer follows our
instructions so note that we can open and use this console on any website
we're just using superimple dodev as an example
let's press okay and we're going to learn some
terminology or naming the instructions we give to our
computer these instructions are called code when we press enter and the
computer follows our instructions this is called running the code now there are
many different languages we can use to write code called programming languages
it's similar to how we have many human Lang languages that we can use to
communicate some examples of programming languages are JavaScript Python and Java
so here we're writing our code using the JavaScript programming language so we
call this JavaScript code now that we understand the basic
terminology let's look at some more examples of what we can do with
JavaScript code another thing we can do is
math let's go back to the console and type here and we're going to type 2 + 2
so this is an instruction or code that tells the computer to do some math to
calculate 2 + 2 when we press enter the computer follows our
instruction or runs this code calculates 2+ 2 and gives us the result which is
four let's do another example we're going to type 10 minus 3 and press enter
to run this code again the computer does this math calculates the result and
gives us seven so as you can see JavaScript can do many different things
like create popups and do math let's look at one more example of what
JavaScript can do we're going to go to the bottom and type out this code
document.body do inner Capital HTML equals single quilt hello single
quilt and semicolon make sure to write this out
exactly as I have it here with the dots and the capital letters because
JavaScript is case sensitive let's press enter to run this
code what this code does is that it removes everything on the page and
replaces it with the text hello in this example we use JavaScript to modify the
web page modifying the web page is one of the most important features of
JavaScript and we're going to be using this feature throughout this course and
that's the basics of JavaScript we're giving instructions to a computer these
instructions are called code and then the computer follows our instru
instuctions this is called running the code and also don't worry about
memorizing all this code you can find a copy of all the code that we write in
this course in the video description now that we understand the
basics of JavaScript let's learn more about the JavaScript language
itself if we take a look at this code alert and hello you might be wondering
ing what the brackets and the quote mean all of these characters have a special
meaning in the language this is something called
syntax syntax are the rules that we have to follow when using a programming
language like JavaScript this is sort of like in English we also have rules that
we follow called grammar the difference is that in English we don't have to
follow the rules of grammar perfectly people can still understand us but in
programming we have to follow the rules of syntax exactly otherwise the computer
won't understand our code for example if we scroll down and we type this code
alert Open Bracket quote hello quote close bracket and semicolon but this
time we remove the first bracket and press
enter it will give us a syntax error we're not following the rules of syntax
so the computer doesn't understand this code now JavaScript has a lot of syntax
rules and we can't learn them all at once right now instead we're going to
learn the syntax rules one by one as we go through the course for now we'll just
learn enough syntax to do the exercises at the end of this lesson what we need
to know is that if we scroll up this part of the code tells a computer
to create a popup the text between these quotes is the text inside the popup if
we change this text we can change the text inside the popup same thing for
this code down here if we change the text between the
quotes it will change the text that appears on the page and that's all we
need to know about JavaScript Syntax for now we'll learn exact ly what the other
characters like the brackets quotes and semicolon mean later on in this course
so in this lesson we learned that JavaScript is basically giving
instructions to a computer we wrote our first few lines of JavaScript code we
learned how to run our code using the console in our web browser and we
learned about syntax which are the rules that we have to follow when writing our
code thanks for watching this course so far
if you want to support this channel you can check out the premium version of my
courses just like this one where you can get a certificate of completion and a
Better Learning platform if you're interested in extra videos from me more
in-depth videos and behind the scenes content you can check out these links
here you can also support the channel by liking the video subscribing and sharing
this video with others thanks again and let's continue with the
course here are some exercises you can try on your own to practice what we
learned in this lesson you can find the solutions to
these exercises in the video description now that we understand the
basics of JavaScript we're going to learn about each feature of the language
language in this lesson we're going to focus on numbers and math first we can
close the console for now so I've actually prepared a project
that we can use for this lesson to open this project we're going to go to our
browser click up here and type super simple
dodev SL projects SL Amazon
and press enter so this is actually the final
project we're going to create in this course this is an e-commerce website
similar to Amazon where we can add products to our cart and then view our
cart by clicking the top right and on this page we can see the
products in our cart modify our cart and create an
order for this lesson we're going to focus on this right section which
calculates the cost of our cart including the cost of the products
shipping and taxes this section is a great way to
learn numbers and math in JavaScript first let's open the console
again so we can write JavaScript code we're going to find a blank area of the
web page rightclick click inspect and then click the
console so we already saw some examples of math in the previous lesson for
example we wrote the code 2 + 2 if we press
enter the computer adds these two numbers and results in
four we also did 10 minus 3 if we press enter the computer subtracts these two
numbers and gives us seven in addition to adding and
subtracting we can also multiply and divide to multiply we're going to type
10 star 3 and press enter so star is the character for
multiplying to divide we're going to type
10 slash2 and press enter
so forward slash is the character for dividing now let's learn the syntax
rules for numbers and math the Syntax for math is pretty straightforward in
JavaScript we just write it out like normal math we can also do math with
more than two numbers for example we can add two plus 2 and then plus another two
if if we press enter the computer will add these three numbers together and
result in six and finally JavaScript can handle decimal numbers like
2.2 plus 2.2 if we press enter it will calculate
these decimal numbers and result in 4.4 now let's do some practical examples
we're going to calculate the number numers here in our final project but
first let's set up our cart so we have the same products in our cart so make
sure in your cart you have two socks with free shipping and you have one
basketball with $4.99 of shipping and nothing else in
your cart if you need to you can modify your cart by clicking update or delete
or or by going to the homepage by clicking in the top left and adding any
products that you're missing once you have the same products
as me in your cart and you have the same numbers on the right we're ready to
begin let's start by calculating this number up here this is the cost of the
products before shipping and taxes to calculate this number using JavaScript
we're just going to add the cost of the products so in our console we're going
to add the cost of the socks which is $10 and
90 we have two of them so we're going to multiply this by
two and then we're going to add the cost of the basketball so plus
$20.95 if we press enter the computer will do this math
calculation and give us this number and if we scroll
to the top of our project you'll see that the number that
we got matches what we have on the page so that's how we use JavaScript to
calculate this number here let's do another example we're going to calculate
this third number which is the cost of the products plus shipping feel free to
pause the video if you want to try it yourself first otherwise we'll do it
together let's go back to our console and we're going to add the cost
of the products again which is $10.90 * 2 plus
$20.95 but this time we're going to add the cost of shipping which is
$4.99 so 4.99 and press and
enter the computer will do this calculation and give us this number
which matches what we see in the final project next we're going to learn a very
important feature of math called the order of
operations adding subtracting multiplying and dividing these are
called operations and the characters in the middle are called
operators now there's a certain order that we do these operations for example
if we go back to our console and type the calculation 1 + 1 * 3 and press
enter notice that it multiplies 1 * 3 first which equals 3 and then adds 1
which equals 4 notice that it does not add 1 + 1
first which equal 2 and then 2 * 3 =
6 the way math normally works is that multiply and divide are done first add
and subtract are done after this is called the order of operations and
JavaScript follows the same rules multiply and divide are done first add
and subtract are done after the order of operations is also called operator
precedence in JavaScript one thing to note is that
multiply and divide have the same priority so if we have both in a
calculation it will calculate from left to right add and subtract also have the
same priority if we have both in the calculation it will also calculate from
left to right another feature of the order of operations is that we can use
brackets to control which part of the calculation gets done first for example
let's type out this calculation again 1 + 1 * 3 but this time we're going to add
an Open Bracket and a Clos bracket around 1 + 1
if we press enter now the calculation inside the
brackets will be done first so it will add 1 + 1 = 2 and then 2 * 3 = 6 so when
we use brackets JavaScript will always do the calculation inside the brackets
first and then do the rest of the calculation brackets have the highest
priority in the order of operations now let's learn the syntax
rules for brackets so we just have to have a matching Open
Bracket and close bracket so something like this doesn't work because we have
two Open brackets and no Clos bracket we also need to have a complete calculation
in the brackets so this also doesn't work because 1 + 1 multiply is not a
complete calculation now let's do some practical
examples using the order of operations first we're going to do some
more setup in the final project so we're actually going to remove all the
products in our cart and then once our cart is empty
we'll go to the homepage by clicking the top
left and this time we're going to add some new products so we'll add one
basketball and two T-shirts now let's go back to our cart by
clicking the top right we'll scroll down and we're going
to calculate the numbers in this section again let's calculate this number at the
top which is the cost of the products we'll go back to our
console and add the cost of the basketball which is
$20.95 Plus the cost of the t-shirts which is
$799 and we have two of them so we'll multiply this by two if we press
enter this will give us the number that we see in the final project here notice
that in this calculation we're taking advantage of the order of
operations even though multiply is written last
we still multiply these two numbers first so we calculate the cost of two
T-shirts first and then we add the cost of the basketball
after okay now let's try something a little more difficult we're going to
learn how to calculate this 10% tax here so how do we calculate 10% of something
unfortunately we can't just multiply by 10% in JavaScript instead
we have to calculate the percent manually so how do we do that 1% is
actually equal to 1 / 100 that's what percent means so 10% is equal to 10 /
100 which equals 0.1 so to calculate 10% manually we just
multiply this number by 0.1 so we'll type 30 3
6.93 multiplied by 10% or 0.1 if we press
enter it will give us a number that is close to what we have in the final
project it's the same amount of money but our number is more accurate than we
need so later in this lesson we'll learn how to round this number down to exactly
what we have on the web page for now let's do some more practice with the
order of operations let's calculate the tax again
except instead of using the final number 36.9 3 Let's calculate this number
individually like here so at the bottom we're going to add the cost of the
basketball 20.95% 2 and then multiply this by the
tax percent time 0.1 and press
enter unfortunately this number doesn't match what we got up here and that's
because if we look at this calculation according to the order of operations
multiply is done first so it will multiply these three numbers first and
then add 20.95% after however this is not what we want
we actually want to calculate this number first this is the cost of the
products so how do we get the computer to calculate this first and then
multiply by the tax percent 0.1 to do this we can use brackets to
control which part of the calculation gets done first so let's create this
calculation again 20 .95 +
7.99 * 2 but this time we're going to add brackets around this part of the
calculation to make sure that this gets calculated first and then at the end
we'll multiply it by the tax percent 0.1 and now if we press
enter we will get the same number that we had before
so that's how we use math and the Order of Operations to calculate the numbers
in this section of the final project so don't worry you don't have to be good at
math to learn JavaScript this is just to show you how math Works in
JavaScript in the rest of this lesson we're going to learn some more details
about numbers and math the first detail we're going to learn is a weird behavior
of math in JavaScript first we'll need to learn some
terminology in programming whole numbers like 2 3 and 4 are called integers
decimal numbers like 2.2 and 2.5 are called floating Point
numbers or floats and unfortunately computers have a problem working with
floats for example if we go back to our console and type the calculation
0.1 plus 0.2 and press
enter it will give us this weird number here that's close to 0.3 but a little
bit inaccurate so this problem is not
specific to JavaScript many programming languages also have this problem the
reason this happens is because of how computers store numbers I'll give a
simplified explan computers can only store zeros and ones
while humans can count from 0 to 9 so there's sort of a mismatch between our
number systems for integers this is not a problem the computer can just use a
bunch of zeros and ones to store it however for decimal numbers or floats
sometimes the computer can't store the number properly for example here's how
the computer computer tries to store 0.2 using only zeros and ones at the top
is what the computer stores at the bottom is what this is equal to in human
numbers we can see that the computer gets closer and closer to 0.2 but never
actually reaches it and this is why we get these inaccuracies when calculating
with floats because computers can't store some floats properly note that
this doesn't happen with all floats for example computers can store
0.25 without any problems so these inaccuracies only happen with some
floats but not all of them however when calculating money we definitely want to
avoid any inaccuracies so let's learn how to do that first we're going to set
up our cart again so make sure in your cart you have one basketball with free
shipping and this time you have one t-shirt so we're going to click
update change this to one and click save and this t-shirt also has free
shipping now let's scroll up and we're going to calculate this number at the
top again which is the cost of the products let's go into our
console and we're going to add the cost of the basketball
$20.95 plus the cost of the t-shirt which is
$7.99 if we press enter calculating with these floats
causes the inaccuracies that we saw earlier so how do we avoid this problem
the best practice when calculating money is to calculate in cents instead of
dollars so instead of $20.95 we're going to calculate
2,95 plus $7.99 notice we're not using floats
anymore so we avoid the inaccuracies but now this number is in
cents so we need to convert back to Dollars to do that we'll surround this
calculation with brackets to make sure we calculate this first and then at the
end we'll divide by 100 to convert back to dollars because there are 100 cents
in each dollar if we press enter and scroll
up that's how we get the exact number that we see on the page so remember in
programming calculations with floats are sometimes inaccurate and when working
with money the best practice is to do the calculation in cents and then
convert back to dollars at the end the next detail we're going to learn
is how to round a number in JavaScript rounding just means taking a number and
moving it to the nearest integer to round a number we can use this
code capital m math. round Open Bracket close bracket
so make sure you use a capital M because JavaScript is case
sensitive now between the brackets we can put a number that we want to round
like 2.2 if we press enter it will round this
number down to two if we do capital M math do round
Open Bracket close bracket and between the brackets we put
2.8 and press enter it will round 2.8 up to three now
let's do a practical example with math.round we're going to calculate the
tax again but this time we're going to round the result to exactly this number
on the page so first let's calculate the tax we'll go into our
console and add the cost of the product products in cents so
2,95 for the basketball and plus the cost of the
t-shirt which is $7.99 and we'll surround this in
Brackets to make sure we calculate this first and then we're going to multiply
this by the tax percent or 0.1 and finally we'll convert this back
to dollars so let's surround this in Brackets as well to make sure we
calculate this first and at the end we'll divide by 100 to convert back to
dollars so notice here we can have brackets inside brackets in this
situation JavaScript will calculate the inner brackets first and then the outer
brackets and then everything else if we press enter
here this gives us 2.89 which is close to the number on the
page it's the same amount of money but our number is more accurate than we need
so now let's learn how to use math.round to round this number to exactly
2.89 first let's create a copy of this calculation so we'll select it right
click copy and down here right click and
paste by the way if you paste in the console you might see this warning
message to fix this you can type allow pasting and press enter and now you can
paste so let's continue and we were trying to round 2.89 4 to exactly
2.89 so one thing we might try to do is to round this entire
calculation however this will round 2.89 4 to 3 because it rounds to the nearest
integer instead what we want to round is this number here so remember that this
number is the result in cents which is 289.50
if we round this number it will round down to
289 which is exactly $289 so to round this calculation at the
front we'll type capital M math.round so we already have brackets
around this so we don't need extra brackets so this this will round to
289 and finally we'll convert this back to dollars at the End by dividing by 100
if we press enter that's how we rounded this
calculation to get the exact number on the
page so to summarize we first calculate the result in cents and then we round
this to the nearest scent and then at the end and we convert back to
Dollars again don't worry you don't have to be good at math to learn JavaScript
these examples are just for learning almost all the math we do in JavaScript
is more simple than this I'll give you some exercises at the end of this lesson
to help you get more practice the last thing we're going to learn in this
lesson is how to use Google when you're learning to code so far I've been giving
you different pieces pces of code like alert and
math.round you might be wondering where do I find this code these pieces of code
are features of JavaScript and I find this code by searching on Google so
we're going to learn how to use Google to learn new features of JavaScript on
our own let's go to our browser and create a new tab at the
top and we'll click here and type google.com and press
enter and we'll search in Google so the trick to searching in Google is to
search for what we are trying to do for example if we want to round a number we
would search for JavaScript how to round a
number if we press enter sometimes you might get the code right
away in the first result and sometimes you might have to go into the other
results to find the code that you need in my example I see the code math.round
in the first result so I can click into this result read about what this code
does and also see some examples of how to use it one thing to keep in mind is
that when you're searching in Google you might not understand understand all the
code that you get in your results for example here there's a lot of code that
we haven't learned yet and actually that's okay we just need to look for the
pieces of code that look familiar to us like this part of the code we can then
use this part of the code in our own code we don't have to understand every
bit of code that we get from Google and don't worry as we move through this
course we we will understand more and more of this code that we get from
Google results these days we also have some
artificial intelligence or AI tools that can help us search for code I'll provide
links to some of these tools in the video
description by the way to find the links mentioned in each lesson you can click
here in the description and this page contains all
the links mentioned in each lesson and that's the end of this lesson
in this lesson we learned how to work with numbers and math we learned the
order of operations and brackets we calculated the numbers in the final
Amazon Project we learned that calculations using floats can be
inaccurate and how to avoid this problem when working with money we learned how
to round numbers using math.round and we learned how to search
for code on our own here are some exercises to help you practice numbers
and math in the previous lesson we learned how to
work with numbers and math in this lesson we're going to learn how to work
with text and we're going to create the text in this section of the final
project first make sure you have the final project open and you're on the
checkout page also make sure you have the console open on this page if not you
can go to a blank area right click click
inspect and then click the console now we're going to learn a
feature of JavaScript called strings a string represents text let's go to our
console and create our first string we're going to type single quote hello
and single quote and press enter this is a string and it represents
the text hello and we've actually seen this code before in the first lesson the
first piece of code that we learned was alert Open Bracket single quote hello
single quote close bracket and semicolon this code creates a popup on
the page if we press enter it creates a popup now in inside these brackets we
actually created a string this string is the text that appears in the popup so as
you can see a string represents text let's press
okay and now let's learn the syntax rules for strings to create a string we
just write some text like hello and then surround this text with single quotes
one at the beginning and one at the end we can also add strings together for
example let's type the string sum plus the string
text and press enter when we add two strings it
combines the strings together into a bigger string and this makes sense we're
adding two pieces of text together we can also add more than two strings at a
time for example we can type the string
sum plus the string more plus the string
text if we press enter the computer will combine all
three strings into one big string by the way this is called concatenation when we
combine strings together now in in the previous lesson we learned about numbers
numbers and strings are two different types of values in JavaScript they
represent different things and we can actually check what type of value
something is using this code type of and then space and then a value like the
number two if we press enter type of will tell us that two
is a number if we do type of quote hello quote and press enter it will tell us
that hello is a string now what if we added a string and
a number together for example let's type the string
hello plus the number three and press enter
so when we add a string and a number JavaScript will automatically convert
this number into a string so this gets converted into the string hello plus the
string three and then it combines them together
into the string hello 3 this feature is called type coersion or automatic type
conversion okay now that we understand understand the basics of strings let's
do some practical examples we're going to use strings and numbers to create the
text in this section of the project first make sure that in your cart you
have one basketball with free shipping and you have one t-shirt also with free
shipping and you have no other products let's scroll up and we'll start
by creating this text in the top right so this is the cost of the products but
this time we're going to have a dollar sign so instead of just a number this
will be text so one thing we can do to create
this text is just type out the string directly like quote doll
28.94 and quote however let's actually calculate
this number using math remember the advantage of JavaScript is
that it's able to do calculations so instead of typing out
28.94 we're just going to create the string Dollar Sign Plus and we're going
to calculate this number using math so we're going to add the cost of the
basketball which is $2.95
plus the cost of of the t-shirt which is $7.99 if we press
enter unfortunately this doesn't look right instead of doing math and adding
these two numbers together it just sort of put the numbers one after another
into the string so why is this happening JavaScript adds from left to right so
the first step is to add these two values and as we learned if we add a
string and a number JavaScript will automatically convert this number into a
string so the result of this calculation will be the string doll
2.95 and quote the next step is to add
7.99 so it will add 7.99 and now we're adding again a string
and a number so JavaScript will automatically convert
this number into a string and combine them together that's why it puts
7.99 at the end of this string instead of doing
math so what we actually want to do here is to add these two numbers first and
then combine the total with the string so how do we do this the solution is
that strings also follow the order of operations just like numbers and
remember in the order of operations we can use brackets to control which part
of a calculation gets done first so let's type this calculation out again
the string dollar sign plus 20957 99 but this time we're going to
add an Open Bracket and a close bracket around this
calculation this tells the computer to calculate this number first using math
and then combine this result with the string after if we press
enter now this is doing math and it solves our original problem
unfortunately now we have another problem this math is inaccurate so
remember from the previous lesson doing calculations with floats can sometimes
cause inaccuracies and the best practice when
calculating money is always calculate in cents and then convert back to dollars
at the end so at the bottom here we're going to add the string
Dollar Plus open bracket and instead of $20.95 we're going to add
2,95 Plus $7.99 and close bracket and then at the
end we're going to convert this number back to Dollars by dividing by 100 if we
press enter this will give us the text that we
see in the final project again strings follow the same
order of operations as numbers brackets are always calculated first multiply and
divide are done next and add and subtract are done after so adding this
result to the string is the last step now let's do a more complicated
example let's use strings and numbers to create this entire line of text not just
the dollar text to create this we're going to go from left to right let's go
back in our console and we're going to start with the string
items Open Bracket and here we could just type two and close bracket but
let's actually calculate this number as well using math so this number is the
quantity or the number of products in our cart let's go back to our console
we're going to end the string here and we're going to add and we're going to
calculate the quantity so we have one basketball plus one
t-shirt again we run into the same problem as before this gets calculated
first and results in a string and then it will just combine the one at the end
of the string instead of doing math to solve this we're going to use brackets
again so around the 1 + 1 we're going to add Open Bracket and close
bracket this tells the computer to add the numbers first and then combine it
with a string all right let's keep going from
left to right we're going to add the rest of the string quote close bracket
colon and let's just use a space to represent the space between these two so
we'll type a space dollar sign and then we're going to calculate this number
again and add it to the string so we'll end the string and then plus and we
already did this calculation up here so we can select this and then
rightclick copy and here right click and
paste and press enter by the way if you paste in the
console you might see this warning message
to fix this you can type allow pasting and press
enter and now you can paste and that's how we create this
first line of text using strings and numbers we break up the string into
Parts calculate the numbers and then add the parts back
together all right now let's take these strings that we created Creed and do
something with them let's create a popup and display this first line of text
inside the popup we'll go back to our console and type the code for creating a
popup alert Open Bracket close bracket
semicolon and then inside the popup we're going to display this string so
let's just make a copy of this code we'll select it right click
copy and between the brackets right click and
paste if we press enter the computer displays a popup with
the first line of text of the final project
inside so that's how we use strings to create the text in the final project and
once we create the strings we can use them in other JavaScript
code in in the rest of this lesson we're going to learn more details about
strings in JavaScript there are actually three ways to create a string the first
way is to use single quotes which we already learned for example we can type
single quote hello and single quote and press
enter the second way to create a string is to use double quotes for example
double quote hello and double quote and press
enter this creates the exact same string as single quotes so which one should we
use to create a string single quotes or double quotes in JavaScript I recommend
using single quotes by default they're a little easier to read and type there is
one situation where double quotes might be useful and that is is if we have a
single quote inside the string for example if we type the
string I'm learning
JavaScript and single quote and press enter this doesn't work because there's
a single quote inside the string and this single quote will end the string
early to solve this we can create the string using double quotes for example
double quote I'm learning
JavaScript and double quote and press enter so now this works because we
created the string using double quotes the single quote no longer has a special
meaning and it will no longer end the string early so this is a situation
where double quotes might be useful otherwise we use single quotes by
default now there's actually another solution to this problem other than
using double quotes and that's by using an escape character so a character is
one letter number or symbol in a piece of textt for example the text hello has
five characters h e l l o a character can be a letter in number
or also a symbol these are all considered
characters now in addition to these characters we have a special set of
characters we can also use in a string called Escape characters an escape
character looks like this a backslash and then another character like single
quote this combination actually counts as one character in a string this
character creat creates a single quote that is just text it doesn't have a
special meaning and it doesn't start or end strings for example we can create
this string with single quotes again so single quote I and this time we'll use
the Escape character back slash single quote and then M
learning JavaScript and single quote and press
enter and now this works because the Escape character back SL single quote
creates a single quote that is just text it doesn't start or end the
string another Escape character that's useful to know is back SL double quote
this creates a double quote that is just text it doesn't start or end a
string the last Escape character we'll learn in this lesson is back
sln this is called the new line character this Escape character doesn't
create the letter N anymore it creates a new line of text for example let's
create a popup using alert Open Bracket close bracket and
semicolon and then inside the brackets we're going to create a string sum and
then back sln text and single quote if we press
enter you'll notice that this Escape character created a new line of text in
the popup and that's why we call this the new line character so that's how
Escape characters work they are a set of special characters that start with back
slash and we can use them in a string now let's press okay
and we're going to learn the Third Way of creating a string in JavaScript which
is using back ticks for example let's type in our console and we'll type
backtick hello and backtick and press enter this creates the same string as
single quotes and double quotes strings created with backx actually have a name
we call these template strings and they have a name because they have some
special features the first special feature of template strings is called
interpolation interpolation lets us insert a value directly into a string
for example let's say we want to create the first line of text in our project
earlier in this lesson we created this text with concatenation which means we
broke it up into parts and added them back together in interpolation gives us
a much easier way to do this we'll go to our console and we'll create this text
using a template string because interpolation is only a feature of
template strings so we'll type backtick items Open Bracket close bracket and
back tick and now between these brackets we want to insert the quantity or the
number of products in our cart to insert this with interpolation we're going to
type Dollar open curly bracket close curly bracket so this combination of
characters allows us to insert values directly into the string between these
curly brackets we can calculate the quantity which is one basketball plus
one t-shirt this will add 1 + 1 which equals
2 and then insert it directly into the string
let's keep going and create the rest of this line so we're going to type at the
end a Colin space and dollar and now we're going to insert another value into
the string which is the cost of the products to insert another value we're
going to type Dollar open curly bracket close curly bracket again in between the
curly brackets we're going to calculate the cost of the products
which is 2,95
plus $7.99 and we'll surround this in
Brackets to make sure we calculate this first and at the end we're going to
convert back to Dollars by dividing by 100 if we press
enter this creates the first line of text again in our final project
if we compare this code which uses interpolation to our previous code which
uses concatenation you can see that interpolation is a much cleaner way of
inserting values into a string so interpolation is a recommended
solution next template strings have another special feature called
multi-line strings let's go to our console and we're going to type a
backtick sum and then press
enter and text and back tick notice that this string is on multiple lines so we
call this a multi-line string and this feature is only available for template
strings if we press enter you can see that the new line in
the string just creates the new line Escape character that we learned earlier
so that's the multi-line string feature of template strings we're going to use
multi-line strings a lot later in this course but for now I just wanted to
introduce you to this feature now you might be wondering again what should we
use to create a string single quotes or template strings even though template
strings have more features I find that most JavaScript code still uses single
quotes by default so my personal recommendation is to use single quotes
by default and if we need to insert a value into the string or type the string
on multiple lines then use template strings and that's the end of this
lesson in this lesson we learned about strings a string represents text we
learned how to use strings and numbers to create the text in our final project
we learned three different ways of creating a string single quotes double
quotes and back ticks or template strings we learned about Escape
characters and we learned two useful features of template strings
interpolation and multi-line strings here are some exercises to help
you practice working with strings so far in this course we've learned some
basic features of JavaScript like numbers and strings in this lesson we're
going to learn how to use HTML CSS and JavaScript together because as I
mentioned at the beginning of this course we use all three Technologies to
build build a full website HTML creates the content of a
website like the buttons and the text CSS changes the appearance of the
website and JavaScript makes the website interactive the first thing we're going
to do is review the basics of HTML and CSS that we will need for the rest of
this course now in order to write HTML and
CSS code we need to install another piece of software called a code editor a
code editor helps us write and organize our code the most popular code editor
for web development is called vs code or Visual Studio code to install vs code
you can go to google.com in your browser search for VSS
code click the result and follow the instructions to download
and install once we've installed VSS code
we're ready to review the basics of HTML and
CSS we'll start with HTML HTML stands for hyper text markup
language and just like JavaScript HTML is also giving instructions to a
computer now unlike JavaScript we can't use the console to write and run HTML
code instead we write HTML code inside a file using our code editor let's do that
right now we'll start by going to our desktop so I'm going to close my browser
to go to my desktop and then we're going to create a
new folder so we can right click new folder this folder is going to contain
all the code that we write in this course let's name this folder JavaScript
dasc next we're going to open this folder in our code editor so let's open
vs code and then we'll click
file open folder and find the folder that we just
created for me it's on the desktop and it's this folder right right
here so we're going to select the folder and then click select
folder now we can close this startup message and we're going to create an
HTML file we're going to click this icon to create a new
file and we're going to name this file website do
HTML and press enter ending the file name name with
HTML tells a computer that this file contains HTML code rather than just
text now let's review some basic HTML code we're going to type the code less
than button greater than and we also need to type less than slash button
greater than but our code editor might autocomplete this for us so this code
tells a computer to create a button and inside the button we're going to have
the text hello now let's save this file by
clicking file
save or by typing contrl s on Windows or command s on
Mac now to run this HTML code we're going to open this file in our browser
let's go back to our desktop we're going to open the folder that we
created find the HTML file select it and then right click open with Google
Chrome as you can see we have a website and we created a button with the text
hello inside and if we look back at our code that's exactly what we told the
computer to do so just like JavaScript HTML is also
giving instructions to a computer let's review some more HTML
code first I'm just going to rearrange my windows here so that it's easy to see
the website side by side next we're going to click the end
of the first line and press enter to create a new line and we're going to
type the code less than P greater than and we also need to type less than SLP
greater than so this code creates a paragraph and inside the paragraph we're
going to put some text for example paragraph of text now let's save our
file by typing contrl s on Windows or command s on
Mac and to update our website to the new code we're going to go to our website
and click refresh or typ controlr on Windows or command r on
Mac and now you can see that the computer created a paragraph of text
just like we told it to do and that's the basics of HTML the computer reads
our code and then follows our instructions one by one first it creates
a button and then it creates a paragraph of text
now let's review the syntax rules for HTML each of these things that were
displaying on a web page these are called HTML elements so a button is a
type of HTML element and a paragraph is another type of HTML element to create
an element we start with a less than symbol and then the element name like a
button and then the greater than symbol so this whole thing is called an HTML
tag this tells a computer to create a button
element every HTML tag needs a matching tag the matching tag follows the same
syntax except it has a slash in front of the element name so this is called the
opening tag and this is called the closing tag you can think of the opening
tag as the start of the button and the closing tag tag as the end of the button
and in between we have the contents inside the button in this case it's the
text hello in addition to text we can also
have elements inside an element for example we can go to our paragraph
element and we can add a button inside so less than button greater than and we
also need less than SL button greater than and then inside the button we'll
also have the text hello if we save this file and refresh
the page now our paragraph element has a
button element inside by the way this is called nesting
when we have an element inside another element the last syntax rule we have to
review is that in HTML if we have multiple spaces for example if we go
here and type multiple spaces multiple spaces are combined into
one space on the web page so if we save this code and
refresh you'll notice that all of the spaces that we added only show up as one
space on the web page in addition in HTML new lines also count as spaces so
if we go back to our code and we type here and press enter to
create a new line and then save and refresh notice that the new line doesn't
appear on the web page and that's because this new line here is the same
as spaces in HTML so all of these get combined into one space on the web
page at first this might seem a little weird but this feature gives us a lot of
flexibility when organizing our h ml code for example we can go into our code
and add a new line here to separate these two elements and make our code
easier to read another thing we usually do to make our code easier to read is to
put the contents of an element on its own line for example we're going to type
here and press enter and here and press enter
again to put the contents of the button Buton on its own line now it's a lot
easier to see where this button starts and where it ends we can do the same
thing with the paragraph We can type here and press enter and type here as
well and press enter and then remove some of the Extra
Spaces to put the content of the paragraph on its own line and now if we
save our file and refresh
you notice that none of the new lines that we added appear on the web page by
the way a web page is a single page like the homepage or the cart page together
we call this a website so that's the basics of HTML and
HTML syntax now let's review CSS CSS stands
for cascading style sheets and CSS changes the appearance of our website
let's review some CSS code we're going to write our CSS code inside our HTML
file first let's type here and create some new lines at the top and then at
the top we're going to create a special HTML element called the style element so
let's type less than style greater than and we also need the closing tag
less than SL style greater than so the style element is unique because it
doesn't appear visibly on the page instead the purpose of the style element
is that it lets us write CSS code inside so inside here let's press enter
to create a new line and we're going to type
button open curly bracket close curly bracket and then inside the curly
brackets we're also going to press enter to create a new line so this is CSS code
and this code tells a computer to change the appearance of all buttons on the
page and then inside these curly brackets we can tell the computer how to
change the appearance for example we can type
background- color colon red and semicolon if we save
and refresh you can see that this CSS code
changes the appearance of all buttons on the page and changes their background
color to Red let's do another example we're going
to go back to our CSS code going to type here and press enter to create a new
line and we're going to add color colon white and semicolon let's save
and refresh and this CSS code changes the
text color of all buttons on the page to White let's do one more example we're
going to type the code order Colon none and
semicolon let's save this and refresh and this CSS code removes the
border for all buttons on the page and that's how CSS works we tell the
computer which elements we want to change and then how to change the
appearance of these elements now let's review the syntax
rules for CSS this part of the CSS code is called
the CSS selector it tells a computer which elements we want to change in
other words it selects which elements to change inside the curly brackets we have
some CSS Styles this tells a computer how to change the
appearance for each style the left side is called the CSS property this tells a
computer what we're changing the right side is called the CSS value this tells
a computer what we're changing the property to for example this style
changes the background color to Red we use a colon to separate the
property and the value and a semicolon at the end to tell the computer that
this is the end of a style so that's the basic syntax of CSS we tell the computer
which elements we want to change and then how to change the appearance of
these elements the next thing we're going to
review is HTML attributes right now this CSS selector
changes the appearance of all but buttons on the page however what if we
only want to change the appearance of this one button and we want to style the
other button differently how do we do that we're going to review a feature of
HTML called attributes attributes change the behavior of an element for example
we're going to go to the opening tag of the first button and then here we're
going to add an HTML attribute by typing space
title equals double quotes and then in between the double quotes we're going to
type tool tip so this is an HTML attribute and
this attribute adds a tool tip to this button if you're wondering what a tool
tip is if we hover over some code in our code editor it'll show us this sort of
popup with more information this is called a tool tip
when we hover over something and this shows up so if we save our
file and refresh the web page and now we hover over our button we can see that
the HTML attribute added a tool tip to our button and then inside the double
quotes is the text inside the tool tip for example we can actually change this
to good job and if we save save and
refresh and hover over our button the text between the double quotes is what
shows up in our tool tip so that's an example of an HTML
attribute now let's review the syntax rules for
attributes we always put attributes on the opening tag and we add a space
between the element name and the attribute to separate them on the left
side is the attribute name this tells the computer what we're changing about
this element on the right side is the attribute value this tells a computer
what we're changing this attribute to for example here we're changing the tool
tip of this element to good job we separate the name and value with an
equal sign and make sure there are no spaces around the equal sign and we
surround the value with double quotes now let's go back to the original
problem how do we style these buttons differently we can do this using a very
important attribute called the class attribute let's review that right now
we're going to go back to our button and then here we're going to type space
class equals double quotes and then inside the double quotes we're going to
type red Das button so the class attribute sort of
adds a label to an element so here we labeled this button as a red button and
now that we labeled this element we can select it in
CSS to do that we're going to go to our CSS code we're going to remove the
button selector and replace it
witht red-
button when we start the selector with a DOT this means that now we're looking
for a class so here we're going to look for all elements with the class red dash
button which is only this element if we save and
refresh now only the elements with the class red button gets these Styles we
can also add the same class to multiple elements for example we can go to to our
other button and add the class equals
red- button if we save and
refresh now these Styles get applied to both buttons again because they both
have the class red-b button if we want to style this button differently we just
give it a different class for example we can change this to Yellow yellow dash
button and then in our CSS we can add another selector so we can type dot this
means we're going to select a class and we're going to select the yellow Das
button class open curly bracket close curly bracket and then inside here we
can add some styles for the yellow button for
example background Das color colon yellow and
semicolon now let's save and refresh and that's how we use the class
attribute in HTML to modify specific elements the final thing we need to
review is something called the HTML structure let's go back to our website
we're going to find a blank area and then
rightclick and then click inspect so we already learned about the console
tab here we can write and run JavaScript code now we're going to go to the
elements tab which is for HTML and CSS so in the elements tab we can see all
the HTML on the page as well as all the CSS on the page and we can play around
with the CSS if we want now if we go back to to the
HTML you'll notice that our web page has some elements that we didn't add before
the HTML element the head element and the body
element so this is the structure that we're supposed to follow when writing
HTML in our code we didn't follow the structure so the browser actually adds
it for us automatically however it's still best
practice to follow this structure in our code because it gives us access to some
more features of HTML let's review the HTML structure and
add it to our code we're going to type up here and
we're going to create some new lines and now every HTML file is going
to start with less than exclamation dock type in capitals and
then space HTML and greater
than this is not an HTML element it's a special line of code that tells a
browser to use a modern version of HTML if we don't have this the browser
might fall back to an older version of HTML that has less
features next we're going to create an HTML element so less than
HTML and greater than the HTML element represents the
entire web page so everything on the web page should go
inside this element and then inside the HTML element
we're also going to split it up into two sections the head
element and the body element so the body element is supposed
to contain everything that is visible on the page in our example that would be
the buttons and the parag graph so let's actually select this
code and we're going to rightclick and
cut and then inside the body we're going to right click and
paste the head element contains information about the page in general
everything that is not visible on the page goes inside the
head in our examp example that would be the style element so let's select this
as well we're going to rightclick and
cut and then inside the head we're going to right click and
paste and at the bottom let's just clean up by removing all of the extra new
lines so this is a structure that we're supposed to follow in all of our HTML
files as you can see this structure uses a lot of nesting or elements inside
elements to organize our code okay so what are the benefits of
following this structure one benefit is that there are other elements that we
can use inside the head for example let's type here press enter and we're
going to add the title element so the title element sets the text in the
tabs inside we can type HTML CSS review if we save and refresh the title will
show up in the tab so this is an example of an element
that we can now add in the head another benefit that we get from
this structure is the ability to automatically refresh our web page when
we change our code so far every time we change our code we
have to save and then manually refresh the web page we can actually automate
this by following the structure and then installing a VSS code
extension so let's click the extension area and we're going to search for the
extension live server and click install
once we have that installed we're going to change a
setting let's open the settings by clicking this icon in the bottom left
and then click settings at the top we're going to
search for live server and we're going to look for a
setting called live server custom browser and we're going to change this
to Chrome now now if Google Chrome is
already your default web browser you don't need to do this step but it's nice
to know now let's close the
settings and go back to our code next instead of opening this file
directly in the browser like before we're going to use live server to open
this file to do that we're going to rightclick this file in our code editor
and then click open open with live server if we open a file with live
server this web page will automatically refresh when we change our
code for example we can go here and change the background color to Green if
we save live server will automatically refresh the web page so we don't have to
do that back and forth anymore let's just change it back to Red
so that the class last name makes sense and
save and we can also close the previous tab so this is the HTML structure it
gives us access to more features of HTML and this is all we need to review
about HTML and CSS for now if you want to learn more you can check out my HTML
and CSS full course in the video description by the way to find the links
mentioned in each lesson you can click here in the
description and this page contains all the links mentioned in each
lesson before we add JavaScript to our website we're going to review some VSS
code setup so you notice that many of these
lines have spaces at the front these spaces are called in indents and indents
make our code easier to read for example we can easily tell that this code is
inside the brackets because it has an extra indent in the
front if we didn't have indents here's what the code would look like it's a lot
harder to read to add an indent we can type at the
beginning of the line and press tab to remove an indent we can press
shift tab or just use backspace now by default VSS code uses
four spaces per indet however in HTML CSS and JavaScript we usually use two
spaces per indet so we're going to update this setting let's go to our
settings by clicking this icon in the bottom
left and then click settings and at the top we're going to
search for tab and we're going to change the tab size
from 4 to 2 now let's close the
settings and we're also going to change the indents for this file we're going to
go down here and click select indent and we're going to choose indent
using spaces and then click
two and now if we type at the start of a line and press tab it will only add two
spaces per indent so let's reformat our code to use
two spaces per indent instead of four first we're going to remove all the
indents in our code a shortcut for this is to select all of these
lines and press shift tab to remove one indent for each line so we're going to
keep pressing shift tab until we remove all the
indexs next next we're going to add the indents back using a similar shortcut
we're going to select the head element and press tab to add one indent
for each line and then select everything inside the head and press tab to add
another indent and then select everything inside style and press Tab
and then inside each of these brackets we're going to select the lines press
Tab and then here press tab we'll do the same thing for the body element we'll
select all these lines and press tab we'll select everything inside the body
press Tab and then inside each of these elements we're going to press Tab and
press tab now if we save our website will look
the same because all we did was adjust the
indents so there's one other setting in vs code that we're going to set up which
is line wrapping if you look at this line of code you can see that it's
really long and we need to scroll horizontally to see the rest of the line
instead we're going to make this line wrap around if it gets too long let's go
back into our settings by clicking here and then click the
settings and then up here we're going to search for
wrap and we're going to look for editor word wrap and we're going to turn this
on now if we close our settings and go back to our
code this line which is really long will wrap around to the next line instead of
us having to horizontally scroll so that's the vs code setup that
we need two spaces per indent and line wrapping finally we're going to add
JavaScript to this website so we learned that we can use the console to write and
run JavaScript well there's actually another way to run JavaScript which is
inside an HTML file let's learn how to do that so we learned that HTML has a
special element that runs CSS code called the style element while HTML has
another special element that runs JavaScript code and this element is
called the script element so inside
body at the bottom of the body we're going to add less than script greater
than and the closing tag less than SL script greater than and inside the
script element we can put some JavaScript code we're going to add the
code alert Open Bracket quote hello quote close bracket and semicolon if we
save live server will refresh the page and
now you notice that the computer now runs our JavaScript code just like it
did in the console it creates a popup with the text hello
inside and we usually put the script element at the bottom of the body
because we want the web page to be created first and then we use JavaScript
to make it interactive for the rest of this course
we're going to run our JavaScript code using using an HTML file the console
that we used in the previous lessons is more of a way to try out JavaScript code
we wouldn't use a console for a real website in addition to the script
element we have another way to run JavaScript code inside HTML and that's
by using an attribute let's go back to our first button and here we're going to
add another attribute so let's type space and this time we're going to add
the onclick attribute equals double
quotes So this attribute will run JavaScript code whenever we click this
button that's what onclick means between the double quotes we can write some
JavaScript for example let's press enter enter and then here we're going to type
alert Open Bracket
quote good job quote close bracket and semicolon now if we
save live server will refresh the page and run this line of JavaScript code
let's press okay and now if we click this
button it will run this line of JavaScript code and create a popup with
a text good job inside so those are two places where we can run
JavaScript code the script element and the onclick attribute the code in the
script element runs first when the page is loaded the code in the onclick
attribute runs after when we click the button on the
page and that's how we use HTML CSS and JavaScript together on a website
notice that everything starts from HTML HTML first creates the website and
then inside the HTML we can run CSS code to change the appearance and we can run
JavaScript code to make the website interactive now let's learn some new
features of JavaScript that we haven't seen yet in this course the next feature
we're going to learn is called comments comments are pieces of code that the
computer ignores so let's create our first comment we're going to go down to
the script element here and type forward slash forward
slash so this is a comment anything after the double slash will be ignored
by the computer so we can type anything we want like this is a
comment if we save it ignores this line and creates the popup in the next
line now let's close this popup and learn why we use
comments comments are useful for providing more information for people
reading our code for example we can create a comment above this code like
this code creates a popup this comment helps others and
ourselves understand what this code does so that's one way we use
comments another way we use comments is if we don't want to run some code
anymore but we also don't want to delete it for example this code creates a popup
every time we refresh the page and this can be
annoying so I want to stop running this code but I also don't want to delete it
because you might want to review this code
later so what we can do here is to add a double slash in front of this line to
turn this code into a comment now if we save the computer will
ignore this line of code and not create the
popup this is called commenting out the code it's useful if we don't want to run
some code anymore but we also don't want to delete it for informational purposes
so JavaScript has another Syntax for writing comments and that syntax is
slash star and star slash here anything between the stars is
a comment this is called a multi-line comment because between the Stars we can
write a comment on multiple lines for example we can type multi enter line
Line enter comment on the other hand double slash
is known as a single line comment now just like JavaScript HTML
and CSS also have comments but they use a different
syntax if we scroll up to our HTML here we can type less than
exclamation Das Dash and we also need dh- greater than so anything between
these double dashes is a comment for example this is a
comment in CSS to create a comment we can type slash star star slash so it's
the same multi-line comment as JavaScript between the Stars we can add
a comment so this is a
comment if we save our file nothing changes on our web page
because comments are ignored by the computer the last feature of JavaScript
we're going to learn is called console.log let's go back to our
code and at the bottom in the script element we're going to type the code 2 +
2 so we learned that this code in Java script does some math however if we save
this file where is the result of this math so
we might think that the result will show up in the console but if we
rightclick click inspect and then click the
console you'll notice that the result doesn't show up here either and that's
because before we were running 2 + 2 inside the console so the result shows
up in the console but now we're not running this code in the console anymore
we're running this code on the web page so how do we see this
result the solution is we're going to redirect this result back to the console
to do that we're going to use this piece of
code console.log Open Bracket close bracket
and semicolon console.log will display
whatever's between the brackets back in the console so if we move this code
between the brackets so we select this and then right click cut and then
between the brackets right click paste and
save the result of this code is displayed back in the console
and console.log works for any code that we learned so far for example we can use
strings so let's create a new line and type
console.log Open Bracket close bracket semicolon and then between the brackets
let's type some strings quote Su quote plus quote text
quote and save this
file again it will display the result of whatever's between the brackets back in
the console so that's how we see the result
of JavaScript code that is running in a file we use
console.log and that's the end of this lesson in this lesson we reviewed the
basics of HTML and CSS we set up our code editor vs code we learned how to
load JavaScript inside an HTML file using the script element and the onclick
attribute we learned how to create comments and we learned how to use
console.log thanks for watching this course so far if you want to support
this channel you can check out the premium version of my courses just like
this one where you can get a certificate of completion and a learning platform if
you're interested in extra videos from me more in-depth videos and behind thes
scenes content you can check out these links here you can also support the
channel by liking the video subscribing and sharing this video with others
thanks again and let's continue with the course here are some exercises you can
try on your own to practice what we learned in this lesson
in this lesson we're going to learn the next feature of JavaScript called
variables and we're going to use variables to build a simple version of
the cart quantity feature of the final project
first let's create a new HTML file just for learning variables we're going to go
to our code editor and click this icon to show our files and then click this
icon to create a new file and we're going to name this file
05- variables.
HTML and press enter so the 05 just means that this
file is for lesson five let's also add the lesson number to
website. HTML we'll select this file and then
rightclick rename and then at the front We'll add
04- and press enter next we're going to copy all the
code in website. HTML to variables. HTML so let's click in this file and
we're going to select all of this code by typing control a on Windows or
command a on Mac and then we're going to
rightclick copy and then inside variables.
HTML rightclick and paste let's click this icon to hide our
files for now and we'll prepare this file for this lesson so let's scroll up
to the top and first we're going to change the title to
variables next we're going to delete all the CSS because we're going to start
over and we're going to delete all the HTML except for the script
element and let's delete all the JavaScript from the previous
lesson and finally let's save and we'll open this file in our browser
by right-clicking and then open with live
server and now we can close the previous tab and the previous code for
now now we're ready to learn variables first of all what is a
variable a variable is like a container we can save a value like a number or a
string inside a variable and then then use it later Let's do an example and
create our first variable inside the script element we're
going to type the code let and space the word let creates a new variable and now
we're going to choose a name for our new variable let's name this variable
one so this creates a variable or a container named variable one and now we
can save a value inside this variable to do that we're going to type space equals
space and then a value like a number or a string so let's save the number three
inside and we'll type a semicolon at the end so here we use the let to create a
new variable we named this variable variable one and we saved the value
three inside this variable now that we saved this value we
can use it later for example let's type a new line and type the code
console. log Open Bracket close bracket and
semicolon remember from the previous lesson that this code displays
whatever's inside the brackets in the console so far we put a value inside
like the number two if we save and then go to our
website and open the console so right click
inspect and then click the console we can see that the number two
was displayed in the console so now let's try replacing this
value with the variable that we created above so instead of two we're going to
console.log variable one if we
save notice that it now displays three so it's displaying whatever value is
saved inside the variable as you can see we can save a value inside a variable
and then use that variable later on let's do another example we're going
to create another variable so we're going to create some new lines and we'll
type let and this time let's name this
variable calculation and we're going to type
space equals space to save a value inside this new variable and this time
instead of just a number we're going to save a
calculation 2 + 2 and semicolon so this will calculate 2 + 2 and then save the
result which is four into the variable if we call
console. log Open Bracket
calculation and semicolon and save it will show us that the value for
is saved inside calculation now let's try this code
we're going to type a new line and then console. log Open Bracket and
calculation again and plus 2 and
semicolon so here we're using a variable inside a
calculation what this does is that it takes whatever value is saved inside the
variable right now it is four and then substitutes that value into the
calculation so this will be 4 + 2 which equals
six if we save we can see that in the console it
display blade six so we can use a variable wherever we
use a value and JavaScript will substitute whatever is inside the
variable into the code let's do another example we're
going to type some new lines and create a new variable again using
let and we're going to name this variable
result and we're going to make it equal to calcul
ation plus 2 and semicolon so this does the same thing as
a code before it will take whatever value is inside calculation which is
four and substitute it into this code so we get 4 + 2 =
6 but this time we have an extra step we're going to save this result which is
six into another variable so so if we
console.log result and
save we can see that six was saved into the result
variable again we can use a variable wherever we use a value now in addition
to numbers we can save any type of value in a variable including
strings for example let's create a new variable using
let and let's name this message and we're going to save inside
this variable a string this time so quote hello quote and
semicolon again we're going to console.log this variable so
console.log and message and a semicolon at the end if we
save it will show us that the string hello is
saved inside this variable okay now that we learned how
variables work let's learn the syntax rules for
variables the word let creates a new variable and then we give the variable a
name so we can name variables almost anything we want except for a few
restrictions number one we can't use special words like let as a variable
name that's because let already has a special
meaning in JavaScript it creates a variable so let is a reserved word
however we can use let one or let two as variable names we just can't use
let number two we can't start a variable name with a number if we start with a
number JavaScript will think this is a number instead of a variable name
however we can use numbers in the middle or the
end lastly we can't use most special characters like these or a space in a
variable name however there are two special characters we can use dollar and
underscore so those are the rules for naming
variables and then to save something inside a variable we just use the equal
sign and then the value we want to save and that's it after we create a variable
we can start using it in the rest of our code now there's one last part of the
syntax that we haven't learned which is the semicolon we've seen semicolons in
many places already in JavaScript a semicolon means this is the end of an
instruction it's similar to a period in English in English a period means this
is the end of a sentence so here this semicolon tells
Java script that this is the end of an instruction and now after this we can
add another instruction like console. log Open Bracket and then the
string semicolon and a semicolon at the end if we
save it will run these two instructions one after another without any
problems so if we didn't have the semicolon here and and we save it
wouldn't work because JavaScript thinks that this entire line is one
instruction so we need semicolons to separate different instructions in
JavaScript if we save everything goes back to
normal so JavaScript is a little special because it has a feature called
semicolon insertion that means it will try to
insert the last semicolon in a line of code automat automatically for example
if we removed the last semicolon and
save this code will work without that semicolon and that's because JavaScript
inserts the last semicolon automatically however a lot of companies
still prefer to use semicolons in their JavaScript code because semicolon
insertion can sometimes put the semicolon in the wrong place for this
reason we're also going to use sem colons in this course to help you get
used to JavaScript code with semicolons next we're going to learn how
to change the value that is saved inside a variable for example here we save the
number three inside variable one now we're going to change the value saved
inside variable one to do that we're going to go to the bottom and create
some new lines and we're going to type the
variable name again so variable one and now to change the value
saved inside we're just going to type the equal sign and then a different
value like five and semicolon and now if we console.log this
variable console.log variable 1 and semicolon and
save it will show us that five is now now saved inside variable
one notice also that if we scroll up to the top the first console.log still
displays the value three and that's because at this point in the code
variable one still contained three we didn't update the variable yet so when
we first saved a value inside this variable this is called assigning a
value to a variable then when we change the value
inside this varable iable this is called reassigning a value to a
variable now let's learn the syntax rules for reassigning a value notice
that we don't use the word let when reassigning that's because let creates a
new variable so if we try to use let again
it would try to create a new variable named variable one however variable one
already exists and we can't create two VAR variables with the same name so this
would cause an error instead to reassign a variable we just type out the variable
name and make it equal to something else so that's the Syntax for reassigning a
variable now we're going to do one last example before working on the project
let's go to the end of our code we're going to type some new
lines and this time we're going to re reassign variable one again so we can
reassign a variable as many times as we want so let's type variable 1 and then
equals and we're going to type variable 1 + 1 and
semicolon so we learned earlier that we can use a variable inside a calculation
and it will substitute whatever value is inside the variable
here we're also using a variable inside the calculation but we're using this
variable itself so it's essentially taking this
variable increasing it by one and then saving it
back if we console.log this variable variable
one and save variable one now contains six so it
took the previous value in variable one which was five added one and then saved
it back so this is how we increase the
value of a variable by a certain number okay now that we know how to
create and reassign variables we're ready to work on a project so I actually
prepared a project that we can do for this lesson and we can see this project
by going to our browser clicking at the top and and typing
super simple dodev SL projects SLV
variables and press enter so we're going to work on the cart
quantity feature of the final project so in the final project we have a number in
the top right corner that shows how many products are in our cart when we click
the add to cart button this quantity will increase
so what you see here is a simple version of the cart quantity feature that we can
create right now let's go over how it works first make sure you have the
console open on this page now when we click the show quantity button it will
show us that there are zero products in our cart if we click the add to cart
button it will increase the quantity by one and display it in the console
if we click add to cart again it will increase the quantity by one again now
in the final project we can also add more than one product at a time using
this drop-down for now we're going to build a
simpler version of that we're going to use the plus two and plus three buttons
to add multiple products so when we click the plus two button it will
increase the quantity by two and display it in the console
and when we click the plus three button it will increase the quantity by
three and finally when we click the reset cart button it will reset the
quantity back to zero and display this message in the
console so now that we understand how this project Works let's build this step
by step first let's create a new HTML file just for this project we're going
to go to our code editor and click this icon to show our files and then click
this icon to create a new file let's name this file 05
dcart D quantity.
HTML and press enter next let's open variables. HTML
and we're going to copy all the code here into our new
file let's type control a on Windows or command a on Mac to select all this code
and then right click
copy and then in our new file right click and
paste let's close this for now and in the new file we're going to
change the title to cart quantity and let's remove all of our JavaScript
code but keep the script element because we're going to write new JavaScript
code now we're ready to begin let's start by creating these
buttons let's go to the body element going to create a new
line and here as we learned in the previous lesson we can create a button
using this HTML code less than button greater than and the closing tag less
than SLB button greater than inside this button we're going to
have the text show quantity and let's
save now let's open this file in live server by right clicking and then open
with live server and we can see that we created
the first button now let's create the other buttons here feel free to pause
the video if you want to try it yourself we're going to go back to our
HTML and create another button inside this one we're going to
have the text add to cart let's create another
button this one is going to have the text plus
two and we'll create another button this one is going to be + 3 and
finally we'll create the last button and this one is
reset cart and now let's
save and if we go back to our tab we've created all the
buttons now let's make this web page interactive with
JavaScript first of all we need somewhere to save the cart quantity so
as we learned in this lesson variables are the perfect solution for this
variables let us save a value so let's go into the script element and we're
going to create a variable by typing let and this variable is going to save
the cart quantity so let's just name it cart capital Q
quantity so the card quantity will start out at zero so we're going to type equal
Z and semicolon next when we click the show
quantity button we want to display the quantity in the console to do this we
learned a special HTML attribute in the previous lesson called the onclick
attribute so we're going to type in this opening tag here space
onclick equals and double quotes So the onclick attribute run some JavaScript
when we click this button and between the double quotes we
can write JavaScript code so let's press enter
enter And now when we click this button we want to display the card quantity in
the console so let's type console.log Open Bracket close bracket
semicolon and then between the brackets we're going to display a message
now if we go back to superimple dodev and we click show
quantity we want to display this message in the
console so in our code between the brackets we're going to type the string
quote cart quantity colon
0 now let's save and go back to our tab to try it
out so we're going to open the console first by right clicking and then click
inspect and then click the console and now when we press the show
quantity button it should display that message in the
console okay so we just made our project interactive however we obviously don't
want to display zero every time we want to display the value inside cart
quantity so we need to insert this value in inside this
string remember from the strings lesson when we want to insert a value into a
string we're going to use a template string so let's switch the single quotes
to back ticks to create a template
string and now instead of zero we're going to insert a value using Dollar
open curly bracket and close curly bracket and in between these brackets
we're going to insert this variable
cart capital Q quantity remember that JavaScript is
case sensitive so make sure you type the variable name exactly the
same now let's save and click show quantity
again and now it displays the value inside card quantity in the console so
notice that variables also work with string
interpolation again we can use a variable wherever we use a value and it
will just substitute whatever value is saved inside this variable into the
code now let's make the rest of the buttons
interactive so when we click the add to cart button we're going to add one to
this cart quantity and display it in the console so again we're going to type
here and type space on click equals double quotes and
between the double quotes we're going to add
JavaScript let's also add some new lines here to make our code easier to
read okay so in the onclick attribute we're going to do two things the first
one is increase the card quantity by one we can do that by reassigning the
card quantity variable so we're going to type just the variable
name cart quantity and we're going to make it
equal to itself plus one and
semicolon next we're going to display the updated quantity in the console so
let's press enter and we're going to display this
message again so we can actually just copy this code so we'll select it and
then right click and copy and then
here right click and paste now if we
save and click the add to card button we'll see that it increased the
quantity by one and displayed the updated quantity in the console let's
press it again to make sure it works so it increases it by one again
and then displays it in the console so that's basically how the cart
quantity feature works in the final project first we need a variable to save
the quantity and then when we click a button we're going to update the
quantity so now let's make the rest of these buttons interactive feel free to
pause the video if you want to try it yourself for the plus two button we're
going to add the onclick attribute again onclick equals double quote
and inside we're going to increase the cart quantity by two so cart quantity
and then we'll just make it equal to itself plus two and
semicolon and again we're going to display the updated quantity in the
console so we can create a new line and just copy this code so select it right
click copy and here right click and
paste let's save and click plus two a few times and we can see that it adds
two to the card quantity and displays it in the
console for the plus three button we'll do the
same let's type an onclick attribute click equals double
quotes and here we're going to increase the card quantity by three three so cart
quantity equals itself + 3 and
semicolon and we're going to display this in the console again so we'll
select this right click copy and here right click and paste let's save again
and try it out to make sure it works so plus three +
three and finally let's do the reset card
button so we'll add the onclick attribute again on click equals double
quotes and inside the double quotes we're going to do something a little
different this time instead of increasing the cart quantity we'll set
it back to zero to do this we can just reassign the
cart quantity variable so cart quantity and just make it equal to Z and
semicolon now if we go back to superimple
dodev and try out this reset cart button you'll notice that it displays
two messages the first message is cart was reset so we're going to display that
message in our code first
console.log and the string cart was reset
and the second message is the same message as the other buttons so we can
just select this and then right click
copy and then here right click and paste and now let's save and go back to
our Tab and give this a try so the cart quantity starts at zero
when we press add to cart increase in es by one this increases by two this
increases by three and when we click reset cart it'll display cart was reset
and reset the cart quantity back to zero and that's it we just created a
simple version of the cart quantity feature of our final project using
everything that we learned in this course so
far now we're going to learn some shortcuts for reassigning
variables so if we look at this line of code here we're increasing the value of
this variable by two and then saving it back well there's actually a shortcut
for this and that shortcut is cart quantity plus equal 2 and
semicolon so this does the same thing as the line above but it's just shorter the
plus means we're going to add two to cart quantity
and equals means we're going to save that result back to card quantity so we
can actually delete this line and the code will work the same way
if we save and try it
out it will still add a two and then save it back in card
quantity let's scroll up and practice by using this shortcut for card quantity +
one so instead of this line we can type cart
quantity plus equal 1 and semicolon so it turns out that in
programming plus equals 1 is so common that we have an even shorter shortcut
for plus equals 1 and that shortcut is cart
quantity plus plus and semicolon so this is the same thing as
plus equal 1 and all three lines do the same
thing so we can remove these lines and the code will work the same
because it's just a shortcut if we
save so if we click add to cart it will add one every
time so those are some shortcuts for reassigning
variables we also have these shortcuts for the other operators like minus
equals multiply equals divide equals and minus minus I'll leave some exercises
for these other shortcuts at the end of this
lesson next we're going to learn some best practices for naming variables so
if we scroll down notice that our variable cart
quantity has two words in it cart and quantity we learned earlier that we
can't have spaces in a variable name so if we want to have multiple words we
have to combine them together like this now you might be wondering why we wrote
it this way with a lowercase c and a capital
Q This is actually a naming convention called cam case in cam case we combine
the words together and capitalize every word except the first
word so for cart quantity we capitalize quantity but we keep cart lowercase
because it's the first word cam case is actually the standard
naming convention for JavaScript all of our variable names should use cam
case now in programming there are other naming conventions that exist another
one is called Pascal case Pascal case is the same as camel case except we
capitalize the first word so for cart quantity Pascal case would be Capital
cart and capital quantity in JavaScript there is one feature where we use Pascal
case which we'll learn later in this course for everything else we use camel
case another naming convention is Kebab case here we keep the words lowercase
and combine them with a dash like cart Dash
quantity Kebab case doesn't work in JavaScript because the dash is already a
minus symbol however we use Kebab case in HTML and CSS and also in our file
names as you can see here and finally we have snake case
where we keep the words lowercase and combine them with underscores snake case
is used in other languages but it's not really used in
JavaScript so those are the common naming conventions that we use in
programming now one more thing I want to note is that when we name our variables
try to pick a name that is not too short or too long for example instead of cart
quantity we could have named this variable
C but this name is too short it's hard to understand what c means we could also
use a name like this quantity of products in the cart but this name is
too long it's hard to read this in the code so try to have a balance between a
name that is understandable but not too long like cart
quantity the last thing we're going to learn in this lesson is there are three
ways to create variables in JavaScript let's go back to our variables. HTML
file and we're going to learn those three
ways so the first way is to use let which we already learned the second way
to create a variable is to use the word const so at the bottom we can type const
space and then a variable name like variable 2 and make it equal to
three so const creates a variable just like let except we can't change its
value later this value stays constant that's why it's called const if we try
to change its value like variable 2 = 5 and then and we save this and we open
this file in the browser by right clicking and then open with live
server and then open the console so rightclick
inspect and then click the console it will give us an error when we
try to change this variable so this doesn't work let's remove this line and
Save so why would we ever use const instead
of let well const makes our code safer and easier to understand when we create
a variable with const we know for sure that this variable will always contain
three for let however if we create a variable it's hard to know what value is
inside this variable because later on we can change this value in our
code so in order to keep our code safer it's actually a best practice to use
const by default and only use let when we know that we need to change the
variable so here it's actually best practice to use const to create this
calculation variable because we're not changing it later same thing for the
result variable and the message
variable now for variable one we have to use let because we're changing it later
in this code so that's const it creates a variable
that can't be changed later finally the Third Way of creating
a variable is to use another word VAR so at the bottom we can type VAR space and
then a variable name like variable 3 and make it equal to
three so VAR creates a variable just like let and this variable can be
changed later VAR is actually the original way
to create variables in JavaScript VAR means
variable however VAR has some issues that we'll learn later in this course
and because of these issues we don't use VAR in new JavaScript code you might see
VAR in older JavaScript code so it's still useful to know so those are three
ways to create variables in JavaScript let constant and VAR we use const by
default and if we have to change a variable then use
let so one more thing we're going to learn is that we can use type of with
variables so remember that type of tells us what type a value is for example if
we wrote
console. log type of
three and save type of will tell us that three is
a number well we can actually use type of
with a variable so if we change this to
variable 2 and save type of will tell us the type of
value inside the variable which is a number and that's what we see in the
console now let's check the type of this
variable message so message contains a string and if we do
console.log type of message and
save this will tell us that the value inside the message variable is a string
so we can use type of to check the type of value that is saved inside a variable
and that's the end of this lesson in this lesson we learned about variables
which are a way to save values and use them later we learned how to reassign a
variable we created the cart quantity feature of the final project we learned
some shortcuts for reassigning a variable we learned some naming
conventions and best practices for variable names and we learned learned
three ways to create a variable let const and
VAR here are some exercises to help you practice using variables
in this lesson we're going to learn two more features of JavaScript called
booleans and if statements and we're going to use these features to build
this rock paper scissors project let's start by creating a new
HTML file for this lesson we're going to go to our code editor and click this
icon to show our files and then click this icon to create a new file we're
going to name this file 06-
booleans HTML and press
enter let's open variables. HTML and we're going to copy all this
code into our new file let's select the code using control a on Windows or
command a on Mac and then rightclick
copy and in here rightclick and
paste let's close this for now and prepare this file for this lesson so
we'll scroll to the top and change this to
booleans and then remove all the JavaScript code but keep the script
element now let's
save and open this file in live server by right clicking and then open with
live server and we can close the previous
tabs as well as the previous code for now we'll start by learning what are
booleans so far in this course we learn two types of values in JavaScript
numbers and strings booleans are another type of value in JavaScript but booleans
are special because there are only two Boolean values true and
false let's click in the script element and type true press enter and type
false so these are the only two Boolean values that exist true and false so
what's the purpose of Boolean values a Boolean value represents whether
something is true or false for example in JavaScript we can
compare two numbers let's create some new lines and type the code 3 less than
5 so this code checks whether the number three is less than five and of course
this is true so if we console.log this code console.log
and save and then go to our website and open
the console rightclick inspect and
console it will show us that the result of this code is the Boolean value
true let's try another example let's delete this less than
symbol and replace it with a greater than symbol so now this code checks
whether three is greater than five and we know that three is not greater
than five so if we save the computer will tell us that the
result of this comparison is the Boolean value false so as you can see a Boolean
value represents whether something is true or
false now let's learn the syntax rules for booleans to create a Boolean we just
type true or false note that we don't surround these with quotes like this if
we surround them with quotes this is now a string not a
Boolean we can use type of to check this so at the front we can type
console.log type of true if we
save this will tell us that this is a string now if we remove the
quotes and Save this will tell us that this is now a
Boolean so when creating a Boolean don't put quotes around true or
false let's save now one way to create a Boolean is
to compare two numbers for example 3 greater than 5 so this greater than
symbol is called a comparison operator and there are many other comparison
operators we can use we saw less than earlier and we also
have greater than or equal to less than or equal to Triple equals which checks
if two values are equal to each other and exclamation double equals which
checks if two values are not equal to each other now JavaScript is a little
special because it has two ways to check if two values are equal triple equals
and double equals the difference is that double equals tries to convert both
values into the same type for example in our code let's create some new lines and
console. log and let's check if the number five
is equal to the string 5. if we
save it will tell us that these two values are equal to each other even
though one of of them is a number and the other is a string and that's because
the double equals converts both values into the same type so converts both of
these into the number five and then Compares them so that's why they are
equal however this is not a good idea because this value is a number and this
value is a string it's a piece of text so they shouldn't really be equal to
each other that's why in JavaScript we always use the triple equals to check if
two values are the same so that we avoid the conversion behavior of double equals
so if we save now it will tell us that these two
values are not equal to each other because one value is a number and the
other value is a string so this rule also applies to not
equal to in JavaScript we always use exclamation double equals instead of
exclamation equals to avoid the conversion
Behavior All right so those are comparison operators in the order of
operations comparison operators have a lower priority than math so if we did
something like 5 and then minus 5 this would calculate 5 - 5 first which
is zero and then compare the two numbers so three is now greater than zero so if
we save the first comparison will now be
true so comparison operators have a lower priority than math
operators now that we know what Boolean values are we're going to combine them
with a really useful feature called if statements an if statement lets us write
multiple groups of code and then decide which code to run Let's do an example
and create our first if statement we're going to go to the the
bottom and create some new lines and type if and Open Bracket Clos
bracket and open curly bracket closed curly
bracket between these round brackets we're going to put a Boolean value like
true and in between the curly brackets we're going to put some code to run for
example console.log hello so the way that an if statement
works is that if this Boolean value is true then we're going to run the code in
the curly brackets if this Boolean value is false then we're not going to run the
code if we save the value between the brackets is
true so we're going to run this code and display
hello now if we change this to false and save it will not run this
code so an if statement lets us decide whether or not to run some code based on
this Boolean value now if statements have another
useful feature called else let's go to the end of this if
statement and type
else open curly bracket close curly bracket and then inside these curly
brackets we're going to put some different code like
console.log else the way else works is if this
Boolean value is true the computer will run this code otherwise we will run the
code inside else let's give it a try we'll change
this Boolean value to true and save and because it is true it will run
this code and display
hello now if this Boolean value is false and
save because it is false it will not run this code and it will run the code
inside else and display else so using IF and else we can write
two groups of code and then decide which code to
run now let's do a practical example we're going to write some code to check
if someone is old enough to drive let's go to the bottom and create
some new lines and we're going to type if
brackets and curly brackets and inside here we're going to
compare two numbers the first number is a person's age let's pretend we have a
person who is 30 years old so we're going to type
30 then we're going to check if this age is greater than or equal to the legal
driving age Let's Pretend the legal driving age is
16 notice that between the brackets we don't have to just put a Boolean value
we can put any code that results in a Boolean
value so this comparison results in the Boolean value true that means the
computer will run the code between the curly brackets so in here let's type
console .
log you can drive now if this is not true let's run
some different code at the bottom we'll type
else and curly brackets and then inside these brackets we'll type
console.log you canot drive now let's
save and it will tell me that this person who is 30 years old can
drive if we go back and change this to a person that is 15 years old and
save this comparison will result in false so it will display you cannot
drive so that's how we use if statements we can write multiple groups of code for
different situations and then decide which code code to
run now let's learn the syntax rules for if statements to create an if statement
we type if and then round brackets with a Boolean value inside this is called
the condition if this condition is true we will run the code inside the curly
brackets we can also add an else statement this code will run if the
condition is false the else statement is optional we don't have to have
one so these curly brackets and the code inside these are called branches because
it's like a tree branch the code is splitting off into two directions and we
either run this code or we run this code one more thing to know is in a
branch if we only have one line of code the curly brackets are actually optional
so we can delete these and the code will still work
however if we have more than one line of code in this Branch for example if we
add another line console.log
congrats now this branch has two lines of code so the curly brackets are
mandatory so we have to add them back now we're going to learn another
feature of if statements which is we can have more than one condition for example
we're going to go to the end of this if branch and type else if and then
brackets and curly brackets else if lets us add another
Branch to our if statement between these round brackets
we can add another condition for example if a person is almost old enough to
drive let's display a different message so inside this condition
let's check if this person's age which is 15 is greater than or equal to 14 so
we're checking if they are almost old enough to drive and now inside the curly
brackets we're going to display a different
message console.log almost
there so the way this works is that the if statement checks the condition one by
one first it checks if this is true if it is it will run this Branch then it
checks if this is true if it is it will run this branch and if none of the
conditions are true it will run the else Branch so here this condition is false
so we're not going to run this code but now the second condition is true so
we're going to run this code if we save we display almost there
in the console so using else if branches we can
add as many conditions as we want to an if
statement the next thing we're going to learn is that we can combine if
statements with variables from the previous
lesson for example here we wrote the person's age two times so we can
actually save this age in a variable and then reuse that
value so above the if statement let's create a variable using const and
let's name this variable H and we'll make it equal to
15 remember the best practice for creating a variable is to use const by
default and only use let if we're going to change this value
later and now that we saved this number in a variable we can use the variable
inside the if statement so we'll replace 15 with age and here as well with
age so this will take whatever value is inside the variable and substitute it
into the code if we
save the if statement works the same way as before and we run this
line okay now we're ready to use booleans and if statements to do a
project we're going to build a rock paper scissors gate G first let's take a
look at the project we're going to go to our browser and at the top create a new
tab and we're going to type here superimple dodev SL
projects SL booleans and press
enter here we can see a simple version of a rock paper scissors game and if we
click this link it will take us to the final version of this game so in this
game we can pick a move and then the computer will pick a
random move and it will show us the result and we also have a score of how
many times we won lost and tied so we're going to build this as we go through the
course but for now let's go back and we're going to start by
building this simple version of the game so how this simple version works is we
click one of these buttons to pick a move so let's pick
Rock then the computer will randomly pick a move in this case it's paper but
for you it might be different and it will compare the two moves and display
the results in this popup so the rules of rock paper
scissors are rock beats scissors paper beats Rock and scissors beats
paper let's press okay and we'll get started on this
project first we'll create a new HTML file just for this project let's go to
our code editor and click here and create a new file and we're going to
name this file 06-
rock-paper-scissors HTML and press enter next let's copy all the code from
booleans HTML into this new file so we'll open this again and then control a
or command a to select all the code and then right click
copy and in here right click and paste let's close this and prepare this
file so we'll change this to rock paper
scissors and remove all of the JavaScript code that we had
before finally let's save and open this file in the browser by right clicking
and then open with live server let's take a look at the project
again so we're going to start by creating the text first because this
text is in the final version of the project so in our
HTML we're going to create a paragraph element for this text so less than P
greater than and the closing tag less than /p greater than inside our
paragraph we're going to have the text rock paper
scissors next let's create the buttons so we'll go to our
HTML and create a button and inside this first button
we'll have the text Rock Let's create another
button this one will be paper and we'll create the last
button this one will be scissors now let's save and check our
new tab and now we created all the elements
that we need next let's make these elements
interactive with Javas JavaScript so when writing JavaScript a good strategy
is to think about what steps we need to do and then convert those steps into
code so here when we click a button the first step is the computer will randomly
select a move and then we're going to compare the moves to get the result and
finally we'll display the result in a popup by the way this is called an
algorithm an algorithm is a set of steps to complete delete a task or to solve a
problem now that we know what steps we need to do we're going to convert these
steps or this algorithm into code first we're going to run some
JavaScript when we click these buttons so let's use the onclick attribute again
we'll go to the opening tag of the button and type
onclick equals double quotes and then inside these double
quotes we can add our JavaScript so now we have to figure out how to
randomly select a move for the computer to do this we need to learn a new piece
of JavaScript code so here we're going to type capital
m math.random Open Bracket close bracket
math.random generates a random number between zero and one so if we
console.log this console log and
save and click this button and then check in our console by
right clicking inspect and the
console it will display a random number between Z and 1 if we click this button
again it will generate a different random number so every time we run MTH
random it generates a different random number between 0 and one now to be more
precise it actually generates a number greater than equal to zero and less than
one now let's save this random number in a variable so we can use it later so
we'll replace the console.log with
const and then a variable name let's just name it random capital N number
and then equals so we saved this random number
inside this variable next we need a way to convert
this random number into a move like rock paper or scissors to do this let's
imagine the space between 0 and 1 and then divide the space into three equal
parts each part represents a move if we generate a random number and it's
between 0 and 1/3 the move will be Rock if it's between 1/3 and 2/3 the move
will be paper and if it's between 2/3 and one the move will be scissors this
is how we can convert the random number into a move and this will give the
computer an equal chance of picking rock paper or
scissors now let's convert these steps into code and an if statement is the
perfect solution for this this already looks like an if statement so in our
onclick attribute let's add some new lines and type if brackets and curly
brackets for this first condition we're going to check if the random number is
between 0 and 1/3 so let's check if random number is greater than or equal
to zero but in this case we also need to
check that random number is less than 1/3 because we're checking if the number
is between 0 and 1/3 but how do we do this how do we check that two
comparisons are both true to do this we're going to learn another type of
operator in JavaScript called logical operators logical operators let us
combine Boolean values which is what we need to do here let's go back into
booleans HTML and we're going to learn logical
operators so first let's open the tab for this
file and we're going to comment out all the previous code so our console doesn't
get too messy slashstar and then at the
bottom star slash now let's create some new
lines and the first logical operator we're going to learn is called the and
operator let's type
console. log a Boolean value true and another Boolean value
true so this is the and operator and it checks if two Boolean values are both
true so it checks if the left side is true and the right side is true that's
why it's called the and operator so here the left side is true and the right side
is also true so the and operator will result in true if we
save this displays true now if one of these sides is false for example if we
change this to false now let's check is the left side
and the right side both true in this case no so and will now result in false
if we save it now displays false so that's the logical and operator it
checks if the left side is true and the right side is also true so this is
exactly what we need for our project for example let's create a new line and type
console.log and let's say that we generated a random number like
0.2 and we want to check if it's between 0 and 1/3 so we can do
0.2 is greater than or equal to 0 and we're also going to check if
0.2 is less than 1/3 so we're using the logical and
operator to check if the left side is true and the right side is also true so
in this example both sides are true 0.2 is between 0 and 1/3 so if we save
this whole thing will display true now in the order of operations logical
operators like and have a lower priority than math and comparisons so in this
example it will calculate the math first and then it will calculate the
comparison on the left and then the comparison on the right and then at the
end the and operator checks if both sides result in
true now let's use the and operator in our project let's go back to the file
for our project and then inside this first
condition we're going to check if the random number is greater than or equal
to zero and at the same time is the random number less than 1/3 so this is
how we check if a number is between 0 and
1/3 in this case the computer will pick Rock so between the curly brackets let's
just type con cons. log
Rock let's get some practice and create the other two branches for picking paper
and scissors feel free to pause this video if you want to try it yourself
first so here we're going to type else if to add another branch and then
brackets and curly brackets and in this condition we're going to check if random
number is greater than or equal to 1/3
and random number is less than
2/3 so if this random number is between 1/3 and 2/3 inside here we're going to
console do log paper and finally let's create another
Branch using else if random
number greater than or equal to 2/3 and random number less than
1 and console.log
scissors if we save and then go back to our rock paper
scissors tab and then click the rock button a few
times it will pick some random moves for the
computer so that's how we generate the computer's move one thing I want to
point out is that I use the less than comparison instead of less than or equal
to I just did this so that the comparisons don't
overlap before we continue in the project we're going to learn two other
logical operators we can use let's go back to booleans
HTML and let's also open the tab for this
file the next logical operator is called the or operator for example let's type
some new lines and type console.log true or
false so this is the logical or operator it checks if at least one side is true
so it checks if the left side is true or the right side is true that's why it's
called the or operator so here one of these sides is
true so the or operator will result in true if we
save this displays true if both sides are true it will also
result in true because at least one side is
true the last logical operator we're going to learn is called the not
operator for example let's create a new line and type
console. log exclamation true so the exclamation is called the
not operator the not operator only uses one Boolean value and it flips it into
the opposite value so if this value is true the not operator will flip it into
false so if we save this will result in false now if
you think about it if we say that something is not true that's the same
thing as saying that it is false so that's why this is called the not
operator now if we change the value to false again the not operator will flip
this into true so if we save this will now result in true
so those are the logical or and not operators we don't need to use these in
our project right now but I'll leave some exercises for these at the end of
this lesson now let's go back and continue the project let's open the code
and open the tab the next step is to compare the
computer's move to our move which is Rock so first let's save the computer's
move in a variable so we can compare it later so instead of
console.log we're going to create a variable with
const computer capital M move and make it
equal to the string Rock and we'll do the same thing
here const computer move equals paper and
here const comp futter move equals scissors and now at the bottom let's
console.log the computer move variable to make sure that it
worked if we save and then click our Rock
button unfortunately it gives us an error telling us that computer move is
not defined even though we created it right here so what is happening here if
statements have a special feature they create something called a scope a scope
limits where a variable exists basically whenever we have these curly brackets
like this any variable we create inside the curly brackets will only exist
inside the curly brackets and we can't use these variables outside the curly
brackets so this is called a scope Scopes are a feature of many programming
languages and they help us avoid naming conflicts for example if I create a
variable here called random number equals
0.5 and this didn't create a scope so if I delete these curly
brackets this variable name will now conflict with the variable name up here
because we can't have two variables with the same name so you can imagine that if
we didn't have scope and we had hundreds or even thousands of lines of code we
would quickly start to run out of variable names so by creating a new
scope here all the variable names inside the scope only exist between the curly
brackets and it won't affect anything outside in the code so Scopes help us
avoid naming conflicts okay so I'll delete this
example and we'll learn how to access this variable
outside of this scope so to access this variable outside of the if statement we
have to create this variable outside of the if statement so above
here we can create this variable
const computer move and let's just make it
equal to the empty string for now so this variable was not created
inside any curly brackets so it's accessible from all of this code inside
the onclick attribute including inside the if
statement and then inside the if statement instead of creating a new
variable we're just going to save the move inside this variable up here
because we can access this variable anywhere else in the
code so instead of using const we're just going to reassign computer move and
we're going to move it here as well and here as
well and remember when we reassign a variable we have to switch from const to
let and now if we save and then click the rock
button we're able to console.log computer move because computer move is
no longer inside this scope it's up here so we can access it in this line of code
so that's how scope Works any variable that we create inside the curly brackets
will only exist inside the curly brackets so remember in the previous
lesson we learned a third way of creating variables called VAR the issue
with VAR is that it doesn't really follow the rules of scope for example
here if we create a variable with VAR like VAR and
random number equals
0.5 this variable will conflict with the variable up here with the same name even
though it's inside a scope so that's why we don't use VAR anymore and we just use
const and let because of VAR doesn't really follow the rules of scope so we
can remove this for now and move on to the next
step so we generated a random move for the computer
now we have to compare our move which is Rock to the computer's move to get the
result and see who wins to do that we'll use another if statement so at the
bottom here let's type if and then bra brackets and curly
brackets and then inside this condition let's check if the
computer move is equal to rock so remember in JavaScript we always use
triple equals instead of double equals to avoid the conversion
behavior and now if the computer's move is rock and our move is Rock then inside
the curly brackets the result is going to be a
tie and let's save the string in a variable so we can use it later again we
have the same situation as before we don't want to create the variable inside
here because then it only exists in this scope between the curly brackets instead
we're going to create the variable above outside the if statement so we'll use
let to create this variable because we're going to reassign it in the if
statement let's name this variable result and just make it equal to the
empty string at the top and then in the if statement we'll save the result into
this variable so
result equals tie now let's create the other branches
of this if statement so here we'll add else if brackets and curly
brackets and we'll check if the computer move is equal to paper this
time if the computer move is paper and we picked Rock
then we lose so the result is equal to you
lose and finally we'll add another else if brackets and curly brackets and we'll
check if the computer move is equal to
scissors and if the computer picked scissors and we pick Rock the result is
is that you win so that's how we compare our move to
the computer's random move using an if statement the last step is to display
this result in the popup so at the bottom let's create a
popup using alert Open Bracket close bracket and let's go back to super
simple Dev to see the message in the popup so we'll click this and in the
popup it shows our move the computer's move and then the result so we can
actually just copy this rightclick
copy and then in here right click and paste so obviously the computer is not
going to pick this move every time and this is not going to be the same result
every time instead we want to insert computer move into here and we want to
insert result into here so because we want to insert values we're going to
turn this into a template string using back
ticks and now instead of paper we're going to insert a value using dollar and
curly brackets and we're going to insert the variable
computer move and instead of this text every time
we're going to insert the variable
result and now if we save and we can click okay to close this
and go back to our Tab and click the rock
button we're going to pick Rock the computer will pick a random move and it
will show us the result in a popup so that's how we create this
simple version of rock paper scissors in our code we did things step by step
first we generated a random number we converted it into a move for the
computer and then we compared our move to the computer move and we displayed
the result in a popup so as you can see when we're
writing JavaScript we first figure out what steps we need to do this is called
an algorithm and then we convert these steps or this algorithm into
code so now now we can actually remove this console.log because we don't need
it anymore and the last step is to make the
other buttons here interactive so feel free to pause this video if you want to
try it yourself first for the paper button let's add
some new lines to make it a little easier to read and again we'll add the
onclick attribute and then inside here we can
actually make a copy of all the JavaScript we wrote so we can select all
of this and then write click
copy and then in here right click and paste if the formatting doesn't look
right we can select all of these lines and press tab to add indents until
the formatting looks good the one thing we have to change here is
that now we picked paper so the result is going to be different if the computer
picks Rock and we pick paper that means you
win if the computer picks paper now it means that we tie and if the computer
picks scissors that means you lose and here what will also change up
pick Rock to paper and that's
it the last step is to make the scissors button interactive so again on click
equals double quotes and then we'll make a copy of the
code so I already have it so just write click and
paste and then again select the code that we need to fix the formatting for
and press Tab and here we pick scissors so if the
computer picks Rock then the result is you lose if the computer picks paper the
result is you win and if the computer also picks scissors the result is a
tie and we'll change you pick Rock to scissors
now if we save and try out our game if we click Rock we're going to pick Rock
computer picks a random move and it will show us the result here let's press okay
and try paper this also works correctly let's
press okay and click
scissors and this also works correctly and that's it we just finished
creating a simple version of this rock rock paper scissors
game in the rest of this lesson we're going to learn more details about
booleans and if statements let's go back to booleans
HTML and open the tab for this file and let's comment out the previous
code using slashstar and star slash and create some
new lines the next thing we're going to
learn is called truthy and and falsy values so if statements don't just work
with Boolean values like true and false they actually work with any type of
value including numbers and strings for example let's type if brackets and curly
brackets and inside this condition instead of putting a Boolean value we're
going to put a number like five and then in inside the curly brackets let's
console.log the string truthy if we
save the number five behaves just like true it causes the if statement to run
this code so we call this value a truthy value because it behaves just like true
now let's change this value to a different number zero if we say
the number zero behaves just like false it causes the if statement to not run
this code we call this value zero a falsy value because it behaves just like
false so how do we know if a value is truthy or falsy in JavaScript the list
of falsy values are false the number zero the empty string Nan undefined and
null any value that is not on this list is a
truthy value so why do we use truthy and falsy
values one way we use them is like a shortcut in our code for example let's
create a variable at the bottom using const and let's call it cart
quantity and make it equal to five next let's create an if statement
if brackets and curly brackets and inside the curly brackets let's type
console.log the string cart has products now let's say that we only want
to display this message if our cart has products usually inside this condition
we would check if cart quantity is greater than zero but now instead of
doing this comparison we can actually just type cart quantity and it will
behave the same way if the card quantity is not zero they will both behave like
true if the card quantity is zero they will both behave like false so here the
card quantity is five which is a truthy value if we
save this caus the if statement to run this code as you can see instead of
doing comparisons we can use truthy and falsey values as
shortcuts truthy and falsy values also work with logical operators for example
if we console. log the not operator and the
number zero zero is a falsy value it behaves
just like false so the not operator will flip it into true if we
save this will display true now that we understand truthy and
falsy values let's go over the list of falsy values because there are some that
we haven't learned yet we already learned false zero and the empty string
the next falsy value is Nan which means not a
number we get Nan if we do some invalid math for example at the bottom let's
type console.log the string
text divided by the number five so obviously this is not valid math
if we save JavaScript will tell us that the result of this calculation is not a
number or Nan the next falsy value is undefined
undefined represents that something doesn't have a value for example at the
bottom if we create a variable with let variable one and we don't give it a
value and then we console. log this
variable and we save it will show us that variable one
contains the value undefined so undefined represents that this variable
doesn't have a value one thing to note with undefined
is that we can only use this syntax with let we can't use it with
const if we really want to use this with const we have to type out equals
undefined directly the last faly value is null
we'll need some extra knowledge to understand null so we'll learn about
null later in in this course the last thing we're going to
learn in this lesson are some shortcuts for if statements called the Turner
operator the guard operator and the default
operator first let's comment out this code so our console doesn't get too
messy SL star and then at the bottom star
slash and let's scroll down and we'll start by learning the Turner operator
we're going to type a Boolean value like true and question mark another value for
example the string truthy and then colon and another value
like the string falsy so this is the Turner operator
this is similar to an if else statement the first value is like the condition if
it's truthy the result of this code is a value after the question mark if the
first value is falsy the result of this code is the value after the colon so you
can think of the question mark as the if branch and the colon as the else Branch
this is sort of like a shortcut for an if statement like
this now an advantage of the Turner operator over an if statement is that we
can save a tary operator in a variable so at the front
we can do const result
equals and now if we console.log the
result and save the first value is true so the
value after the question mark gets saved in the
variable as always we can use truthy and falsy values instead of just true and
false so here if we change the first value to a falsy value like zero this
will cause the value after the colon to get saved inside the variable if we
save that's exactly what happens so this is the turnery operator it's sort of a
shortcut for an if else statement like this the next shortcut is called the
guard operator earlier in this lesson we learned the and operator which checks if
two sides are both truthy the and operator has a special
feature let's say we have an and operator and the left side is
false in this situation we already know it's impossible for both sides to be
truthy so we don't even need to check the right side so the and operator
actually stops early and doesn't even run the code on the right this is called
a shortcircuit evaluation for example let's go into our
code and create some new lines and we'll type
false and
console. log
hello if we save the left side is falsy so the and
operator stops early or short circuits and it doesn't even run the code on the
right so as you can see we can use the value on the left to block or guard the
code on the right so when we use the and operator like this we call it the guard
operator this is sort of like a shortcut for an if statement like
this and just like the Turner operator we can save the guard operator in a
variable for example let's create a variable const
message and make it equal to false and the string
hello if the first value is falsy the guard operator will stop early and the
result will be the first value if we console. log this
message and save the value f false will be saved
inside this variable now let's change this value to
a truthy value like the number five now it will not stop early and it will give
us the second value as the result if we save the string hello is now saved
inside this variable this is sort of like a shortcut
for an if statement like this so don't worry if it's a bit confusing all of
these are just shortcuts for an if statement they're sort of like an if
statement that we can write on a single line the last shortcut is called the
default operator which is similar to the guard operator but uses
or earlier in this lesson we learned the or operator which checks if at least one
side is truthy let's imagine we have an or operator and the left side is
true in this situation we already know the result of the or operator because
the left side is already truthy we don't even need to check the right side so the
or operator also stops early or short circuits if the first value is truthy
for example let's create some new lines and let's say that in our final Amazon
Project we can choose a currency to pay for our order let's create a variable
with const currency and make it equal to the
string e or Euros now let's say that choosing a
currency is optional if we don't choose a currency we'll use a default value of
USD or United States dollars to create a default value we can go to the end and
type or the string USD so here
the left side is truthy so the or operator will stop early and it will
result in the value on the left if we
console. log the currency and
save it will display Euros now let's say that we didn't
choose a currency because it's optional so let's go here and we're going to
change this currency to undefined now the left side is falsy so
the or operator does not short circuit it will continue and the result will be
the value on the right if we save now the string USD is saved inside
currency as you can see we can use the or operator to set a default value so
when we use the or operator like this we call it the default operator
the default operator is sort of a shortcut for an if statement like
this so don't worry remember that everything that we learned in this last
section are basically some shortcuts for if statements we don't have to use them
but they can save us some typing and that's the end of this lesson
in this lesson we learned about booleans and if statements Boolean values
represent whether something is true or false we learned how to use if
statements to make decisions in our code we learn how to use comparison and
logical operators we learned about algorithms and created a simple version
of rock paper scissors we learned about truthy and falsey values and we learned
some shortcuts for if statements the turnery operator the guard operator and
the default operator here are some exercises to help you practice booleans
and if statements in this lesson we're going to
learn the next feature of JavaScript called functions and we're going to use
functions to improve our rock paper scissors project first let's create a
new file for this lesson we'll go to our code
editor and create a new file and let's name this file
07- functions.
HTML and press enter next let's copy booleans HTML to
functions. HTML so we'll click this file and then select all this code using
control a or command a and then right click
copy and in here rightclick and
paste and we'll hide our files and prepare this file for this lesson
so at the top we'll change the title to functions and we'll remove all the code
in the script element and let's
save and we'll open this file in live server by
right-clicking open with live server and we're going to open the
console as well so right click inspect
and then click the console and finally we can close the
previous tabs as well as the previous
code okay now we're ready to learn functions first of all what is a
function a function lets us reuse code let's create our first function we're
going to go to the script element and type the word
function and space so this creates a new function and
then we're going to give a name to our function we can name it almost anything
we want but for now let's just name it function one and then we're going to
type round brackets and curly brackets then inside these curly
brackets we're going to create a new line
and we're going to type some code so console.log the string
hello and we'll also type console.log 2 +
2 and save so this creates a function now
let's learn how to use this function we're going to type at the bottom
the function name so function one and then Open Bracket close
bracket and semicolon when we type the function name
with brackets this will run the code inside the function if we
save notice that it runs the code inside the function and displays the two lines
in the console so why do we use functions a
function lets us reuse code so if we wanted to run both these lines of code
again all we have to do is type the function name again with brackets so
function one and brackets again if we save this will run the code inside the
function two times and we can reuse this code as many times as we want by typing
the function name with brackets so that's what a function is it lets us
reuse code now let's learn the syntax rules for functions the word function
creates a new function and then we choose a name for
our function the rules for function names are the same as variable names we
can't use special words like function we can't start with a number and we can't
use special characters although dollar sign and underscore are allowed and just
like variable names the best practice is to use camo case for function
names and inside these curly brackets we put the code that we want to run when we
use the function this is called the function body now one very important
thing to remember is that this code only creates a function it doesn't run the
code in the function or do anything else in order to actually run the code we
have to use the function like below by typing the function name with
brackets this is known as calling the function it's also known as running the
function or executing the function now that we learned the syntax
rules for functions let's do a practical example we're going to use functions to
improve the code of our rock paper scissors project first let's click here
to show our files and we're actually going to make a copy of the project just
for this lesson so we're going to rightclick this
file copy and then at the bottom right click
and paste and we're going to rename this
file so rightclick rename remove copy at the end and then
at the beginning we'll change this to 07 and press enter
next we're going to open this file in live server by right clicking and then
open with live server and let's also open the console
on this page we'll right click inspect and then click the
console all right now if we look at the code for generating a computer move
you'll notice that this code is the same for all three
buttons so this is a perfect situation to use a function because a function
lets us reuse code so let's scroll down to the script element and we're going to
make a function here so let's type function and then a function name let's
name this function pick
computer move and then brackets and curly brackets so one recommendation for
function names is to use a verb or an action in the name such as
pick so next we're going to move all the code for picking a computer move into
our new function so let's create a new line here and we'll scroll up to the
scissors button because it's the closest one and we'll select all of this code
for picking a computer move and then rightclick
cut and inside the function right click and
paste if we need to fix the formatting we can select these lines and press tab
to add indents so the reason we created this
function in the script element is because remember that the script element
runs when the page is loaded so we want to make sure that we create the function
first and then we use it in the buttons after now remember this code just
creates a function it doesn't actually run the code inside to run the code
inside we're going to call this function so let's scroll up to the scissors
button and we're going to call this function by typing the function name
pick computer move Open Bracket close bracket ET and
semicolon if we save and then click the scissors
button unfortunately it now gives us an error saying computer move is not
defined now this might seem weird because down here we actually create the
computer move so what's going on the reason this happens is because functions
create a scope in the previous lesson we learned about Scopes which limit weight
where a variable exists we learned about if statements and that if statements
create a scope between the curly brackets this means that any variable
created between the curly brackets only exist between the curly
brackets functions also create a scope any variable that is created between
these curly brackets only exists inside the curly brackets and we can't use it
outside the curly bracket ETS like we do here so that's why we're getting this
error so how do we solve this problem remember that with if statements we
solve this by creating the variable outside of the if statement like this we
can use a similar solution with functions to make this variable exist
outside the function we just have to create it outside the function so let's
select this code we're going to rightclick
and cut and remove these lines and then
outside the function we're going to rightclick and
paste so now this variable is no longer inside the function's scope and it can
be used anywhere else in the code so variables like this that can be accessed
anywhere are called Global variables if we save
and now click the scissors button everything is working again
because this code above can now access this
variable now let's press okay and let's use this function to
reuse this code so we'll scroll up to the paper
button and now instead of all this code again we're just going to remove it and
call the function pick computer move Open Bracket close bracket
semicolon and also with the rock button we'll select all this
code and remove it and just call the function
pick computer move brackets and
semicolon now if we save and click the rock
button it works just like before we'll press okay and click the paper
button it also works just like before so as you can see functions let us reuse
code and they make our code a lot cleaner by removing all the duplication
that we had another benefit of removing duplication is that before if we ever
wanted to update the code for picking a computer move we had to update it in
three places in each of the buttons but now if we scroll
down we only have to update it in one place inside this function so functions
also make our code easier to update in the
future next we're going to learn a feature of functions called a return
statement a return statement lets us get a value out of a function so at the end
of this function let's type some new lines and we're going to type type
return and then a value like the number five and
semicolon now whenever we call this function it will result in a value the
number five so up here when we call this function this
will result in the number five so we can actually console.log this console.log
and then save and click the scissors
button and it will show us that calling the function now results in the number
five and we display it in the console so that's how a return statement
works it lets us get a value out of this function let's press okay and do another
example we'll scroll down and this time let's change CH this
value to the string Rock now whenever we call this function
it will result in the string Rock if we save and then click
scissors and scroll up here calling this function now results
in the string Rock and then we display it in the
console so now let's press okay and we'll learn the syntax rules for a
return statement so we just have to type the
word return and then a value and it will get this value out of the function now
instead of just a value we can also return a calculation or a variable or
anything that results in a value so this is known as returning a
value from a function and this value is known as the return value we also Al
don't have to return anything from a function if a function doesn't have a
return statement or we return without a value like this this will return the
value undefined so if we
save and then click scissors again the function will return
undefined and lastly when we use a return statement it ends the function
immediately so after the the return statement if we type
console.log the string after and press okay here and save this
file and then click the scissors button notice that it doesn't run this
code and that's because once we return the code returns back to where we called
the function that's why it's called a return statement so it's not going to
run anything after the return so we can remove this
code and press okay so now that we understand return
statements we're going to learn a better way of getting the computer move out of
this function so first let's actually move this variable back into the
function so we right click and cut and then in
here right right click and paste and delete these
lines so now we're back to the original problem how do we access computer move
outside of the function so another solution is to return this variable
because remember a return statement lets us get a value out of the function so
down here we're going to return the
computer move so this will take whatever value is
saved inside computer move which is one of these values and return it out of the
function if we save and then click these scissors
button we were able to get the move scissors outside of this function so
what happened here is that we return this move and then up
here we took the move and displayed it in the console to get
scissors so that's another way of getting the computer move out of a
function using the return statement however now we're back to this
problem with computer move not being defined because we moved it back into
the function's scope so let's scroll up and remember that this return value is
just a value we can use it like any other value for example we can
console.log it or we can also save this in a variable so let's do that right now
we're going to remove this and create a new variable with
const and let's just name this variable computer move to match what we use down
here and we use equals to save the return value inside inside this
variable so note that even though we use computer move here as well as here
there're different variables this one is inside the function's scope so it
prevents it from conflicting with variables outside the function's scope
that's one of the main benefits of Scopes so now that we saved the return
value into this variable and we're using this variable down here the code should
now work work if we save and click
scissors everything is back to normal and let's press okay so don't
worry functions can be a little confusing at first because the code is
no longer simply going from top to bottom it sort of jumps around a little
bit so let's go through this step by step when we click this button we're
going to run this function so the code is going going to jump down here and
then it's going to run all of this code from top to
bottom at the end we're going to return whatever is inside computer move back to
where we called this function so we're going to return all the way back here
and then we're going to save that return value into a new variable computer move
and then use computer move down here so following the code line by line
like this is called tracing the code it's a useful technique to understand
exactly what the code is doing now let's compare the two
solutions that we used a global variable and returning a
variable so returning a variable like this is actually preferred over using a
global variable and that's because a scope can help us prevent naming
conflicts so all the variables inside here will not conflict with anything
outside the scope so generally it's a best practice to keep things inside a
scope if we can now let's move on and use this
function in the other buttons feel free to pause the video if you want to try it
yourself first so we'll scroll up to the paper
button and then here we're going to save The Returned computer move into a
variable so const
computer move so that it matches the code down here make it equal to whatever
is returned and then same thing for the rock button we're going to save the
return value in a variable const computer move
equals if we save and click the rock button
it works let's press okay and click the
paper button and this also works and let's press okay so that's how we use a
return statement to take advantage of the benefits of
scope next if we look at the rest of this code where we compare our move and
display the result you'll notice that this code is very similar for each of
the buttons you the only thing that's different is the result and the message
that we display so we can actually use functions here as well to reuse code
that has small differences to do this we're going to need another feature of
functions called parameters so let's go back into
functions. HTML and let's open the tab for this
file and let's also comment out the previous code by typing
slash star and at the bottom star slash and create some new
lines and now we're ready to learn parameters so parameters are sort of the
opposite of a return statement a return statement gets a value out of a function
a parameter puts a value into a function so let's do an example let's say that
we're working on the final Amazon Project
and we need to calculate the tax for our order let's create a function to
calculate the tax so function let's name it
calculate tax brackets and curly brackets and then inside the curly
brackets let's say that the cost of our products is
1,000 or $10 and the tax is 10% to calc calculate the tax we can do
1,000 * 0.1 which is
10% let's also display this number in the console so at the front we'll type
console.log and brackets now let's save and remember
this code only creates a function it doesn't run the code inside to run this
code we're going to call this function so down here we're going to type the
function name calculate tax and then brackets if we
save it runs this code and then it displays the tax which is 100 cents or
$1 however right now this function only calculates the tax for
1,000 what if we want to calculate the tax for a different amount how would we
modify this function to work with any number to do this we're going to learn a
feature of functions called parameters a parameter lets us put a value into a
function so let's finally create our first parameter so inside these round
brackets we're going to choose a name for our parameter so let's just name
this parameter
1 a parameter one works the same way as a variable we can save a value inside
this parameter and then use it just like a
variable so first let's save a value inside the parameter to do that we're
going to go to where we call the function and then inside these brackets
we're going to put a value for example 2,000 this will save this value into
this parameter and now we can use it just like a
variable so instead of 1,000 we're going to type
parameter 1 and it will take whatever value is inside parameter 1 in this case
2,000 and substitute it into the code if we
save it now calculates 2,000 * 0.1 to give us 200 cents as the tax
now every time we call the function we can save a different value into the
parameter for example let's create a new line and call the function
calculate tax and this time we're going to save
the value 5,000 into parameter 1 if we
save this line of code will calculate the tax for 5,000
and result in 500 cents so as you can see a parameter lets us put values into
a function and this allows our function to work with any
value now let's learn the syntax rules for parameters to create a parameter we
just type the parameter name between the brackets parameter names follow the same
rules as variable names we can't use special words we can't start with a
number and we can't use special characters other than dollar sign and
underscore and the best practice is to use cam
case let's actually change this parameter name to cost so the code makes
more sense and
save next when a function has a parameter we usually say this function
takes a parameter if this parameter should be a number we say this function
takes a number when we put a value into the
function like this we call this passing a value into the function another name
for this value is called the argument and believe it or not we've
actually used functions and parameters this whole time the first code that we
learned in this course was alert alert is actually a function you can tell it's
a function because of the round brackets and between the brackets we put a string
so this is an example of a parameter and lastly a parameter only
exists inside the function's scope so we can only use this parameter between the
curly brackets we can't use it outside the
function next a function can actually have more than one parameter for example
right now our calculate TX function can only calculate a 10% tax but what if
we're in a different country and we want to calculate a different tax percent to
solve this we can add a second parameter by typing after the first parameter a
comma and then another parameter name let's name this tax
percent and now to save a value into the second parameter we'll go go to where we
call this function and also type a comma and a second value like
0.2 or a 20% tax so the first value gets saved in the first parameter and the
second value gets saved in the second parameter and now we can use our second
parameter just like a variable so instead of 0.1 every time we're going to
calculate it with tax percent and it will substitute whatever
value is inside tax percent into the code if we
save this first line will multiply 2,000 by
0.2 and give us 400 cents as the result so we can have as many parameters
as we want in a function we just have to separate them with a
comma Now notice that the second time we call this function we didn't give a
value for the second parameter if we don't save a value into the parameter
the parameter will get the value undefined so here if we
console. log the second parameter tax percent and
save it will show us that the second time tax percent is
undefined and then multiplying the cost time undefined is not valid math so we
get the result Nan or not a number so now let's remove the
console.log and we'll learn how to fix this so to fix this we can either pass a
second value into the function like this line or we can also set a default value
for the parameter to set a default value we can just type after the parameter
and then add equal sign and a default value like
0.1 if we save the second function call Will
multiply 5,000 by the default value 0.1 and give us
500 so that's how we add a default value for a
parameter all right now that we learned parameters we're going to go back to the
rock paper scissors project and reuse even more code so let's go back to the
file for the project and also the tab for this
project and now if we look at the code inside each of the buttons you'll notice
that the code is basically the same for all three buttons the only small
difference is the move that we picked so this is a perfect situation to use a
parameter so so inside the script element let's create a new function to
reuse all of this code we'll type function and let's name this function
play game brackets and curly brackets next let's move all of this
code inside the function so we can reuse it we'll select this
code and then rightclick
cut and inside the function right click and
paste and if we need to reformat we can select these lines and press
tab so the value that is different for each button is the move that we picked
so we're going to turn this move into a parameter so at the top between the
brackets we're going to create a new parameter let's name it Player
move and now let's save a value into this parameter so inside our scissors
button we're going to call this function and run all this code so let's type play
game and call this function and for the scissors button let's save the string
scissors into Player move to do that we'll type between the brackets here and
type the string scissors so as we learned this will save
scissors into Player move and now we can use Player move just like a variable in
the function now let's modify the code based
on the parameter so here this code calculates the result however this only
works if the player move is scissors so we're going to put this in an if
statement so we'll type if
Player move equals scissors and curly brackets inside this
if statement we're going to put this if statement so let's select this and then
right click cut and then inside
here right click click and paste and select these lines and press
tab so notice that we can put an if statement inside another if statement
and we did this because this code only makes sense if the player move is
scissors and finally let's modify the code that displays the message so here
instead of displaying scissors every time we're going to display whatever is
saved inside Player move so we'll replace it with Dollar open curly
bracket close curly bracket and in between we'll insert Player
move and that's it we modify this function to use a parameter instead of
always using scissors now let's save and click the
scissors button and you'll notice that it works
we displayed the move scissors and we calculated the result
correctly let's press okay and we're going to use this function to reuse the
code for the other buttons so we'll scroll up and for the paper button we're
going to use a different if statement to calculate the result so let's actually
copy this into the function we're going to
rightclick click copy and then inside the
function we're going to create another Branch if the player move is paper so
here let's type else if brackets and curly
brackets inside this condition we're going to check if the
player move is equal to paper this time and then inside these curly brackets
we're going going to paste the if statement we copied earlier so right
click and paste and we can select these lines and
press tab to reformat so now we have the code that
determines the result for paper down here we don't need to modify this code
because we're always displaying whatever is inside Player
move finally we can scroll up to the paper button
and remove all this duplicated code and just use our function play
game and we're going to pass paper inside so now paper will get saved
inside Player move and it's going to run this if statement
instead if we save and click the paper
button in this example I pick paper computer pick Rock and it calculated the
result correctly let's press okay and use this
function for the rock button feel free to pause the video if you want to try it
yourself first so let's scroll up to the Rock
button and first we need to copy this if statement into the function so let's
rightclick copy and then inside the function
let's create a branch for rock else if Player move is equal to
rock and then curly brackets and inside here we're going to rightclick and paste
the if statement we copied earlier and now let's select these lines
and press tab a few times to reformat and again this doesn't need
need to change the last step is to scroll up to
our Rock button and instead of duplicating all of this code we're going
to remove it and just call our function instead play game brackets and then
inside we'll have the string Rock now let's
save and click the rock button so I picked Rock the computer
picked paper and we calculated the result
correctly let's press okay so by using a function with a parameter we were able
to reuse all of the code in our buttons and you can see that it made our code a
lot cleaner so lastly notice that inside a function we can call other functions
let's go through the code step by step so that we understand how how it works
so here when we call the play game function we go inside here and then we
call the pick computer move function so now we're going to go inside this
function and run all the code and then when this function returns we're going
to return back to where we called it and then keep going and run the rest of the
code and then when the play game function finishes it's going to return
back to here so inside a function we can call
other functions now one last thing we're going
to do for this code is we'll scroll down and we're just going to add some
new lines to this if statement to separate the branches and make the code
a little easier to read and
save and let's scroll up and that's the end of this
lesson in this lesson we learned about functions which let us reuse code we
learned how to get a value out of a function using return we learn how to
put values into a function using parameters and we improve the code for
our rock paper scissors project by reusing the code and removing
duplication thanks for watching this course so far
if you want to support this channel you can check out the premium version of my
courses just like this one where you can get a certificate of completion and a
Better Learning platform if you're interested in extra videos from me more
in-depth videos and behind the scenes content you can check out these links
here you can also support the channel by liking the video subscribing and sharing
this video with others thanks again and let's go continue with the
course here are some exercises you can do on your own to practice using
functions in this lesson we're going to learn
another type of value in JavaScript called objects and we're going to use
objects to create a score in our rock paper scissors project first let's
create a new file for this lesson we'll go to our code editor and click this
icon and then click this icon to create a new file and we'll name this file
08- objects.
HTML and press enter next we'll copy all the code in
functions. HTML to objects. HTML so we'll type here and press contrl a or
command a to select the code and then right click
copy and in here right click
and paste now let's hide the files for now
and we'll prepare this file for this lesson so we can change this to objects
and remove all the code in the script element finally let's save and open this
in live server by right clicking open with live
server and let's also open the console on on this page so we'll right click
click inspect and click the
console let's close our previous tabs and also the previous
code and now we're ready to learn objects so what is an object an object
groups multiple values together let's do an example and create our first object
we'll go to the script element and we'll create a variable using const and we'll
name this variable product and make it equal to open curly bracket close curly
bracket and semic it so this is an object inside this object we can add
some values so we'll type enter and then Name colon and then a value like the
string socks and at the end we'll type a
comma and then price colon and another value like the number
1,90 so inside our object we just added two values so at the bottom here let's
try console. logging this object console.log
product and save and it will display both values
into the console so as you can see an object lets
us group multiple values together so for each of these values we have some code
on the left this code is called the property and using the property we can
access specific values in the object for example let's type and enter and
console.log we're going to type the object product and then a DOT and then a
property like name so dot name Will access the value
that is associated with the name property which is the string socks so if
we save it will display the string socks in
the console let's do another example and we'll
access this second value using the property price so we'll type enter
console. log the object product and then a DOT and then a property
price so this will access the value associated with price which is
1,090 if we save that's what gets displayed in the
console now we can also use the property to change a value inside an object to do
that we're going to type the object's name product and then Dot and a property
like name and just make it equal to something else like the string cotton
socks so this code will change change the value associated with the name
property to cotton socks so at the bottom if we type
console.log the product again and
save you'll notice the value associated with the name property was changed to
cotton socks so that's how an object works we
group multiple values together and then we can access or change these values
using the properties on the left now let's learn the syntax rules for objects
to create an object we start with an open curly bracket and end with a closed
curly bracket inside the object we can put multiple
values for each value the code on the left is called the property this is how
we access the value inside the object we separate the property and value with a
colon and this is called a property value pair we can have many property
value pairs in an object and we separate them with a
comma to access a value inside the object we type the object's name and
then Dot and then the property we want to access like name this will give us
the value associated with the name property this syntax is called do
notation if we access a property that doesn't exist the value will be
undefined to change a value in an object we can use the dot notation again so
product. name and just make it equal to something else now using the syntax we
can also add a value to an object we can type a property that doesn't exist for
example here we can type product do new
property and make this equal to something like the Boolean value
true if we console.log the product
again and save it will add this value to the
object along with the new property we can also remove a value from
an object by typing delete and then the object
product Dot and then the property we want to delete like new
property if we console.log the product
again and save this code will delete new property
from the object and lastly notice that then an
object is just another type of value we can save an object inside a variable and
we can also console.log objects if we check the type of this value so type of
product and save and scroll up in the
console it will tell us that product is an object so let's remove
this and Save and now we'll learn why we use objects
so objects make our code more organized instead of creating a bunch of
variables for the products values like the name and the price and other details
we can just group all these related values together into one object objects
also allow us to use multiple values together instead of console. logging
each of these values individually we can just console log the whole object and
display all the values at once so objects let us group multiple
values together and let us use multiple values
together next let's do a practical example with objects we're going to add
a score to our rock paper scissors game so I've actually prepared a project we
can use for this lesson to see this project we're going to go to our website
and then create a new tab and then up here we're going to type
super simple dodev SL projects slobs and press
enter so this is our simplified rock paper scissors game again except in this
project when we play the game it's also going to keep track of a
score so how many times we win lose and tie and also if we click
okay we have a reset score button so if we play the game a few
times and add to our score and then click the reset score
button this will reset the score back to zero so if we play the game again the
score starts from zero again so we're going to learn how to use
objects to create create this feature let's press
okay and first let's create a copy of our project just for this lesson we'll
go to our code editor and click this icon to show our files and we'll make a
copy of the rock paper scissors project from the previous lesson so we'll
rightclick and copy and down here right click and
paste and we we right click and rename this
file we'll remove the copy at the end and at the front we'll change this to 08
and press enter now let's hide these files and we
can close the 07 file for now and let's open this in live server by right
clicking and open with live server let's also open the console on
this page so rightclick
inspect and the console all right now let's go into our
code and add a score to our game so remember when writing JavaScript a good
strategy is to think about what steps we need to do this is called an algorithm
and then convert those steps into code so we already had an algorithm for the
rock paper scissors game let's update this algorithm to include
the score so first the computer randomly selects a move this step will stay the
same number two we're going to compare the moves to get the result this step
will also be the same but now we're going to add an extra step after getting
the result we're going to update a score and finally we'll display the result and
the score in a popup now let's convert these updated steps or this algorithm
into code the first thing we need to change is we added a third step we're
going to save and update a score so first we need somewhere to save our
score so one place we can save it is inside a variable let's go to our script
element and at the top we're going to create a variable for our score using
const score and make it equal to an
object and inside this object we're going to have the property
wins so this will keep track of how many wins that we have we'll type colon and
the number zero because the score starts at zero and then a comma and then
another property losses this will be how many losses we
have and then colon and zero and then another comma and ties colon and zero so
we use an object here because these values are related to each other you
could use separate variables but we're using an object for
convenience another thing you'll notice is that we're creating this variable
outside of a function and outside of a scope and that's because every time we
make a move we need to update the score from last time so in order to save the
score from last time we need to keep it outside the function if the score was
inside the function the function would create a new score every time which is
not what we want so in this situation in order to save a score from last time
we're going to keep this variable outside now every time we play the game
after we calc calate the result we're going to update the score so let's
scroll down to where we calculate the result which is here and then below it
we're going to type some new lines and type the code for updating the
score so we can do that with an if statement so we'll type if brackets and
curly brackets and inside the condition we're going to check if the result is a
win if it is a win we're going to update the winds property
and increase it by one so down here if the
result is equal to the string you win and make sure that this string
matches the string up here inside the curly brackets we're going to update
score. wins and we'll make it equal to itself plus
one so this is how we increase the winds property in the score object by one now
remember from the variables lesson that we have a shortcut for increasing
something by one and that shortcut is plus =
1 next let's add another Branch to this if statement for the other two results
so else if brackets and curly brackets and in the second condition we're going
to check if result is equal to the string you
lose and make sure this string matches the string up here so if the result is
you lose we're going to update score do losses property and increase it by 1 so
plus equal 1 and finally we'll check if the result
is a tie else if brackets and curly brackets
result equals to the string tie and here we'll update
score. ties plus equal 1 so we converted this step in the
algorithm to code the score starts at zero and every time we play the game
after we calculate the result we're going to update the score using this
code now let's convert the last step into code we're going to display the
result and the score in the popup at the end so let's actually go back to the
super simple dodev project and we'll see what the popup
looks like we'll click one of these buttons and in this popup on the second
line we display the score so in our code this is the code that displays that
popup so how do we add a second line to the popup remember that template strings
have another special feature called multi-line strings so we can type at the
end of this template string and press enter to add another line to this Str
so here we can type winds colon and we're going to insert a value using
Dollar open curly bracket Clos curly bracket and here we're going to insert
the number of wins that we have which is score. wins so we'll type score
dowins next we're going to show the number of losses that we have so after
this let's type a comma and losses colon and
insert another value here we'll insert
score. losses and finally we'll type a comma
and we'll display ties colon and inserted value score dot
ties and this will display our score in the popup so let's save this and give it
a try we'll click okay and then go back to our Tab and play the
game so now on the second line we will display the score one small issue here
is that we have a lot of spaces on the second line so these spaces correspond
to the spaces here when we use multi-line strings these Extra Spaces
will show up in the popup so to remove these SP cases we can just remove them
in the code like this now if we save press
okay and play the game it will show our score on the second line without those
Extra Spaces at the front let's press okay we're going to add one more feature
to this project if we go back to Super simple. Dev we have a reset score button
which will reset the score back to zero when we click it let's add this button
in our project so we'll scroll up and inside the
HTML We'll add a button with the code less than button greater than and inside
the button we'll have the text reset score and now when we click this button
we'll run some code using the onclick attribute equals double quotes and then
in here we're going to write some code to reset this score back to
zero so one way we can do it is because this score is an object we can use dot
notation to change everything back to zero so we can type
score. wins and make it equal to zero we'll also type
score. losses and make it equal to Z and finally
score. ties and make it equal to zero now let's
save and go back to our Tab and play the game a few times to get
a score let's press okay and press reset
score and then play the game again and you'll notice that the score started
from zero again so that's how we create the reset score button we just set all
of these properties back to zero and that's it that's how we add a
score feature to our rock paper scissors project using an object to save the
score let's press okay and we're going to learn more
details about objects let's go back to objects.
HTML and what open the tab for this file and let's also comment out the
previous code using slashstar and at the
bottom star slash and
save now let's scroll to the bottom and we'll do some
setup so first let's create a variable with const we'll name it Product 2 and
make it equal to another object inside this object we have the property
Name colon and the string shirt and we're going to console.log
this object so console.log Product 2 and
save so the next detail we're going to learn about objects is another way to
access the values inside we previously learned the
notation to do this for example console.log product
to. name this will access the value
associated with the name property in JavaScript we have another
way of accessing values inside objects which is using square brackets so we'll
create a new line and type console do
log product 2 and this time we'll type square
brackets and then inside the square brackets we'll have a string with
name so this is called bracket notation and this does the same thing as dot
notation up here it gets the value associated with the name property if we
save these two lines of code both access the string shirt which we see here so
when do we use the bracket notation instead of the dot notation bracket
notation lets us use properties that normally don't work with do notation for
example at the bottom we can type console.log Product 2 and then use a DOT
and try to access a property called delivery-time if we
save this property will give us an error and that's because JavaScript thinks
that this Dash is a minus sign and it's trying to do math so in order to use a
property like this we have to use bracket notation so we're going to
replace the dot with square brackets and and turn this into a
string now if we save it no longer gives us an error and
because delivery time does not exist in the object we get the value
undefined so using bracket notation we can also add values to the object when
we create it so here we can add a comma and we'll add another property
using bracket notation and a string delivery-time and a colon and then a
value like the string one day if we
save this lets us add a delivery-time property to this object so as you can
see bracket notation lets us use properties that normally don't work with
DOT notation another feature of bracket
notation is that between the brackets we don't just have to use a string we can
use a variable a calculation or anything that results in a
value so you might be wondering which one should we use do notation or bracket
notation we usually use do notation by default because it's shorter and easier
to read but if we need to use properties that don't work with do notation then we
use bracket not notation now a shortcut here is when we
create the object if we only have a string between the brackets the brackets
are actually optional so we can just type this if we save the code will still
work okay the next detail we're going to learn is that inside an object we can
save any type of value so this includes numbers strings booleans
as well as other objects because remember objects themselves are also
values for example we can type a comma and add a property called
rating colon and then an object open curly bracket close curly bracket and
inside this inner object we can add more properties like stars colon 4.5
this is how many stars a product has and then a comma and a property called count
colon 87 this is how many ratings a product
has so this is called a nested object or an object inside an object we can use
nested objects to make our values more organized so inside the product the
number of stars that has and the number of ratings that it has are both related
to a rating so it makes sense to group them together further inside the
product now to access values inside the inner object we just use the dot
notation or bracket notation multiple times for example at the bottom we can
type console.log product
2 dot rating this will get the value
associated with rating and this is an object so we can use the dot notation
again count so this will get the count inside
the rating object which is this value right here so if we save it will display
87 and finally another type Ty of value we can put in an object is a function so
in this object let's type comma and another property
fun colon and we're going to create a function here so let's type
function and we'll name the function Function One brackets and curly brackets
and then inside the function we're going to have some JavaScript code like usual
so console.log the string
function inside object this saves a function inside the
object and this works because a function is actually just another type of value
in JavaScript but we'll learn more about this feature of functions later in this
course for now just know that functions are also values and we can save them in
an object to access this function we can use the dot or bracket notation as usual
so at the bottom we can type the object Product 2
and then a DOT and then the property fun so this will access the value
associated with the fun property which is a function and because this is a fun
function we can call it as usual using brackets if we
save this will run the function here and it will display function inside object
into the console so when we save functions inside
an object this is called a method and we've actually been using methods this
whole time console.log is actually a method
console is an object provided by JavaScript and log is a function that is
saved inside the console object if we go to the bottom and type
console.log type of console and
save this will confirm that console is just an object and if we change this to
console.log and save this will show us that console.log
is a function so log is a function that is saved inside the console object so we
call this a method another example of a method is math.random which we used in
the rock paper scissors project math is also an object provided by JavaScript
and random is a function saved inside the math object so we call math.random a
method as well so we've actually been using objects and methods all throughout
this course and now we understand all the code that we've been using so far
next we're going to learn about builtin objects so the console object and the
math object are known as builtin objects because they are built in to the
language they provided by the language we're going to learn two more
built-in objects called Json and local storage and we will use these objects to
improve our rock paper scissors project let's start with the Jason built-in
object this object helps us work with something called
Json Json stands for JavaScript object notation the easiest way to understand
Jason is it's BAS basically a syntax it's a similar syntax to a JavaScript
object but it has less features for example the code on the left uses
JavaScript object syntax and the code on the right uses Json syntax so one
difference is that all properties and strings must use double quotes in Json
Jason does not support single quotes another difference is that Json does not
support function functions so as you can see Json is basically a syntax that's
similar to a JavaScript object syntax but with less
features so why would we use Json syntax instead of a JavaScript object
syntax a JavaScript object only makes sense in
JavaScript on the other hand Json syntax can be understood by almost every
programming language so Json syntax is more un
Universal for this reason we use Json when we send data between two computers
that might use different programming languages we'll learn how to do this
later in the course we also use Json when we store data we'll learn how to
store data in this lesson now that we understand what Json
is let's learn about the built in Json object the Json object helps us convert
a JavaScript object to Json for example let's convert our object product two to
Json so we'll create some new lines and we'll type the Json object do
stringify and Open Bracket close bracket so stringify is a method of the Json
object so it's a function that is saved inside this object and we can call this
function using brackets between the brackets we can
give it a JavaScript object we want to convert like Product
2 this will convert the object into Json so now let's
console. log the result and
save and in the console it will display the product using Json syntax if we we
scroll up you'll notice that the function that we saved in the object is
not inside the Json and that's because Json does not support
functions so one thing to note about stringify is that it actually results in
a string so at the front if we type type of and
save it will tell us that the result that it gives is actually a
string so if we remove this and
save now this Json string is ready to be sent to another computer or to be saved
in storage next let's learn how to convert
the other way from a Json back to a JavaScript object to do that we'll use
another method in the built-in Json object called json.parse
at the end we'll type Jon dop
pars and brackets and between the brackets we can
put a Json string that we want to convert so we actually have a Json
string up here so let's just make a copy of this we'll select it
rightclick copy and let's create an extra variable
to make it more clear const Json string and make get equal to right click and
paste and now let's convert this Json string back into an object by putting it
into pars and finally we console.log this
result so console.log and
save and json. pars will turn the Json string back into a JavaScript object so
that's the built-in Json object it helps us convert back and forth between a
JavaScript object and Json now we're going to learn the next
built-in object called local storage local storage is used to save values
more permanently so far we've been saving our values in
variables however variables are temporary they only exist on the current
page if we refresh the page or close the page all the variables are deleted for
example if we go back to our rock paper scissors
project and open the tab for this project and we play a few
games and play it again so we have two games if we refresh the page
notice the score starts from zero again and that's because when we refresh the
page all of these variables are deleted and the score gets reset back to zero
however if we press okay and go to superimple
dodev and we refresh the page and we play the
game notice that the score doesn't start from zero it starts from the previous
score even though we refreshed the page and that's because this project saves
the score in local storage and local storage doesn't get deleted when we
refresh the page now let's learn how to use local
storage in our project let's press okay and we'll go back to our code and we'll
scroll down to where we update the score so here after we update the score
we're going to save it in local storage but first first let's learn how local
storage works so at the bottom here we're going to type the local capital S
Storage object to save a value inside local
storage it has a method called set item so we can type dot set capital I item
and brackets because this is a method or a function saved inside the object
object and we're going to give two strings to this method the first string
is a name this is how we're going to access the value that we save later so
let's use the string message as the name and we'll type a
comma and then we'll type the value that we want to save into local storage so
local storage only supports strings so let's save the string
hello inside local storage if we
save and then go back to our Tab and play the
game it will run all this code and save this string into local storage now let's
learn how to get this string out of local storage we'll press okay and we'll
scroll to the top and when we first load the page
we're going to get that value out of local local storage by typing local
capital S storage. getet item this
time and brackets so the get item method gets a
value out of local storage and we're going to give it one string so this
string is the name that we used earlier which was message so we'll type the
string message now let's console log this
result so console.log and a bracket at the
end and save it will get the value that we saved
earlier out of local storage so we saved the string hello and that's exactly what
gets displayed in the console so using local storage we were
able to get the value that we saved earlier even though we refresh the
page now let's save our score into local storage so it doesn't get reset when we
refresh the page so let's scroll to the bottom and instead of using the name
message we're going to use the name score to save our score and instead of
the string hello we're going to save the score
object now one problem here is that local storage only supports strings so
we need to convert our object into a string and we actually learned how to do
this earlier using json.stringify so at the front we can type
json. stringify and then brackets around the
score and this will convert the JavaScript object score into a Json
string and then it's ready to be saved in local store
so if we save this and then play the game it will run this code and save our
score into local storage now let's press
okay and then's scroll up to the top and now instead of getting the
message we're going to get the score out of local storage if we
save now when we load the page we're able to get the score that we saved from
last time as a Json string the last step is instead of
resetting the score to zero every time we're just going to use the score from
local storage before we do that remember that this is just a string so we need to
convert this back to an object we also learned how to do this
earlier using json. pars so at the front we can type
json. pars and then Open Bracket and at the end a close bracket and it will
convert this back to an object if we save it will convert the score from a
Json string back to an object so now we can use it up here so instead of doing
this we'll remove it and replace it with this code so right click cut
and then here right click and paste and we'll remove
console.log and save so now when we load the page it
will load the score from local storage if we play the
game notice that the score doesn't start from zero it starts from the score that
we had last time let's review what we did step by step first when we update
our score in this code after we update the score we're going to save it in
local storage using local storage. set item now local storage only supports
strings so we have to convert our score object into a Json string using json.
stringify and then after we've saved this into local storage when we load the
page up here we're going to load the score that we just saved from local
storage using local storage. getet item and the score was saved as a Json string
so we need to convert it back into an object using json.parse
so that's how we use the Json object and the local storage object to save our
score more permanently let's press okay
okay and the last feature we're going to add is when we click the reset score
button we also need to remove the score from local storage otherwise if we press
reset score and refresh and then play the game it will
just grab the old score from local storage so reset score doesn't really
work here let's press okay and fix this issue so here in the set score button at
the end we're going to remove the score from local storage so we'll type
local storage and then a method called do
remove item and brackets and between the brackets we're
going to tell local storage which value we want to remove so we're going to
remove the score so we'll type the string score
if we save and we click the reset button and
then we refresh the page and try to play the game
again unfortunately it now gives us an error so what is happening here so
remember that we removed the score from local storage so now when we load the
page this actually doesn't exist when something doesn't exist in local storage
it's going to give us a value called null
and at the bottom if we try to access any property
on null it will give us an error so that's what we see here so how do we
solve this problem if we scroll up one way to solve this problem is that
if there is no score in local storage we're going to give it a default value
let's look at how we can do that so after this line we're going to check if
the score is null we can do that using an if statement if brackets and curly
brackets and we'll check if score is equal to
null and if it is equal to null we're going to give this a default score so
inside the curly brackets we'll just make the score equal
to the default object we had earlier which was
wins zero and then losses zero and
ties zero and remember if we need to reassign
a variable we have to change it from const to let if we
save the score will be null because we removed it earlier and now this will
give it a default score so everything should work as before
if we play the game you'll notice that the score starts
from zero or this default score and everything is working again so that's
how we create the score feature in the rock paper scissors project as well as
the reset score feature next we're going to use some
shortcuts to simplify our code so these shortcuts are things that we learned in
the Boolean lesson so remember that null is a falsy
value that means it will behave just like false so a shortcut we can use here
is instead of checking if the score is equal to null we can also remove this
and check if not score so not score does the same thing
as checking if it's null if the score is null not score will flip it into true so
both of these will return true if the score exists it's an object then both of
these will return false so instead of checking if a value is equal to null we
can just use the not operator as a shortcut now also from the boolean's
lesson we have an even shorter shortcut for doing this so notice here that this
code basically sets a default value if the score doesn't exist in the boolean's
lesson we learned a technique called the default operator which is exactly what
we need here so on this line we can remove the semicolon and type
or and then a default value so we want our default value to be this object so
let's select it and then rightclick copy
and then here right click and paste and I'll select these lines and
press shift tab to remove and indent and I'll add a semicolon back at the
end so the way that the default operator works is that if the left side is truthy
so in this case we have a score it will use the left side if the left side is
falsy or in this case the score is null then we will use the right side as a
default value so this does the same thing as this code below but it's just a
shortcut so now let's comment out this code using
slashstar and at the bottom start slash so we'll leave it here just for
reference and then save and if we click reset score again
and refresh and play the
game it will still work so this is a perfect situation to use the default
operator to simplify our code so let's press
okay and that's all we're going to do for this project in this
lesson now let's move on and learn more details about objects the first thing
we'll learn is the value null so null is one of the falsy values in JavaScript
it's similar to the value undefined they both represent that something doesn't
have a value so what's the difference between null and undefined we use null
when we intentionally want something to be empty for example in the previous
lesson we learned that if a function has parameters we can give the parameter a
default value if the parameter is undefined
it will use the default value however if we set this parameter to null it will
not use the default value and it will just use null so null means we
intentionally want something to be empty in most cases though null and
undefined work the same way okay so the next detail about objects we're going to
learn is called autoboxing let's go back to objects. HT
HML and open the tab for this file and let's also comment out the
previous code so our console doesn't get too messy so
slashstar and at the bottom star slash and
save so let's scroll down we learned in this lesson that
objects can have properties and methods so you might be surprised to learn that
other values also have have properties and methods for example at the bottom
we're going to type console.
log the string hello and then the dot notation and a
property called length so strings can also have
properties the length property tells us how many characters or letters are in
this string so hello has five letters so if we save the length property will be
five here's another example we'll type console.log the string hello and then
the dot notation and a method this time 2 capital u upper Capital C case and
brackets so this string also has a method called two
uppercase and this method gives us a copy of the string with all letters
capitalized or in uppercase if we save it will give us
hello in capital letters so as you can see simple values
like strings can also have properties and
methods so now you might be wondering these are strings not objects how can
strings have properties and methods the answer is that JavaScript has a special
feature called Auto boxing JavaScript automatically wraps this string in a
special object first and this object has the property length and the method to
uppercase so this is done automatically we don't see the special object that's
wrapped around this string so this feature is called
autoboxing because JavaScript automat automatically wraps the string in an
object like a box so autoboxing also works with other
types of values like numbers and booleans the only thing is that
autoboxing does not work with null and undefined it would just give us an
error The Last Detail we're going to learn about objects is a really
important detail and that is objects are references to demonstrate let's create a
new variable with an object so const object one and make it equal to an
object inside this object let's have a property
message colon and the string hello so you might think that when we
create an object like this we create a value that has other values inside and
we save the whole thing and a variable however this actually works a little
differently when we create this object the actual value is created somewhere in
the computer's memory and this variable actually just gets a reference that
points to that location in the computer's memory this is like a
shortcut on your computer a shortcut points to where the actual file or
folder is so there's no way to actually see this reference but just just know
that this is a reference and the object is somewhere else in the computer's
memory so the reason it works this way is to make the language more efficient
for example below this line we can create a variable const and call it
object 2 and make it equal to object one so this code doesn't actually make a
copy of the object it this makes a copy of the reference that points to the
object so this makes a language more efficient because if we had a really big
object here it's not good to copy the entire object over and over again
instead Javas just copies the reference which is much faster this is called copy
by reference now that we learned that
objects are actually references let's learn some interesting behaviors of
references so at the bottom here we're going to change the property message in
this object we can do that by typing the object object
- message property and make it equal to something else like the string good
job and now if we console. log object one
and save notice that we were able to change
the message property even though we created object one with const and that's
because this variable just contains a reference that points to the object so
const prevents us from changing the reference in the variable but it doesn't
prevent us from reaching into the reference and changing the object that
it's pointing to so just be careful when you're working with with objects even
though we use const we can still change the values inside the object another
interesting behavior is that on this line we're not actually copying the
object into this variable we're copying the reference so object two actually has
the same reference as object one they actually point to the same object in the
computer's memory so at the bottom if we type
console do
log object 2 and save you'll notice that for object two the message property was
also changed even though we only changed object one the last interesting behavior
is that we can't compare objects directly for example let's go to the
bottom and we'll create a new object using
const object 3 and we'll make it equal to an object and then inside we're going
to have these same values as object one so we'll have the property
message and the value is the string good job so now let's try comparing object 3
to object one so here we'll type console do
log and check if object 3 is equal to object
one if we save it will tell us that these two
objects are not equal to each other even though they have the same values inside
and that's because remember objects are references so object 3 also contains a
reference and this code compares the references and not the values inside the
object so because object 3 is a different reference than object one
that's why this code results in false if we
did console. log and we check if object 2 is
equal to object 1 object two has the same reference as
object one it points to the the same object in the computer's memory so if we
save this will tell us that these two variables have the same
reference so just remember that when you're comparing two variables that
contain objects you're actually comparing the references not the values
inside if we want to compare the values inside we would do that manually by
checking the message property against this message property so don't worry
object references are a little confusing at first but the more you work with it
the more you just get used to it the last thing we're going to learn
in this lesson are some shortcuts for objects so first let's make a copy of
object 3 we'll select the code and rightclick
copy and then at the bottom we'll scroll down and rightclick
and paste and let's rename this variable to object
4 so now let's say that we want to get the message property out of this object
we can do that by typing object 4.
message and now let's also say that we want to save this in a variable also
called message so at the front we'll type con
message and make it equal to this value so now if the variable name and
the property name are the same we actually have a shortcut for this to use
a shortcut we're going to type const and curly brackets
message and make it equal to object 4 so this shortcut is called
destructuring this will take the message property out of object 4 and save it in
a variable called message so this line of code does the same thing as the code
above so let's comment out this line using double slash and we'll just keep
it for reference so at the bottom if we type
console.log message and Save
it will display good job so the destructuring shortcut took the property
out of the object and saved it in this message
variable next we can use this destructuring shortcut for multiple
properties for example let's add another property to this object using comma and
we'll add a price property colon $7.99 and now we can take the price
property out of this object by typing after message a comma and
price so this will take the price property out of the object and save it
in a variable called price if we
console.log the price and
save it will display $799 so that's the destructuring shortcut
it's an easier way to take properties out of an
object the next shortcut we're going to learn is called the shorthand property
so at the bottom let's create some new lines and let's say we want to create a
new object so we'll type const and let's name this object 5 and we'll make it
equal to an object and inside ins this object let's
say we want to create a message property so we'll type message colon and for the
value let's type the variable message so what this does is that it
takes whatever is inside the message variable and substitutes it into this
code so at the bottom if we console.log object 5 and
save this object will have a property called message and the value is whatever
is inside the message variable which is good job so now we actually have a
shortcut for this code if the property and the variable name are the same we
can actually just type it out once like message so this code does the same thing
as message colon message and this shortcut is called the shorthand
property so if we comment out this line using double
slash and save you can see that this shortcut
creates the same object that we had before the last shortcut we're going to
learn is called the shorthand method so at the end let's create a new property
comma and let's name it method Po in and we'll save a function
in this property so we'll type function and let's name it Function One
brackets and curly brackets and inside this function let's
console.log method and now here at the
bottom let's run this function by typing object 5. method so this will access
this function and we'll run it by typing brackets if we
save this will run the code in the function and display method in the
console so we actually have a shortcut for writing this so at the bottom we can
type method again and just type brackets and curly brackets
console.log string method so this code does the same thing
as the code above so these brackets will create a function just like here so this
function name is actually not needed so if we comment out these lines of
code and save it will still display method in the
console because this is a shortcut for these lines of code so this shortcut is
called the shorthand method syntax and that's the end of this lesson
in this lesson we learned another type of value called objects objects group
related values together we added a score to our rock paper scissors game we
learned about built-in objects and used the Json and local storage objects to
save our our score more permanently we learned more details about objects like
null autoboxing and references and we learned some useful shortcuts like
destructuring shorthand properties and shorthand methods here are some
exercises to help you practice working with objects
in this lesson we're going to learn one of the most important features of
JavaScript called the document object model or the Dom and we're going to use
the Dom to improve our rock paper scissors project so first we'll create a
new file for this lesson let's go to our code editor and click this icon to show
our files and then click this icon to create a new file and we'll name this
file 09 dd.
HTML and press enter next let's copy objects. HTML into
dom. HTML so we'll click here to open the
file file and then click inside and then type contrl A or command a to select the
code and then rightclick
copy and in here right click and
paste now let's hide these files and we'll prepare this file for this lesson
so let's scroll to the top and we'll change the title to
Dom and let's delete all the JavaScript code from the previous
lesson now let's save this file and we'll open it in the browser by right
clicking open with live server and let's also open the console
on this page we'll right click click inspect and then click the console
and now we can close the previous tabs as well as the previous code for
now and for this lesson we're going to do an extra step in the setup inside the
body we're going to create a button so here let's type the code less
than button greater than and inside the button we'll have the text
hello now let's save and we should have a button on the
page and now we're ready to learn the document object model or the Dom in the
previous lesson we learned about objects which group multiple values together we
also learned about builtin objects which are objects that are provided by
JavaScript some examples of built-in objects are console math Json and local
storage the Dom is another builtin object called the document object so
let's go to our script element and we're going to type
document so this is a built-in object provided by JavaScript and we've
actually seen this document object before in the first lesson one of the
first pieces of code that we learned was document dot body do inner Capital
HTML equals the string hello and semicolon so this code removes
everything on the page and replaces it with the text hello if we
save it will remove the button and just put
hello and now that we learned objects in the previous lesson we can fully
understand this syntax document here is a built-in
object and this is the dot notation this means we're accessing a property of the
document object called body now body is also an object so we can use the dot
notation again to access a property of the body object called inner
HTML and finally we use an equal sign to change the inner HTML property to the
string hello but as you can see there's
something very special about the inner HTML property when we change this
property it also changes the web page so this document object and the web page
are linked together let's do another example we'll go to the end here and
press enter and we'll type the document object again
and we'll use the dot notation again and this time let's access the property
title and we'll change the title property using an equal sign and we'll
change it to the string good job if we
save changing the title property we'll also change the title at the top of the
tabs here so now this says good job again as you can see the document object
is linked to the web page so from these examples it shows us that the document
object represents or models the web page and that's why we call this feature the
document object model or the Dom now that we know what the Dom means
let's learn the syntax rules for the Dom so the Dom is just this built in
document object and this object works the same way as any other object it
contains properties like body and title that we can access using the dot
notation now the special thing about the document object is that it is linked to
the web page that means if we change certain properties in this object it
will also change the web page now in addition to properties the
document object also has methods we can use and we'll learn about them later in
this lesson now that we understand the syntax
of the document object let's learn about the properties and methods we can use
first let's comment out this previous code using
slashstar star slash and we'll create some new lines at the
top so the first property will we're going to learn is called
document.title so this property will give us the title
at the top of the tabs here so if we console.log this property
console.log and save this will give us the text at the
top which is Dom and that's what gets displayed in the
console if we change the doc do. tile property it will change the text at the
top of the tab so here if we type document.title and make it equal to the
string changed and
save now the title at the top of the tab will be
changed so as you can see the title property is linked to the title at the
top of the tab we can use it to get the title and we
can also use it to change the title next we're going to learn another
property called document.body so let's go into our
code and let's type document.body now document.body is a
very special property so this will literally get this body HTML element
element and put it inside our JavaScript so let's actually console.log
this to see how it works console.log Open
Bracket and then close bracket and save and inside the console it will tell
us that document.body is the body HTML element
and if I hover over this it will tell us that it is a exactly the body on our
page if I expand this you can see that this code is exactly the code that we
have here and this shows us one of the most important features of JavaScript we
can have HTML elements inside JavaScript the document object or the
Dom combines JavaScript and HTML together and it gives JavaScript control
of the web page okay so now that we have an HTML element
inside our JavaScript what can we do with it a really important thing to know
is that when an HTML element is inside a JavaScript like this the HTML element is
converted into a JavaScript object so for example if we do
console. log type of document do
body and save it will tell us that the body HTML
element is just an object when it's inside
JavaScript so just like any other object this has properties and methods we can
use so one useful property of the body element is inner HTML which we saw
earlier so down here let's type document dot body dot inner Capital
HTML so the inner HTML property controls all the HTML inside the body that's why
it's called inner HTML so if we access this property it
will give us all the HTML inside the body so let's console.log to
confirm console.log and
save and inner HTML will give us all of this HTML inside the body
element and if we change the inner HTML property it will change the HTML inside
the body element so let's create a new line and we'll type document
dot body do inner Capital
HTML and we'll change it to the string changed so this will replace all of the
HTML inside the body with a text changed if we
save that's exactly what it does and we can actually confirm this by going into
the elements tab so this tab is for HTML and CSS we can find the body element
expand it and you can see all of the HTML that we had before was replaced
with changed and don't worry about this part
this part is just added by live server after so this shows that inner HTML
gives us control of all the HTML inside the body we can get this h HTML and we
can also change this HTML now another feature of inner HTML
is that we can replace this HTML with new HTML code not just text so for
example instead of just text we can replace it with the code less than
button greater than and also less than slash button greater than so so this is
HTML code for creating a button and inside the button let's put the text
good job and now this code will replace all
the HTML inside the body with this new HTML if we
save it removes all the previous HTML and this new HTML creates this button so
using this inner HTML property JavaScript can replace the HTML inside
the body to whatever we want we have full control of the web
page all right now we're going to learn a method of the document object that we
can use as a reminder a method is a function that is saved inside an
object so we're going to learn a very important method called document. query
selector we just learned that document.body lets us get the body
element and put it inside our JavaScript document. query selector lets
us get any element from the page and put it inside our JavaScript let's give it a
try so first we'll comment out the previous code using
slashstar and star slash let's create some new lines at the
top and let's type
document. query capital S selector and
brackets so document. query selector lets us get any element from the page
and put it inside our JavaScript between these brackets we're
going to put a string this string tells JavaScript which HTML element to get
from the page so if we type
button this will get the first button element from the page and put it inside
our JavaScript so let's console.log this to
confirm console.
log close bracket and save and let's go back to our
console now it will tell us that document. query selector got this button
element and put it inside our JavaScript which you can see in the console and if
I hover over this button element it will tell us that it is exactly the button on
the page so that's what document. query selector does it can get any element
from the page and put it inside our JavaScript this string tells it which
element to get if we type button it will get the first button element from from
the page if we type body this will now get the first body
element from the page so it will do the same thing as
document.body but for now let's just change this back to Button as an example
and save so remember when an HTML element is
inside JavaScript it's just a JavaScript object so this button element
is also just an object and it has properties and methods we can
use every HTML element actually has a property called inner
HTML which lets us control the HTML inside the element so for this button
element let's type at the end dot inner HTML and this will give us the HTML
inside the button if we save it will give us
hello and again if we change the inner HTML property it will change the HTML
inside the button so let's make a copy of this code we'll select it and
rightclick copy and down
here right click and paste and let's change the inner HTML
property using an equal sign and the string
changed so this will only change the HTML inside the button which is here to
changed if we save you can see that the text inside
the button is now changed a little syntax shortcut I'm going to show you is
that for the dot notation we can actually put it on multiple lines so we
can type document. query selector and then put doin HTML on a separate line to
make it easier to read and make sure to put a tab at the front so that we know
it's a continuation of the previous line okay so using document. query
selector we can get any element from the page put it inside our JavaScript and
then we can control the h HML inside that element and this allows us to only
change the parts of the page that we need next what if we have two buttons on
the page so let's go up here and we'll create another button using less than
button greater than and we'll have the text
second button and
Save so now we have two buttons on the page but document. query selector will
only get the first button on the page how do we get this second button the
solution is that we're going to add an attribute to this button called the
class attribute so in the opening tag we're going to type space class equals
double quotes So the class attribute sort of adds a label to this button so
inside the double quotes we're going to label this button a JS dash
button and now that we labeled this button we can select it using document.
query selector so at the bottom here we'll
type document. query selector again and
brackets and we'll type A String inside and this time we're going to start with
a DOT when we start with a DOT this means that it's going to look for a
class rather than an element name so we're going to look for the class
js- button and now document. query selector
will select an element with the class JS button which is this element here so
let's confirm this by console. logging this
code and save and now you will see that this code
gives us the second button on the page so using a class attribute and then
starting with a dot in query selector we can get any specific element from the
page and put it in our JavaScript by the way when we start with
a DOT this is called called a class selector and this is also used in CSS to
style elements with a specific class in fact anything we use in CSS can also be
used in this string and also a common practice is to
start the class with js- to make it clear that this class is
being used in JavaScript and again HTML elements are
JavaScript objects so this second button is also just an object and remember
objects are values and we can save them inside a variable so instead of
console.log let's create a variable using const and we'll name the variable
button capital E element we usually end the variable name
with element or LM to make it clear clear there's an HTML element inside
this variable and finally we'll type an equal
sign to save this element and we can remove this extra
bracket and now if we console.log this variable
console.log button
element and save it will tell us that the second
button was saved saved inside this variable so using the Dom we can get
HTML elements from the page put it inside a JavaScript and then save it in
a variable so the Dom combines JavaScript and HTML together it gives
JavaScript full control of the web page all right now that we learned how
to use the Dom let's do some practical examples so I've actually prepared some
projects that we can do for this lesson to open these projects we'll go to our
browser and create a new tab at the top and here we'll type
super simple. SL projects
slod and press enter on this page we'll be working on
three projects the YouTube subscribe button the rock paper scissors project
we've been working on for the last few lessons and this Amazon shipping
calculator and you'll notice that these projects modify the web page so we're
going to be using the Dom to create these projects and in the next lesson
we're going to use CSS to style these projects and make them look nice and you
can preview that by clicking here so using CSS we can make the sub
subscribe button look like the actual subscribe button on YouTube and if we
click this link to see the rock paper scissors game you'll see that we'll make
it look really nice with these icons but for this lesson we're only going to
focus on the functionality and not the styling so let's go back to the projects
we'll click back and click back again until we're at projects sdom
and we're going to create the functionality for these projects first
so before we start let's create a new file just for these projects we'll go to
our code editor and click this icon and then click this icon to create a new
file let's name this file 09 dd-
projects. HTML and press enter now let's copy dom. HTML into this
file so we'll open it and then click in here and type control a or command a to
select the code and then rightclick
copy and in here right click and
paste now let's close our files and we'll prepare this file
so let's scroll up and we'll change the title to Dom
projects and let's remove our HTML but keep the script
element and we'll also remove the JavaScript from
before finally let's save this file and we'll open it in the browser by right
clicking open with live server and let's also open the console just in
case rightclick click inspect and then click the
console all right we're ready to start with the projects let's go back to super
simple dodev and we'll start by creating the
YouTube subscribe button let's actually press refresh to get it back to normal
and when we click this button it will change to subscribe
first let's create the HTML elements for this project we'll go to the body we'll
create some new lines and let's create the paragraph
first we'll type less than P greater than and inside the paragraph we'll have
the text YouTube
subscribe button and now let's create the button
so on the next line we'll type less than button greater
than and inside the button subscribe now let's save and go back to
our Tab and now we have the HTML elements
that we need so now let's make this interactive with JavaScript and remember
we have a process for this first we'll figure out what steps we need to do this
is called an algorithm and then we'll convert these steps into code so the
steps that we need here are when we click this button if the text is
subscribe we'll change it to subscribed otherwise we'll change it
back now let's convert these steps into code let's go to our button element and
we're going to add an onclick attribute we'll type space on click equals double
quotes and inside here we'll write some JavaScript so first we need to get the
text inside the button and we learned how to do this earlier we can use
document. Query selector to put this button into our JavaScript and then use
inner HTML to get this HTML inside the button so in our code let's type
document. query selector brackets and a string and as we
learned we're going to use a class attribute to select this specific button
so in the opening tag let's add a class attribute and let's make the class
js- subscribe Dash
button and then inside document. query selector we're going to type a DOT to
select a class and we're going to select the class
js- subscribe Das
button and now let's console.log this to confirm that we got this button so at
the front console.log and
save and now let's click our button and it will show us that
document. query selector got the button on the page so now let's save this
button in a variable so we can use it later instead of
console.log let's type const to create a variable and we'll name it
button element and make it equal to this
result so now that we have the button inside our JavaScript we're going to
check if the text inside the button is subscribe to check the text we can use
an if statement so at the bottom here we're going to type if brackets and
curly brackets and inside this condition let's
get the text inside the button so we'll type button
element do inner Capital HTML and we're going to check if it's
equal to subscribe so we'll type triple equal the string
subscribe now if it is equal to subscribe inside the curly brackets
we're going to change the text in the button to
subscribed so let's type the code button
element do inner Capital HTM L and we'll change it with an equal sign to the
string subscribed and the last step is
otherwise we'll change it back so we'll add an else to this if
statement else and curly brackets and inside we're going to change the text
back to subscribe so let's type
button element. inner Capital
HTML and make it equal to the string subscribe and
save now before you try out this project make sure that the text inside the
button has no spaces or new lines around it and it looks like this and I'll show
you why in a second let's go to our project and try it out so when we click
this button it will change to the text subscribed if we click it again it will
go back to the original text so that's how we create the Subscribe button
project using the Dom so now let's go back into our code and I'll show you why
if we add new lines and some spaces around this
text there's actually going to be some problems so if we save this
code and then go back to our project and click the button again you'll notice
that it no longer changes the text and that's because now we have a bunch of
spaces around this text and these spaces will show up in inner
HTML and now inner HTML will not equal exactly
subscribe so how do we solve this problem when there are spaces around our
text to solve this we're going to use a different property of an HTML element so
instead of the inner HTML property we're going to use the property inner capital
T text so inner text will give us the text
inside this element but without all the spaces around it
so now this will equal exactly subscribe if we save and go back to our
project and click it again it'll start working again so that's the inner text
property of an HTML element it gets us the text without the extra
spaces so before we move on to the second project I'm going to show you how
to make our code cleaner right now we're mixing a HTML
and JavaScript together so to make our code cleaner and easier to read we're
going to separate the JavaScript code and to do that we're going to put this
code in a function instead so inside the script
element let's create a function using function and we'll name the function
subcribe brackets and curly brackets and inside these curly brackets we're
going to move all of this code so let's select this
code and we'll right click
cut and in here right click and paste and if we need to fix the
formatting we can select these lines and press tab a few times and now that we
have this function we're going to go to the onclick attribute and and we're
going to call this function so we'll type the function name
subscribe and brackets so this will run all the code
inside the function so it will do the same thing as before except now our code
is cleaner because we grouped all the JavaScript code at the bottom and we're
no longer mixing as much HTML and JavaScript
together now let's move on to the second project we'll go back to superimple
dodev and we're going to work on the rock paper scissors project so let's
click this link and it will show us the next
version of this project so you notice a few changes here the first change is
that we're going to show the score on the page instead of in a popup and the
second change is that when we click one of these buttons to play the game it
will show us the result and the moves that we picked on the page rather than
in a popup let's create a new file for this
rock paper scissors game for this lesson so let's go to our code
editor and we'll click this icon and click this icon to create a new file and
we'll name this 09- rock Das paper Das
scissors. HTML and press
enter and let's copy the previous rock paper scissors which is here we'll click
here and type control a or command a right click
copy and here right click and paste and let's hide our
files and let's save this F file and we can also close 08 rock paper scissors
and finally we'll open this in the browser by right clicking open with live
server now we're ready to begin the second project so let's go back to the
project at super simple Dev and we're going to start by putting the score on
the page so to do this we're going to need somewhere to put the score so let's
create an HTML element for this we'll scroll up to our
HTML which is here and after the scissors button let's
add a paragraph element where we're going to put our score so less than P
greater than and let's add a class attribute so
we can select this element in our JavaScript so in the opening tag we'll
type space class equals double quotes js-
score now that we have a class let's get this element in our
JavaScript so let's just do it down here so we'll type
document. query
selector brackets and a string and then we're going to type a Dot and we're
going to select the class js- score so js-
score so this will get the paragraph element from above and put it inside our
JavaScript and now let's put the score inside the element to do that we can use
inner HTML dot inner Capital
HTML and we'll make it equal to the score if we scroll
down we actually create the score down here so we can actually just copy this
string so we'll select it rightclick
copy and let's scroll up to here and I'll actually put this on
a separate line to make it easier to read and now here we're going to type a
string using back ticks and inside the string we're going
to rightclick and paste so this will put the score that we
used to have in our popup inside this element so inside this
paragraph if we save and then go back to our
tab you can see that now it displays the score on the page now before we move on
I want want to point something out with HTML so remember that our reset score
button was beside our other buttons and now it's below them so what determines
if an element appears beside something or below something so the paragraph
element Here is known as a block element a block element will always take up an
entire line by itself so this line already has some buttons so the
paragraph will take up the entire line under the buttons that's why this text
appears under the buttons and not beside them and also because a block element
like this paragraph takes up this entire line the next button has to appear below
it so that's why we get this layout here so this is just a short review of
layouts if you want to learn this in more detail you can check out my HTML
and CSS full course in the video description all right the next feature
we're going to do is if we play the game we also want to update the score right
now if we play it doesn't update it on the page let's fix this in our
JavaScript so let's go down to where we update the score so we'll scroll
down which is right here we update the score and save it in local storage and
after we do this we're also going to update the score on the page so we can
actually use the same code that we used above which is here so let's make a copy
of this code rightclick
copy and down here right click and
paste and I'll add a tab at the front if we save and then try out our game we'll
click a move press okay and now you'll notice the score
also updates on the page so let's go back into our code and do some cleanup
so you notice that this code is the same as the code we had above and this is a
great situation to use a function to reuse this code so at the bottom here
let's create a function using function and we'll call it
update score
element brackets and curly brackets and we'll move this code into
the function so we'll select it right click
copy and in here right click and paste and now instead of writing this
code multiple times we're just going to call the function
update score element and brackets this will run all the code
inside the function so it does the same thing as before except we can reuse the
code so let's scroll back up and instead of typing out all this
code again we can just use our function
update score element
and brackets now let's
save it will display the score on the page at the start and when we click a
move and click okay it will update the score on the page so the last feature
we're going to do in relation to the score is when we click the reset score
button we also want to update the score on the
page right now if we click it it doesn't actually update it
so let's go into our code and let's go to the reset button which is here and
after we reset the score we're going to call that function again
update score element and
brackets if we save and now let's play the game and
press okay so we have a score and if we click reset score it will reset
everything back to zero so now we finished the score let's go back to
super simple Dev and play the
game and now we're going to work on this section we're going to show the result
and the moves that we picked on the page so first let's create some paragraphs
for these as well we'll go to our HTML and above the score
let's add a less than P greater than this is going to be the result so let's
give it a class of js-
result and let's create another paragraph less than P greater than and
we'll give this one a class equals js- moves
now let's use the Dom to put the result and the moves in these paragraphs feel
free to pause the video if you want to try it yourself first so let's scroll
down to where we display the result which is here so we display it in
a popup and instead of a popup we're going to get the paragraph and put this
result inside the paragraph so we'll type
document. query selector brackets and a string and we'll
type a DOT and select the class js-
result and then dot inner Capital HTML and we'll change this to
result and now let's also display the moves so we'll type some new lines and
document. query selector again brackets and a string dot
js- moves do inner Capital
HTML and make it equal to this text right here so let's type a template
string because we're going to insert our Moves In inside the string and we'll
Type U and we'll insert the player move
dollar curly brackets Player move and then a dash and
then the computers move so dollar curly brackets again and
computer move computer at the end so now that
we're displaying everything on the page we don't need this popup at the end so
we can actually delete this popup all right now let's
save and go back to our Tab and play our
game now it will show the result and the moves that we picked on the page instead
of in a popup let's play it again to make sure it works and finally when we
click reset score it it will reset everything back to zero and that's it
now we're displaying everything on the web page using the
Dom now let's move on to the third and final project we'll go back to Super
simple. deev and we'll click back to go back to
our projects and we're going to create this third project here which is an
Amazon shipping calculator the way this works is is that
inside this text box we're going to type the cost of an order in dollars if the
order is under $4 for example
$25 and we click calculate it will add $10 of shipping
and display the total down here but if we type a cost that is over
$40 like 50 and press calculate it will be free shipping so so
it will display the same total down here so let's learn how to create this using
the Dom let's go back to our 09 Dom projects
file and we'll start by creating the HTML
elements so under our subscribe button let's create this paragraph using
less than P greater than Amazon shipping
calculator and next let's create this text box so the HTML element for a text
box is called input so we'll type less than input greater than so the input
element is special because it doesn't require a closing tag this is called a
void element and lastly let's create the
button so here we create less than button greater than
calculate now let's save and open the tab for this file
which is right here and we have the text the text box and the button that we need
now one other thing we're going to add is that in the final project if we don't
have anything in the text box we're going to have this gray text so this is
called a placeholder to add a placeholder to a text box we're going to
use the placeholder attribute so inside our input element we're going to type
Space Place holder equals double quotes and inside
the quotes we'll put the text we want as the placeholder which is cost of
order and save now if we go back to our project we
now have a placeholder in our text box that disappears when we start
typing so that's all the HTML that we need now let's work on the JavaScript
and again we'll figure out what steps we need to do so when we click this button
we're going to get the text inside the text box if the amount is below $40
we'll add $10 of shipping and then we'll display the total on the page let's
convert these steps into code so we'll go to our button and add and onclick
attribute and inside here let's also create a function to separate our
JavaScript code like we did before so in the script we're going to create a
function function and let's name it
calculate total brackets and curly brackets and inside on click we're just
going to call the function so calculate
total brackets the next step is to get the
text inside the text box so first let's get this input element and put it inside
our job JavaScript to do that we can use document. Query selector again so we'll
add a class to this input so we can select it class equals
js- cost-
input and then inside our JavaScript we'll use
document. Query
selector brackets and a string and a Dot and this class
js- cost-
input so this code will get the input element and put it inside our JavaScript
let's confirm by console. logging the
result and save and now when we click the calculate
button it will give us the input element from the page let's
save this input element in a variable so we can use it later instead of
console.log we'll use const and we'll name the variable
input element and make it equal to this element and remove the extra
bracket and next we need to get the text inside the input element so so far in
this lesson we've been using the property inner HTML to do this however
for input elements you notice that there is no HTML inside so for input elements
we're going to use a different property called
value so at the bottom here we're going to type
input element.
value this is how we get the text inside a text box
so let's console.log this to confirm that it works so we
console do log and
save and now let's type something in the text box like 50 and click
calculate and input. value will give us the text inside the text
box let's save this text in a variable so so we can use it later con and we'll
name the variable cost and make it equal to the text in the text
box the next step is to check if this cost is under
$40 if it is We'll add $10 so down here let's type if brackets
and curly brackets and inside the condition we'll
check if cost is less than 40 and if it is inside the curly
brackets we'll do cost equals itself plus $10 of shipping and remember when
we change a variable we have to switch from const to
let and finally we're going to display the total cost on the page so let's
create a paragraph where we can display the cost so down here we'll create a
paragraph less than P greater than let's give it a class
js- total Das cost and now inside our JavaScript let's use
document. Query selector brackets and string and we'll Type A Dot and the
class js- total Das cost and we're going to
put the cost inside the paragraph we can use dot inner Capital
HTML and make it equal and let's use a template string so back ticks and we'll
have a dollar and we're going to insert the cost using dollar and curly brackets
cost now let's save and try out this project so first we'll type a cost that
is over $40 like 50 if we press
calculate we're not going to add $10 of shipping and we'll display the same
total on the page now let's try a number under
$40 like 25 and press calculate and this number doesn't look right it's
saying that we have to pay $2,510 so what's going on here let's go
into our code and let's use console.log to figure out what's wrong so first
let's console.log the cost to make sure that we're getting the right number from
the text box so down here console.log the cost
and save and then let's Type 25 again and press
calculate and it will give us 25 so we're getting the correct text from the
text box now let's console.log down here to see if the math is working so we'll
type console.
log cost and
save and let's try 25 again and calculate
and down here when we add 10 this is where things go wrong and it results in
20510 so it's not doing math properly here so let's check if cost is a number
to make sure that it's doing math so here we'll type
console.log the type of cost and Save
let's Type 25 again and calculate and aha it's telling us that the cost is a
string so this is actually not a number it is a string that's why it's not doing
math so remember from the strings lesson when we add a string with a number
JavaScript will automatically convert this number into a string and combine
them together that's that's why it just combines 25 and 10 here this is called
type coercion so whenever we get a value from
the Dom like this the value will be a string so in order to do math we have to
manually convert this string into a number to do that JavaScript has a
builtin function called number so before this code we're going to type capital n
number Open Bracket and close bracket so the number function takes whatever's
between the brackets and manually converts it into a number so now if we
save and we Type 25 and press calculate the cost is now a number and
it will do the math properly and give us 35 so remember whenever we get a value
from the Dom the value will be a string so if we want to do math with it we have
to manually convert this value into a number first so now let's remove the
console. logs that we used to figure out this
problem and save okay we're going to add one more
feature to this project let's go back to superimple
dodev and inside the text box we're going to Type 25 and press
enter so pressing enter will also calculate the total and display it on
the page so let's learn how to create this feature so if we go back to our
code so far in this course we've been using the attribute
onclick which runs some JavaScript when we click an element HTML has another
attribute we can use called on key down which runs JavaScript when we press a
key down on our keyboard so inside the input this time let's add the attribute
on key down equals double quotes and then inside here
console. log and the string typing so now every time we type in the
input it will console.log this message let's save it and give it a try we'll go
to the tab for this file and then inside the text box we'll type some numbers and
you can see that every time we type something it will run this code and
display this message so that's how we do something
when we type in an element so clicks and key Downs are known known as events on
click and on key down are known as event listeners they check for events and runs
JavaScript when those events happen now in addition to clicks and key Downs
there are many other events we can listen for in
JavaScript okay so now let's figure out what steps we need to do for this
project when we press a key down in the text box we're going to check if the key
is the enter key if it is we'll do the same thing as the calculate
button so how do we know what key we pressed inside on key down we're
actually given a special object called event so instead of this string let's
remove it and we'll console.log
event so this is an object that's provided to us by JavaScript and it
contains information about the event every event listener including onclick
also gets an event object if we
save and type in this text box it will show us that event is this
object and inside the object it has a bunch of information including the key
that we typed so here let's use the event object and we'll get dot key and
save so now inside this text box if we type something it will tell us the key
that we pressed and if we press enter it will tell us that the key is
enter so the next step is to check if the key is enter and we can do that
using an if statement so in our code we'll type a new line
if brackets and curly brackets and inside the condition we'll check if
event. key is equal to the string enter if it is equal to enter we're
going to do the same thing as the calculate button so we can actually just
use this function again inside the curly brackets we'll type calculate
total and brackets and
save so now let's go back to our project and type 25 enter and it will calculate
the total and display it on the page so that's how we create this keyboard
feature of this project lastly let's clean up our code and move this into a
function like the rest of our code so inside the script
element let's create a new function using
function and we'll name it handle cost key down brackets and curly
brackets and let's move this code into the function we'll select it
rightclick cut and in here right click and paste
if we need to fix the formatting we can select these lines and press Tab and
let's remove this console.log and now up here we're going
to call this function
handle cost key down and brackets now the last thing we have to
do is that event does not exist inside this function so we have to put the
event object into the function and remember to put a value into a
function we can use a parameter so between these brackets we
can create a parameter called event and now to save something inside this
parameter we're going to go up to these brackets and type
event this will take the event object and put it inside the function where we
can use it just like a variable so now if we
save and try out the project 25 enter so this still works and now we finished all
three projects in this lesson so in the rest of this lesson we're going to learn
some more details about JavaScript in the last project we
learned how to manually convert a string into a number using the number function
we can also convert the other way from a number to a string so let's go to the
top of the script element and we can type capital S string
and brackets so the built-in string function will convert a value into a
string between the brackets we can put a number like 25 and this will convert the
number into the string 25 the next detail we're going to learn
is a special behavior of strings So Below this line we can type
console do log the string 25 minus
5 so if a string only contains a number and we subtract multiply or divide
JavaScript will automatically convert the string into a number so this gets
converted into the number 25 minus 5 and if we save it will do math and give us
20 so this is another example of type coercion or automatic type
conversion however it's not recommended to do math with strings like this
because adding Works differently for example on a new line let's type
console.log the string 25 + 5 and
save this will convert the number into a string and combine them together into
255 so because adding strings Works differently the best practice is always
do math using numbers don't do math using strings if we need to we can
manually convert the string into a number using the number function like we
did here the last thing we're going to learn in this lesson is another built-in
object called the window object so in this lesson we learned about the
document object the document object represents the web page the window
object represents the browser so let's go into our script element and Try It
Out Below this we'll Type window so so this is the window object
and it represents the browser because it represents the browser everything inside
the browser is inside the window object so let's think what's inside the browser
well the web page is inside the browser so the document object is inside the
window object if we type window.
document this will give us the same document object that we've been using in
this lesson so what else is part of the browser well the console is also part of
the browser so here if we type window.
console this will give us the same console object we've been using in this
course so we can actually do console.log and the string window
and save and this will do the same thing as
console.log what else is part of the browser well popups are also part of the
browser so if we type window.
alert this will give us the same alert function that we've been using in this
course to create popups however you might have noticed
that we never Type window window. doent or window.
console.log and that's because the window object has a shortcut we don't
have to type window dot at the front we can just type document or console and
JavaScript will automatically add window dot at the front for us so window is a
built-in object that represents the browser we don't have to type out window
dot ourselves because JavaScript adds it for us automatically but it's still nice
to know how this works behind the scenes and that's the end of this lesson in
this lesson we learned about the document object model or the Dom which
allows JavaScript to fully control the web page we learned how to use document.
Query selector to get elements from the web page and put them inside our
JavaScript we learned how to use inner HTML to modify the HTML inside an
element we worked on three projects using the Dom we learned how to make
elements interactive with the keyboard using on key down and we learned some
more details about strings as well as the window object which represents the
browser here are some exercises you can do on your own to practice using the Dom
in this lesson we're going to add CSS to all of our projects and we're going to
finish our rock paper scissors project CSS is a different language that changes
the appearance of our website it's one of the three languages that we use to
create websites so first let's look at the projects we're going to work on in
this lesson we'll go to our browser and create a new tab at the
top and here we're going to type super simple
dodev SL projects slash Dom Das
with- CSS and press
enter so these are the same three projects we created in the previous
lesson except this time we're going to add CSS to make these projects look nice
let's start by creating a copy of the Project's HTML file from the previous
lesson we'll go to our code editor and click this icon to show our
files and then here we're going to select
09-- projects we're going to right click
copy and down here right click and paste and let's rename this file by
right- clicking
rename at the end we're going to remove copy and at the beginning
we're going to change it to 10 and press enter now let's hide our
files and we're going to open 10 Dom projects in the browser by
right-clicking open with live server now we can close our previous
tabs as well as the previous code from lesson 9 which is this file and these
two and now we're ready to add CSS to our
projects we'll start with the YouTube subscribe button let's go to the tab for
our project and we're going to style this
button first so we reviewed CSS in lesson 4 and one of the ways we can
write CSS code is using the style element so inside the head section we're
going to create an element using less than style greater than so the style
element lets us write CSS code inside so inside here we're going to write
button open curly bracket close curly bracket so the code in front of the
brackets is called the CSS selector this tells the computer which elements we
want to style or change the appearance so button will style all button elements
on the page but in this situation we only want to style the Subscribe button
because the calculate button will be styled differently so to style a
specific element we can use the class attribute so if we look at our button
currently it already has a class of JS subscribe button but this class is being
used by our JavaScript a good practice is to add a different class that will be
used by CSS so an element can have multiple
classes we just separate them with a space so inside this class attribute
we're going to type space and add another class
subscribe dash button now this element has two classes
and we're going to use this second class in our
CSS so to style a specific class we're going to remove button and we're going
to type a DOT so starting with a DOT means we're going to style a class
rather than an element name so we'll style the class
subscribe Das button which is this button right here
and now inside these curly brackets we're going to tell the computer how to
style this button for example border colon none and
semicolon if we save this will remove the border from
the button so it no longer has a border like this button so that's how we style
a specific element with CSS we add a class to the element and then inside CSS
we start with a DOT and the class and between the curly brackets the code on
the left is called the property this tells a computer what we want to
change on the right is called the value this tells a computer what we want to
change the property to we separate the property and value with a colon and we
end the whole thing with a semicolon so this is also called a property value
pair as a reminder this is just a review of CSS if you want to learn CSS in more
detail you can check out my HTML and and CSS full course in the video
description so we just added one style to this button we're going to add more
Styles so that it looks like our final design to make this easier I'm going to
rearrange my windows and I'm going to put the final design at the bottom and
then our project at the top this will make it easier to compare
the two designs next to make it look like the
final design we're we're going to style our element one by one let's go back to
our code and press enter and next let's
change the background color to Black to do that we'll type
background Das color colon black and semicolon and
save now our button has a black background let's keep going one by one
we change the text color to white next so in our code we'll type color colon
white and semicolon and save now if you're wondering how I know
all these properties you can usually find them by searching in Google just
make sure you search for what you are trying to
do let's keep going one by one the next thing we'll change is we're going to add
spacing on the inside of the button in CSS space on the inside of an element is
called padding so we'll create a new line and we'll use the property
padding Das toop colon 10px and
save so this will add space on the inside of the element called the padding
at the top of 10 PX so the PX here means pixels a pixel is a
unit of measurement in computers your screen is made up of many small little
squares each of these squares is called a pixel so a pixel is the smallest thing
that you can have on your screen screen sizes are measured in pixels images and
video sizes are also measured in pixels and don't worry the more you work with
pixels the more you'll get used to how big a pixel is so in this example 10
pixels is equal to this amount of space and it looks pretty close to the final
design so let's keep going we'll add space on the inside of the element at
the bottom this time so we'll create a new line and type padding Dash bottom
colon 10px again and Save
and that adds space at the bottom of the element of 10
pixels next let's increase the space on the left and the right we'll go into our
code and add padding Das left colon 10 pixels and padding Das right colon 10
pixels let's save and it added some extra space on the
left and right but I think our final design has a little more space on the
left and right so let's go back and increase our padding so instead of 10
let's try 15 on both sides so we'll
save and now the spacing looks close enough to the final
design so in CSS it's normal to do some trial and error to get the styling right
let's keep styling this one by one next we'll make the text thicker or bold so
let's go into our code and to change the thickness of the text we'll use the
property font Das weight colon bold let's
save and that will make our text bold so we're almost there now let's make the
corners rounded look like in the final design we'll go back to our CSS and the
property for making the corners round is called
border Das radius and we'll make it colon 5
pixels let's save and you can see that it made our
Corners round so the pixels here tells the computer how round we want the
corners to be the higher the pixels the more round it will get
so if we change this to 10 pixels and save it will make the corners even more
round so let's change this to something really big to make it completely round
we'll change this to 50 pixels and save and now our button is completely
round the last style we're going to add is in the final design if we put our
Mouse over the button it turns into this hand the icon so we call this a pointer
and we're going to do the same thing in our project so let's go to our code and
to create that pointer icon we're going to use the property
cursor colon pointer and let's
save and put our Mouse over the button and you'll notice it turns into this
hand pointer icon and that's it now our subscribe button looks like the final
design next let's click the Subscribe button you'll notice that it only
changes the text but if we click the final
design it also changes the background color and the text color so we're going
to learn how to change the CSS when we click a
button let's go back to our code and this time we're going to scroll down to
our JavaScript which is here so we learned
in the previous lesson we can get HTML elements from the page and put them
inside our JavaScript and we also learned that these HTML elements are
just JavaScript objects and they can have properties like inner text and
inner HTML every element has another property
we can use called class list class list gives us control of the class attribute
so one solution we can do is when we click the button we can add a class and
then this class will have different styles so let's see how we do that in
our code we'll scroll down to the Subscribe function and when we click the
button and make the button subscribed we're also going to add a class so let's
create a new line and we'll type button element dot class capital L
list so class list itself is an object which means it has properties and
methods we can use one method is called add which adds a class to an element so
after this let's type dot add and brackets and now inside these brackets
we're going to put a string so this string is a class that we want want to
add when we click this button let's add a class called
is- subscribed and
save so now every time we click this button it will add a class to the button
called is- subscribed let's give it a try first we'll rightclick on the page
and then click inspect and we'll go to the elements Tab
and I'll rearrange my windows so you can see
it and then inside the HTML pay attention to the class of the button now
when we click the button it's going to add an extra class
called is- subscribed so that's what this line of code does and now that this
button has the is subscribed class we can style it in our CSS so let's go back
to our code and we'll scroll up to our
CSS and here we'll type dot to style a class and we'll style the class is-
subscribed is-
subscribed and curly brackets and now inside these curly
brackets let's change the background color to Gray and the text color to
Black Background Das color colon
gray and then color colon black and make sure to type these Styles
below the Subscribe button Styles so that these Styles will override the
Styles above now if we
save and then click our button it will add the is subscribed
class and now this button will get our new styles that we added here so that's
one way to change the CSS when we click a button all right now I'm going to move
this back to the top and notice that our background color
is different from the final design the final design uses a much lighter gray so
how do we get this exact color to do that we're going to open the elements
tab again so on this page we're going to rightclick click
inspect and then click the elements Tab and I'll rearrange my windows so we
can see it so in this section in the style
section we can see the CSS that the element has so first let's actually find
this button which is right here and we'll click
it and here it will show us the CSS that this button has and it will show us the
background color that we should use so let's make a copy of this color and put
it into our code rightclick
copy and here we'll remove it and rightclick and
paste now let's save and go back to our project and try
it out and now we get get the exact same
color as the final design so by the way this color is known as an RGB value RGB
means red green and blue and computers can create any color using a combination
of red green and blue so the first number here is how much red we want in
our color the second number is how much green we want and the third number is
how much blue we want each number goes from 0 to
255 Zer means less color and darker 255 means more color and lighter so this
color here uses 240 for all of the colors so it's close to 255 and will
give us a very light gray color that you see
here next if we go back to the final design and we click our button again
it will change back to the original style so we're going to create this
feature in our project as well so one way to do this is when we click the
button again we can remove this class so let's scroll down to the
bottom to the Subscribe function and when we click the button and we change
it back to subscribe we can remove this class to do that class list has a
another method we can use called remove so let's create a new line and we'll
type button element do class capital L list dot
remove and brackets so this does the opposite of
add it will remove a class from this element so inside the brackets we'll
type a string and the class we want to remove which is
is- subscribed and
save now let's try out our project we'll click the button it will get the class
is subscribed and get the extra Styles and now when we click the button again
it will remove the class and it will remove the extra
Styles so notice here that when we add a class we just type the class name we
don't type a DOT and the class name like we did for query selector typing a DOT
only makes sense in query selector next we're going to style the
text on the page let's scroll up to our CSS and one thing we can do is to style
all the paragraph elements on the page using this code P and curly brackets
however we're going to use a better solution instead of styling all the
paragraphs we're just going to style the body
element when we change the text in the body element it will change the text in
the entire page so inside these curly brackets let's change the text here so
we're going to use a different style of text this is called a font to change the
font font we're going to use this property font Das
family colon and we'll change it to aial which is what I used in the final
design so let's save and this will style all the text
inside the body and change the font to aial and a good practice is to write any
styles for the body at the top so if we need to we can override it later so
let's move these to the top we'll rightclick
cut and then up here create some new lines and right
click and paste and we're going to add one more
style before moving on let's add some space between the Subscribe button and
the second project so earlier we learned that space on the inside of it element
is called padding space on the outside of an element is called margin so inside
our subscribe button at the bottom let's add a property called
margin Das bottom colon 30 pixels and save so this will add space on the
outside of the element at the bottom of 30 pixels
now let's move on and style the Amazon shipping calculator with
CSS again we'll add a class to these elements and then style them in our
CSS let's scroll down to the text box which is the input element and we're
going to add another class by typing space and let's use the class cost Das
input and now we're going to style this in CSS so let's scroll up and here we'll
style the class using dot cost Das input and curly
brackets and inside we'll style this one by one let's look at our final design
and see what styles we need so first let's change the text size because our
text is a little smaller than the text here so the change the text size
we're going to use Font Das size colon and let's try 15 pixels and
save and now our text looks close enough to the final
design next let's add some space inside the text box so remember space inside an
element is called padding so we're going to type
padding Das top of 10
pixels padding Das bottom also 10 pixels and let's add padding to the
left 10 pixels and padding
dasr of 10 pixels so this will add a space on the inside of our text box in
every direction if we save now it looks just like the final
design now I'm going to show you a shortcut for padding that will save us
some typing so if we create a new line we can actually use a property called
padding and colon and then type 10 pixels this padding property let us add
padding on multiple sides at once if we type one value here like 10 pixels it
will add 10 pixels to every side so this line does the same thing as these four
lines above so let's actually comment this out using
slashstar and star slash and save and you can see that this one line
of CSS did the same thing as the other four lines of CSS so this shortcut can
save us some typing next let's move on and style the
calculate button again we'll add a class to this
button so we can style it so in this button let's add a class
attribute class equals calculate Das
button now let's style this in our CSS by scrolling up and here we'll type Dot
calculate dash button and curly
brackets and inside these curly brackets we're going to style this button one by
one so let's start with the background color so we'll type
background Das color colon green and semicolon and
save next let's change the text color to white
so we'll type color colon white and save
again okay let's keep going and we'll remove the border around this button so
we'll type border colon
none save next let's make our text a little
bigger like in the final design so we'll type font d
size and make it 15 pixels and
save okay so now let's add the space on the inside of the button so we're going
to use this shortcut again we'll type the padding
property colon and this time we're going to give it two values separated by
spaces 10 pixels and maybe 50 pixels so it's
easier to see what this does so when we give two values to padding the first
value is the vertical padding so the top and bottom the second value is the
horizontal padding or left and right if we
save so you can see that the left and right has a lot of padding which is 50
pixels so now let's make this match our final design so instead of 50 pixels
let's bring it down to 15 pixels and save okay so that looks pretty close
let's also increase the padding on the top and bottom so that the text box and
the button line up with each other like in the final
project so let's change the vertical padding to maybe 12 pixels and
save the last thing we'll style for this project is when we put our Mouse over
the button it turns into the pointer icon so to create this we're going to
use the property cursor colon
pointer and save and give it a try and that's it we just finished
styling the Amazon shipping calculator so now let's give this a try we'll Type
25 in the text box and press calculate and at the bottom it will add $10 of
shipping and show $35 finally we're going to style the
last project in this lesson which is the rock paper scissors project and this
will finish the project let's go back to superimple dodev and we'll scroll down
on this page and then click this link to show the final design for rock paper
scissors so I'll rearrange my windows so we can see
this and we're going to change the buttons to these nice big icons for each
of the moves and when we click a move it will show the result in bold and show an
icon of the move that we picked and the move that the computer picked so we're
going to make this project look really nice now let's get started I'm going to
rearrange my windows back so we have it at the bottom and let's create a cop
copy of the rock paper scissors project for this lesson we'll go to our code
editor and click here to show our files and we're going to make a copy of
09- Ro paper scissors so let's click this file and then
rightclick copy and down here right click and
paste and we'll rename this file by right-clicking
rename and at the end we'll remove copy and at the beginning we'll change it
from 9 to 10 and press enter now let's click here to hide the
files and we can close the 09 file and let's open the 10 rock paper
scissors file in the browser so we'll right click and then open with live
server and I'll move this tab to the top here so we can see it side by side so
let's start by styling the body we want to make the background color of the
entire page this dark gray color we'll go into our code and let's create a
style element so we can write some CSS inside the head let's type less than
Style greater than and then inside here we're
going to style the body so we'll type body and curly
brackets now inside here we're going to change the background color so
background-color colon and we're going to get the color that we see here by
right clicking click inspect and then go to the elements tab
Tab and I'll rearrange it so we can see it and then here we'll find the body
element and click it and in this style section we can find the background color
that we need so let's select this and
rightclick copy and in
here right click and paste and a semi colon at the end let's
save and I'll move this back to the corner and now our project has the same
background color as the final design next let's make the text color white so
in our CSS we'll use the color property and colon white and semicolon and save
and that will make our text White next let's change the style or the font
of this text we'll type font dasam colon
aial which is what the final design uses and
save all right now let's style these elements one by one to match the final
design we'll start with this paragraph at the top so inside the paragraph
element let's add a class so we can style it in
CSS we'll add class equals let's call this the
title and then in our CSS we can style this class by starting with a DOT and
then title and curly
brackets so let's make our title really big like the final design we'll change
the font Das size colon 30 pixels and save so that looks close enough next
let's make the text bold in our CSS we'll use Font D weight colon bold and
save now let's move on to installing the buttons so first we're going to need
these images in our project and I'll show you how to get them we'll put our
Mouse over the rock image and we'll rightclick and we'll click save
image and now we're going to find the folder that contains all of our code so
for me it's on the desktop and it's this folder right here
so I'll double click this folder and then leave the file name as the default
rock- emoji and click save and now in our code editor if we click
here we should be able to see the rock image let's do the same with the paper
and scissors image so we'll hover over it rightclick save
image and in the same folder that contains our code we're going to save
the paper image and finally right click save image and we'll save the scissors
image all right now that we have these images
in our code editor let's learn how to load them onto the page so we can do
this using an HTML element so we'll go back to our HTML code and we'll scroll
down and inside the button we're going to add an image element so let's type
less than IMG and greater than so this is the image HTML element it loads an
image onto the page the image element doesn't require a closing tag this is
called a void element now to load an image we're going to add an attribute to
this element called SRC so SRC stands for Source it tells a
computer which file or image to load so let's look in our
project for this button we're going to load rock- emoji.png
inside the source attribute we'll type rock-
emoji.png so what this does is it will look for
the file with this name beside the HTML file and it finds it right here and it
will load it onto the page if we save now inside our button it loaded the
rock image right now this image is too big so
let's use CSS to decrease the size of this image we'll hide the files and
let's give a class attribute to the image element so we can style it so
we'll type class equals and let's call this a move Das
icon and I'm also just going to add some new lines to make the code a little
easier to read so we'll scroll up to the CSS and we're going to style this class
using dot move Dash icon and curly brackets and let's decrease the height
of this image we can use the property height colon and a pixel value 50 pixels
and Save so this will make the height of this
image 50 pixels and it will also resize the width automatically so that the
image keeps its shape so this size looks pretty close to the final design so we
can move on another feature of the source
attribute is that we can put our files into folders so let's open the files by
clicking here and let's say that we want to
organize all of our images into a folder so we're going to create a folder by
clicking this icon and let's name this folder
images and we're going to drag these images into this
folder and drag this in here and in
here now unfortunately you can see that the image doesn't load anymore and
that's because if we look at our code Source tells a computer to look for this
file beside this HTML file and right now there is no file
called rock- emoji.png because we put it in a folder so to tell the computer to
look inside this folder we're going to type the folder name at the start which
is images and then we're going to type a
slash to go into the images folder and then look for this file which is right
here if we save the computer is now able to find
this image and load it onto the web page so this feature is called file paaths we
can tell the computer to look for a folder beside the HTML file like images
and then use a slash to tell it to go into the folder and look for a file
now let's use this code to load the other images onto our page so for the
paper image we're going to go to this button remove the text and then create
an image element less than IMG greater than and we'll give it an attribute
Source equals and we'll locate the image it is in the images folder so we'll type
images and then slash to go into the folder and we'll load the file paper-
emoji.png so
paper- emoji.png
and save so our image is really big let's
give it the same class that we gave the rock image so we'll add a class equals
move Dash icon and save so these Styles get applied to all
elements with the class move- icon so it applies to both of these
elements now let's do the same thing for the scissors button we'll remove the
text and we'll replace it with an image element and we'll give it the source
attribute images slash
scissors Das emoji.png
and we'll also give this a class of
move- icon to resize the images like up here let's
save and now we have all the images that we
need now let's make these buttons look like the final design we we scroll
up and let's add a class to these buttons so we can style them with
CSS so we'll add class equals and let's use
move- button and for this button We'll add the
same class class equals move-
Button as well as for the third button class equal move-
button now let's scroll up to our CSS and we're going to style this class
using move- button and curly brackets so first let's change the
background color to match the background color of the page so we use
background Das color colon and we'll use a special value called
transparent and this will make the button see- through if we
save now these buttons are see-through next let's add this white
border to our buttons so we'll use the Border
property colon and we're going to give it three values the first value is our
border width or how thick the border is let's use one pixel for now the second
value is the Border style and we'll use solid because it's a solid border other
values we can use here are dotted or dashed and the third value is the Border
color so we're going to use white and semicolon at the end and
save and that will add a border so let's make our border a little thicker like
the final design we'll change this first value which is the Border width to three
pixels and save okay so that looks pretty close now
let's change the size of our buttons usually we use the padding to add space
on the inside of an element but in this case our images have different sizes so
we're going to use width and height to set an exact size so so in our CSS we'll
type WID colon and let's make it 100
pixels and height and also 100 pixels and
save so it looks like our final design is a little bigger than what we have
here so let's increase the width and the height so let's try 120 pixels and Save
all right so that looks pretty close now let's make these buttons round and the
property for that is called border Das radius
colon and to know how much we need to make it round we can set it to half of
the width or the height so we'll set it to 60
pixels and save okay so it's coming along really
well and lastly we're going to add some space between the buttons so remember
that space outside of an element is called margin so let's add some margin
on the right so we'll type
margin dasr colon and maybe 10 pixels and
save and finally when we put our Mouse over the button it turns into a pointer
so the property for that is cursor colon pointer and save and now our buttons
match the final design so let's keep moving and style the next part of the
project which is the result and the moves if you don't see this here you can
just play the game and it'll give us a new
result so to make this easier to style we're going to go into our code we're
going to find the result which is here and we're going to add some fake results
like you win let's save and now we have this
result and we're going to style it so let's give this a class of
result and then in our CSS we're going to style the class dot
result and curly brackets so let's make the text bigger we're
going to use Font Das size colon and maybe 25 pixels and
save okay that looks pretty good let's make the text bold so we use Font Das
weight colon bold and
save and finally we're going to add extra spaces between this and the
buttons so we'll add margin-top and maybe 50 pixels and
save okay so I think that looks close enough now let's style the moves and
again we'll scroll down and we're going to add some fake
moves in here so it's easier to style so we'll Type U
and then an image so let's use the less than image and the source
attribute and let's just load the rock image and the scissors image for the
computer so to load the rock image we'll look inside the images folder slash to
go into the folder and then rock- emoji.png
so rock- emoji
PNG and greater than and we'll add another image less than image source
equals Images slash the scissors Emoji scissors Das
emoji.png and greater than and finally the text
computer computer let's save
and this will create some results although the images are really big so we
can use the class move icon to resize them to be the same size as the buttons
so for both of these images let's add the
class move-
icon and here as well class equals move- icon and Save
and now our images look good next let's style this score section
so the only thing we need here is to add spaces between these two so in this
score element let's add a class of score and we'll scroll up and style this
element using DOT score brackets and let's add some margin at
the top so
margin-top colon 50 pixels and save and let's compare it and it looks
like our final design has a little more spacing than this so let's change this
to 60 pixels and save and that looks close enough and
finally we'll style the reset score button so let's go back to our HTM
ml we'll add a class to this button so here class equals reset
dcore Das button so at the top we'll type dot
reset dcore
Dutton curly brackets and we'll make the background
color white so background-color colon
white and let's also remove the border from our button using border colon
none let's save and see how it looks and then let's increase the size
of this text because the final design looks a little bigger so we'll add font
Das size colon 15 pixels and save now let's add some extra space on
the inside of the button so that's padding padding colon and we'll give it
two values the first value is the vertical padding let's use 10
pixels and the second value is the horizontal padding so let's use 15
pixels and Save and it looks like our final project is a
little shorter than our button so let's change the vertical padding to maybe
eight and save and the last step is to add the cursor pointer so here cursor
colon pointer and
save and that's pretty much it we finished styling our rock paper scissors
project so now I'm going to rearrange my windows so we can see the entire design
and it looks really nice the last step here is to remove these fake results and
use JavaScript to insert these results instead so let's scroll
down and we'll remove this result and let's actually copy this code
because we want our JavaScript to generate this code so we'll right click
and copy and let's scroll to the
bottom to where we insert the moves onto the page which is here and instead of
this text we're going to rightclick and paste the code that we had before and
this time instead of picking Rock every time we're going to substitute this with
the player move so we're remove this and because this is already a template
string we can insert a value directly inside using dollar and curly brackets
and we'll insert the player
move let's also insert the computer's move in here so we'll remove this and
insert a value using dollar and curly brackets and we'll insert computer
move and now that we're inserting this with JavaScript we can scroll up and
remove the fake result which is here so we can select it
and delete it now let's
save and we're not going to have anything in our results and when we
click a move it will show us the result and also show us the moves that we
picked and that's it we finished the rock paper scissors
project the last thing we're going to learn in this lesson is how to organize
our code into different files so notice that right now all of
our HTML CSS and JavaScript is in one HTML file and this makes the code harder
to read because the file is bigger and it mixes three different languages to
make our code more organized and easier to read we're going to separate each
language into its own file so let's scroll down and we'll start by
separating our JavaScript into its own file we'll click here to show our files
and then click this icon to create a new file and we'll name this file
10- rock-paper-scissors do JS and press
enter so when we end a file withjs it tells the computer that this
file contains JavaScript code not just text now let's go back to our HTML
file and we're going to move all of this code into the Javascript file so we'll
select this code and then we'll
rightclick and copy and inside the Javascript file
we'll rightclick and paste now let's
save and we'll go back to the HTML file and we can delete all this JavaScript
code and now we're just going to load our Javascript file on to the web page
to do that we can use an attribute of the script element called SRC or source
so we'll make it equal and this does the same thing as the image element it tells
a computer which file to load if we type
10- rock-paper-scissors
DJs this will look for a file called 10 rockpaper scissors. JS beside our HTML
file which is this file here and it will run all the JavaScript inside this file
so it does the same thing as before except now our JavaScript code is in its
own file and this makes our code cleaner
because each file only contains one language and each file also contains
less code now let's go back to the HTML file
and save and you'll notice that our project
works the same way as before we just organized our code
better another feature of The Source attribute is that it also uses file
paths so we can put this Javascript file in a folder and we'll be able to find it
for example let's show our files and let's create a new folder by clicking
this icon and let's name this folder
scripts so this folder will contain all of our JS files so we can drag this file
into the folder and now we can locate it using
the source attribute by typing the folder name which is scripts and then a
slash to go inside this folder and look for this file and it will find it right
here if we save everything works as
normal another feature is we can use multiple script elements this lets us
split our JavaScript into multiple files and then load them all onto the page
from top to bottom next we're going to learn how to
separate our CSS into its own file let's scroll up to our
CSS so we can do the same thing with CSS so let's click the HTML
file and let's create a new folder and we'll call this folder Style
and press enter so this folder will contain all of
our CSS code let's click the folder and we'll create a new file by clicking this
icon and let's name this file 10-
rock-paper- scissors. CSS and press
enter so ending the file with CSS means this file contains CSS code and now we
can go back to our HTML and move our CSS into its own file
so let's select all this code and then right
click copy and in here right click and
paste and save this file now let's go back to our HTML
and we can remove this code and we'll learn how to load our CSS
file onto our website so we're not going to use the
style element for this we're going to use a different element called the link
element so we'll type less than link greater than and the link element
doesn't require a closing tag this is another void element so the link element
uses two attributes the first attribute is called
R means relation this tells a computer what type of file we're loading so we're
going to set this attribute to style sheet this means we're loading a CSS
file and then we'll add a second attribute called
href so href tells a computer which file we want to load
so this also supports file paths so we can type the Styles
folder this will look for a folder beside the HTML called Styles which is
this one right here and then we'll type slash to go inside the folder and look
for this CSS file which is 10- Rock Das paper Das scissors
CSS so this will load all the CSS inside this file and apply it to our page so it
does the same thing as before except we separated each language into its own
file if we save everything still works and all the Styles get applied and just
like the script element we can also use multiple link elements to load multiple
CSS files so that's how we separate our code
into separate files using the script element and the link element it makes
our code a lot easier to read because each file contains one language and it
contains less code and that's the end of this lesson as a final reminder the CSS
we learned in this lesson is just a review if you want to learn CSS in more
detail you can check out my HTML and CSS full course in the video
description so in this lesson we reviewed CSS and added CSS to all of our
projects we learned about the class list property which lets us control the class
attribute of an element we finished our rock paper scissors project and we
learned how to organize our JavaScript and CSS code into separate
files thanks for watching this course so far if you want to support this channel
you can check out the premium version of my courses just like this one where you
can get a certificate of completion and a Better Learning platform if you're
interested in extra videos from me more in-depth videos and behindth scenes
content you can check out these links here you can also support the channel by
liking the video subscribing and sharing this video with others thanks again and
let's continue with the course here are some exercises to help you
practice using HTML CSS and JavaScript together
in this lesson we're going to learn two more features of JavaScript called
arrays and loops and we're going to use these features to create this to-do list
project first let's create a new file for this lesson we'll go to our code
editor and click up here to show our files and this time make sure you have
one of these HTML files selected so we don't create the new file in one of
these folders so now we're going to click this
icon to create a new file and we're going to name this file
11- arrays Das and Das loops.
HTML and press enter now let's copy the previous lesson
into this file so we'll click on 10 Dom projects and and we'll type here and typ
control a or command a to select the code and then
rightclick copy and in
here right click and paste now let's hide our files and we'll
prepare this file for this lesson so we can scroll to the
top and we'll change the title to arrays and
loops and let's remove all of the CSS and we'll also remove the
HTML which is right here and we'll remove all the
JavaScript now let's save and we'll open this file in the
browser by right clicking open with live server and let's also open the console
so we right click click inspect and click the
console and now we can close the previous
tabs and the previous code for now until we just have the lesson 11
file now we're ready to learn arrays an array is another type of value in
JavaScript and it represents a list of other values so let's do an example and
create our first array we'll go into the script element and we're going to type
open square bracket and closed square bracket and inside the square brackets
we'll type a value like the number 10 and then we'll type comma and and
another value like the number 20 and then comma again and a third value like
the number 30 so this is an array and it represents
a list of three numbers 10 20 and 30 now arrays themselves are also values
which means we can save them in a variable so at the front we can create a
variable using const and let's name it my array and we'll
make it equal to this array and we'll add a semicolon at the end so now we
created a list of values and we saved this list in this
variable let's create a new line and we'll
console.log my array and Save
and it will display the list of values in the console so that's basically what
an array is it's a list of values now to get a specific value in an
array we can use square brackets so let's create a new line and we'll type
my array and square brackets inside these brackets we'll put
a number like zero this number represents the position
in the array so zero means the first value if we
console do log this code and
save my array Square braet 0 gives us the first value which is 10 and that's
what's displayed in the console now if we change this to
one this will get us the second value in the array which is 20 if we save it
displays 20 so this number represents the position in the array zero is the
first value one is the second value two is the third value and so on we can also
change a value in an array also using square brackets so let's create a new
line and we'll type my array square brackets and let's say we want to
change the first value so we'll type zero for the first value and we just
make it equal to something else like 99 now if we
console.log my array again and
save you can see that this changed the first value to 99
so that's basically how arrays work we can access a value inside an array and
we can also change a value inside an array now that we understand the basics
of arrays let's learn the syntax rules to create an array we start with an open
square bracket and we end with a closed square bracket inside we can put a list
of values and we separate each value with a comma
we can also write an array on multiple lines like this we just put the new
lines after the comma Now to get a value inside an array
we can use square brackets and a number like one this number is called the index
it represents the position in the array that we want to get so the first value
is index zero the second value is index one 1 third value is index 2 and so on
notice that the index starts at zero this is called a zero indexed
array now inside an array we can put any type of value for example let's create a
new line and we'll create a new array using square brackets and inside we can
put the number one and then comma and we can also put a string like
hello and another comma and we can put a Boolean value like true and another
comma and we can even put an object like Curly
brackets Name colon
socks now an array itself is also a value that means we can save arrays in
very variables like this or even save it in an array for example in this array we
can add an array inside like 1 comma 2 next arrays have a weird behavior when
we try to check the type of an array so on a new line let's type
console.log type of and then square brackets one comma
2 and save this will tell us that an array is
an object and that's because an array is actually an object but it's just a
special type of object if we want to check if something is specifically an
array we can use this code capital A array dot is
array brackets and inside the brackets we'll
put an array like square brackets 1 comma 2 so this will check if this value
is an array if we console. log this
result and save it will display
true and finally because arrays are are just a type of object they also have
properties and methods we can use so one useful property is called length so
we'll type console.log my
array. length this will tell us how many values
are in the array so my array has three values so if we save
it will display three next we'll learn a useful method
of an array called push this adds a value to the end of the
array if we did my array.
push 100 this will add 100 to the end of my
array if we console.log my
array and save you can see that 100 was added at
the end the last method we're going to learn
for now is called do splice this removes a value from an array for example my
array do splice and
brackets and a splice takes two numbers the first number is the index that we
want to remove so let's say we want to remove the first value which is index
zero the second number we give to splice is the number of values we want to
remove if we give it one it will remove one value at index zero if we give it
two it will remove two values starting at index zero so for now let's just
remove one value and let's create a new line and
console.log my array and
save you can see that splice removed the first value from the array or index0
which was 99 all right now that we understand the
basics of arrays and the syntax rules let's do some practical examples so
prepared a project we can do for this lesson we'll go to our browser create a
new tab at the top and here we'll type
superimple dodev SL projects slash arrays and press
enter so this page contains the to-do list project we're going to create in
this lesson so down here is the final version of the project we can type a
name for our to-do like make dinner give it a due date and then click
add and it will add it to our list we can add another to-do like wash
dishes and then select a due date and click add again and it will add another
to-do to our list and each to-do also has a delete button so we can delete it
when we're finished the task so this is the final version of the project and
these two up here are simpler versions of the project that we're going to use
to work our way up so let's start with the first project up here we're going to
open our console by right-clicking click
inspect and click the console and the way way this first
project works is we can type a to-do in this text box like make
dinner and when we click add it will add the to-do to an array and display it in
the console if we type another to-do like
wash dishes and click add it will add it to the array and display it in the
console so let's create create this project we'll start by creating a file
for this project we'll go to our code editor and click up here to show our
files and click this icon to create a file and we'll name this
11- too-
list. HTML and press
enter now let's copy the code from arrays and loops. HTML
so we'll click here control a or command a and then
rightclick copy and down here right click and
paste and let's close this for now we'll scroll up and change the title
to to do list and remove all the JavaScript code
and this time instead of writing all the JavaScript in here let's actually put
the JavaScript in a separate file which we learned in the previous lesson so
we'll open our files again and this time we'll go to our
scripts folder we'll click this JS file and we'll click this icon to add a new
file to this folder and let's name it 11- to-do Das
list.js and press enter next we're going to load this file
into our HTML file so let's open this and in the script element we can remove
the spaces and we're going to add an attribute called
SRC equals and we're going to load the Javascript file that we just created
which is inside the script folder so we'll type
scripts and then a slash to go into this folder and we'll load the file
11- too-
list.js and save so now I'm going to drag this file
down here so I can see both the HTML and JavaScript at the same time close this
for now and I can close the other code for now as
well and finally let's open this in our browser so we'll right
click open with live server and let's also open the console
on this page right click click inspect and click the
console now one more thing I'm going to do for this video is I'll rearrange my
windows so that we can have the the final design at the
bottom let's start by creating the HTML elements let's go to the body and we'll
actually create a paragraph element to start inside the paragraph we'll put the
text to-do list next let's create the text box so
to create a text box less than input greater than and add a placeholder
to this text box Place holder equals to do name finally let's add this
button so on a new line let's type less than button greater than and inside the
button we'll have the text add now let's
save and this creates all the HTML elements that we need
next let's write our JavaScript so first we're going to create an array to store
our to-dos and then when we click the add button we're going to get the text
from the text box and add it to our array and finally we'll console.log the
array now let's convert these steps into code let's create a new array first
using const let's name it
to-do list and we'll make it equal to square
brackets so this is an array with no values inside we also call this an empty
array next when we click the button let's get the value from the text box so
let's go to our button and add an onclick
attribute and then inside here let's create a function for this so down here
let's create a function we'll name it add Todo brackets
and curly brackets and then inside the onclick
attribute we're just going to call this function add too and
brackets the next step is to get the text in the text box we can do that
using document. query selector so to use Query selector we're going to put a
class on this input element so we'll type the class
attribute js- name Das
input and then in here document do query selector brackets and a string and we'll
type a DOT to get a class and we'll get this class
js- name-
input as a reminder this gets an element with the class JS name input which is
this element and puts it into our JavaScript and now let's save this in a
variable so at the start let's type const in input element and make it equal
to this result so now we took this input and put
it into our JavaScript to get the text out we're
going to use a property of the input element called value so down here
input element.
value and let's save the value in the text box in a variable so we can use it
later at the front const name and we'll make
it equal to whatever's in the text box before we continue let's
console.log the name to check if this is working so let's save this Javascript
file and let's also save this HTML file we'll go to our browser and I'll
resize it so we can you can see the console and now if we type something in
the text box like make dinner and click add it will get the text from the text
box and then display it in the console okay so it's looking good so far
the next step is to add this name to our to-do list so we learned how to do this
earlier we can use a method called push push will add a value to the end of the
array so let's remove this for now and at the
bottom we're going to type our array to do
list. push brackets and then between the brackets
we're going to add our name here and now the last step is to
console.log the entire array console.log Todo
list and save now let's give it a try or'll type
make dinner in the text box and click add it will take this text add it to the
array and then console.log the array and now we have our to-do list let's add
another to-do we'll type type wash dishes and click
add again it will get the text in the text box and then add it to the array so
now our array has two values and then we display them in the
console so that's how we create this first version of the to-do list project
now one more feature we're going to create is if we add something to our
to-do list and click add it will reset the text box to do that
let's go into our code and we'll create some new lines and
remember that the value property represents the text in the text box so
to change the text in the text box we can simply change the value property so
we'll type input
element. value and change it to the empty string
so this will make the text in the text box become empty if we
save and now type something in the text box and click
add it will reset the text in the text box let's move on to the second version
of the to-do list so here when we type something in the text box like make
dinner and click add it will actually display it on the page if we type
something else like wash dishes and click add it will also add it to the
page so how do we take our array and display each value on the page to do
this we're going to learn another feature of JavaScript called loops loops
let us run some code over and over like a loop so let's go back to our 11 arrays
and Loops file and we can close this JavaScript file for now and we're going
to learn Loops so first let's comment out the previous code by typing
slashstar and at the bottom star slash let's scroll
down and we'll create our first Loop we'll start by creating a variable using
the word let and we'll name name this variable I and we'll make it equal to
1 next we're going to type the word while and then brackets and curly
brackets and then inside these curly brackets we're going to put some code
that the computer will run over and over just like a loop let's put the code
console. log
I so this will display the variable I in the console over and over again now
obviously we don't want to Loop this forever so how do we get this Loop to
stop we can do that using the round brackets up here inside these round
brackets we're going to put some code that results in true or false for
example we can check if I is less than or equal to 5 so the way this works is
that if this code results in true the loop will keep going over and over once
this results in false the loop will stop and it will go to the next line now you
may notice that this code will never result in false because I is equal to 1
and 1 is always less than or equal to 5 so when does this actually become false
and Stop the Loop the answer is inside this loop we're also going to update
this variable I so we'll type I and we'll make it equal to itself plus
1 so now every time we Loop over this code we're going to increase I by 1 and
eventually I will be greater than 5 this will return false and it will stop the
loop if we save and then go back back to the tab
for this file and I'll rearrange my windows so we can see the console this
Loop makes the computer count from 1 to 5 so let's go over this code step by
step to make sure we understand how it works first we create a variable I and
we make it equal to one and then we do a loop so if this condition is true the
computer will keep running this code over and over again so the first time it
Loops I equals 1 and then it displays one in the console and then we increase
I to two now we go back to the top and we check this code 2 is less than or
equal to 5 this is true so we're going to run this code again this time I equal
2 and we display it in the console and then we we increase I to three and now 3
is still less than or equal to 5 so this is true which means we keep running this
code and eventually this is going to increase I to six once I is six this
will become false which will cause the loop to stop and then we go to the next
line so that's why it counts from 1 to 5 and then it stops at five
so this is called a while loop while this condition is true it will keep
running this code over and over again just like a loop as soon as this
condition is false it will stop the loop all right now that we understand
how a while loop Works let's learn the syntax rules to create a while loop we
type the word while and then round brackets and curly brackets the code
inside the round brackets is called the loop condition the code inside the curly
brackets is called the loop body the variable I at the top is called the loop
variable every time we loop we're going to increase the loop variable this is
known as the increment step the increment step makes sure that the loop
ends at some point without this increment step the loop would just keep
going forever this is known as an infinite
Loop now remember that I = I + 1 has a shortcut instead of this we can just do
I plus = 1 and remember we actually have an even shorter shortcut for plus equal
1 instead of this we can also do I ++ so this will increase the value of I by
one every time just like before so those are the three major parts of a loop the
loop variable the loop condition and the increment
step now each time we run this Loop this is called an
iteration so in this Loop we did five iterations we ran this code five times
and lastly Loops create a scope any variable that we create between these
curly brackets will only exist inside the curly brackets so that's a while
loop while this condition is true it will keep running this code over and
over again once this condition becomes false it will stop the loop and go to
the next line so in JavaScript there's actually
two types of loops the first type is a while loop which we
just learned now we're going to learn another type of loop called a for Loop
to create a for Loop we'll create some new lines and then down here we'll type
four and brackets and curly brackets inside these brackets we're
going to type three pieces of code the first piece of code is a loop variable
which is the same thing as this line up here so we'll type let I equal one and
then semicolon space and we'll type a second piece of code which is the loop
condition so here we'll type I less than equal to 5 and then semicolon and space
and the last piece of code is the increment step which is this line right
here so we'll type i++ and between these curly brackets
we'll write the code that we want to Loop over and over so let's just type
the code console.log I and
save so this for Loop does the same thing as the while loop above it counts
from 1 to 5 and if we look at this code we can see that a for Loop is just a
shorter version of this while loop instead of writing the loop variable
condition and increment step separately we group all of them together at the top
so this Loop works the same way first we create a loop variable and then as long
as this Loop condition is true we will keep running this code over and over and
every time we run this code we're also going to increase the loop variable by
one so now that we learned two ways of doing a loop which one should we use if
we're doing a standard Loop for example it has a loop variable a condition and
an increment step every time it's recommended to use a for Loop because a
for Loop is shorter and more organized than a while loop however if it's a
non-standard loop then it might be better to use a while loop so what's an
example of a non-standard loop so let's say we want to Generate random numbers
until we get a number that's at least 0.5 to create this Loop we'll create a
variable that will store the random number using
let random
number and make it equal to zero to start and then we'll do a while
loop brackets and curly brackets now inside the loop condition we want to
keep running this Loop until random number is at least
0.5 so we'll check if random number is less than
0.5 because if it is less than 0.5 we want to keep running this Loop until we
get a random number that's at least 0.5 and then inside this loop we're
going to generate a random number between 0 and 1 and then save it in the
variable up here so we'll type random number and make it equal to capital M
math. random so if this random number is less
than 0.5 it will keep generating random numbers until we get a number that is at
least 0.5 so at the bottom if we
console. log random
number and save it will give us a random number
that's at least 0.5 so notice that this is a
non-standard loop it doesn't really have a loop variable that we increase every
time and it also doesn't have the increment step so in this situation when
we have a non-standard loop it's better to use a while loop because they're a
bit more flexible all right now that we learned
the basics of Loops let's do some practical examples we're going to learn
a technique called looping through an array this means we're going to go
through each value of an array one by one and do something with each each
value so first let's comment out the previous code using SL
star and star slash at the bottom let's create an array of strings so we'll
create a variable const to do list equal to an
array and inside this array we'll have the string make
dinner another string wash dishes and another
string watch YouTube now let's take each value in
this array and display it in the console to do that we're going to run a loop and
this Loop is going to count from zero to the last index in the array so remember
that the index is the position of a value in the array the first value is
index zero the second value is index one third value is index 2 and so on So
Below this let's type four brackets and curly
brackets inside these brackets we're going to create the loop variable so
here we're going to count the indexes let index equals zero semicolon
space and we'll do the loop condition so we'll keep looping as long as the index
is less than or equal to the last index so remember that the index starts from
zero this means that the last index in an array will be the number of values in
the array minus one or the arraylength minus
one to do list do length minus
1 and here we'll add another semicolon and we'll add the increment step which
is index Plus+ so we'll increase it by one every time now inside these curly
brackets we can do something for each index of this array for now let's just
console. log this index and
save so this will count from 0 to two which is exactly all the indexes in this
array and now using this index we can also access the value at this
index so instead of just the index here we can do to-do list and then square
brackets and between the brackets index this will take whatever the index
variable is and access that index in the array so if the index variable is zero
this will access to-do list index0 which is the first value when the index is one
it will access to-do list index one which is the second value and so
on so for now let's save the value in a variable using const value
and make it equal to to-do list bracket index and now let's
console.log the value instead if we save this will Loop through each index
of the array get the value at each index and then display each value which is
what we see in the console so this technique is called looping through an
array we use a loop to go through each value of an array and then we can do
something with each value now I'm going to show you a few
shortcuts we can use when looping through an array instead of checking if
index is less than or equal to to-do list. length minus one we can shorten
this to index less than to-do list. length so this check does the same thing
as before the loop Loop will stop at index equal length minus one but it
saves us some typing another shortcut is instead of
naming the loop variable index we can shorten this to
I and we'll shorten this as well and this as well and that's why we often
name the loop variable I I means index next we're going to learn a
technique that we can combine with looping through an array called the
accumulator pattern so first let's comment out the previous code using
slash star and star
slash and at the bottom let's say we have an array of
numbers like this how do we calculate the total of all the numbers in the
array let's set up this problem let's say we have an array of numbers const
nums equals array and then the numbers 1 1 and
3 and we want to calculate the total of all the numbers in this array to
calculate the total we'll learn the accumulator pattern the first step of
the accumulator pattern is to create a variable to store the result so below
this let's create a variable const total and we'll make it equal to zero and the
next step is to Loop through this array and update the result so down here four
brackets and curly brackets and inside the round brackets we'll create the loop
variable let I or index equals 0 semicolon space and we'll create the
loop condition I less than nums do length and then semicolon and the
increment step i++ so as we learned earlier this Loop
will go through each index of this array and now between these curly
brackets first let's use the index to get each value so we'll type
nums and then square brackets and access the index I and let's save this in a
variable using const num equals this
value and finally we're going to add each number to the total we can type
total and make it equal to itself plus each number and remember
remember we have a shortcut for this which is plus
equals and finally since we're changing this total variable we have to change
from const to let all right so after this Loop we
should have added each number in the array to the total so at the bottom
let's console. log the
total and Save and it will display five which is the
exact total of all the numbers in this array so that's the accumulator pattern
we first create a variable to store the result and then we Loop through the
array and update the result so notice that as we Loop through the array we're
adding or accumulating the results into this variable and that's why this is
called the accumulator pattern pattern and we call this variable the
accumulator variable all right let's do another
example using the accumulator pattern let's say we're given this array of
numbers again and we want to create a copy of the array where each number is
doubled so if the array is 1 13 we're going to create a new array with 2
26 so as at the bottom we'll create some new lines and use the accumulator
pattern the first step is to create a variable to store the result let's type
const and let's name this nums
doubled and we'll make it equal to an array this time so notice in the
previous example the accumulator variable was a number in this example
the accumulator variable is an array so we can use different types of values to
accumulate the result it all depends on the problem we're trying to solve so now
the next step is to Loop through this array and update the result at the
bottom we'll create a four Loop brackets and curly
brackets inside the round brackets we'll create the loop variable let I equal
zero and we'll create the loop condition I less than nums do length and then the
increment step i++ and now between the curly brackets
we're going to get the number at each index so const num equals nums square
bracket I and then we're going to update the result
so down here we're going to add this number doubled to this
array so remember to add a value to an array we can use the method push so
we'll type nums
doubled do push brackets and we're going to add to this
array the number num multiplied by 2 and now at the bottom
let's console. log the result nums
doubled and save so this second Loop will create an
array where each number is doubled so that's how we solve this
example all right now that we understand how to Loop through an array and the
accumulator pattern let's go back and we'll create the second version
of our to-do list so when we add something to the list it will appear on
the page let's go to our code editor and we'll open 11 Todo list.
HTML and we're also going to open the Javascript file so it's this one and for
the video I'm going to drag it to the bottom of my code editor so that I can
see the files side by side so I'll close this for now
and I'll rearrange my windows a bit let's open the tab for this project
so we'll review what we have so far we can click in this text box and type a
to-do like make dinner and click add and it will add this to-do to this array
which is this array right here we can type another to-do like wash dishes and
click add and it will add it to the end of the array so now that we have this
array of to-dos we want to display it on the page to do that we're going to Loop
through this array and we're going to create some HTML code for each to-do and
then put that code on the web page using the Dom so first let's Loop through this
array to make this easier let's make a copy of this array so right click
copy and then here we'll remove this and rightclick and
paste so this will give us some default values to work with so at the top let's
Loop through this array using a for Loop so we'll type four brackets and curly
brackets and then in inside the round brackets we're going to create the loop
variable let I or index equal zero semicolon and the loop condition I less
than Todo list do length semicolon and then the increment
step i++ so this will Loop through each index
of this array and then inside the curly brackets let's get the string for each
index so we'll create a variable to save it const to-do and we'll make it equal
to to-do list square brackets and I and now for each to-do we're going to
create some HTML code so we'll create a new line and create a variable const
HTML and make it equal and we'll create some HTML code using this to do using a
template string and then inside we'll create a
paragraph element so less than P greater than and then less than SL P greater
than inside this paragraph we're going to insert this to-do so we'll type
dollar and curly brackets and Todo all right so now we're looping
through this array and for each to-do we created some HTML code and now we're
going to combine all of this HTML code together and put it on the web page to
combine this HTML together we're going to use the accumulator pattern so at the
top of the loop we'll create a variable to store the result let to do list
Capital HTML and we'll make it equal to the
empty string at the start and then as we Loop through the array we're going to
add this HTML to the variable up here so let's create a new line and we'll do
to-do list Capital HTML plus equals
HTML to combine all of this HTML code together so now after the loop let's
console do log to do list HTML to see what we get if we
save we took this array of strings generated paragraph elements for each
string and then combine them all together so now that we have all this
HTML we can put it on the page using the Dom so first let's create an element
where we can put this HTML so inside the HTML file after the
button we're going to create a different type of element called a div element so
we'll type less than div greater than so the div element represents a
container its purpose is to contain other elements inside like paragraphs
buttons and even other divs so in this situation we can't
actually use a paragraph element because in HTML we cannot have a paragraph
inside another paragraph so that's why we have to use a div element here for
now let's put some text inside this element so we can learn more about it
we'll type text and Save so like the paragraph element the div
element is a block element that means it will take up an entire line by itself
and that's why it appears below the text box and the button now one difference
between a div and a paragraph is that a paragraph adds extra space above and
below the paragraph while a div does not add any extra space above or below so it
doesn't have any default styling all right so now that we learned
the div let's put this HTML code inside this div first we need to get this
element into our JavaScript and to do that we'll add a class to this element
class equals js-
to-do-list and then down here let's scroll down and we'll put this div
element inside our JavaScript we can do that using document do query
selector brackets and a string and we'll type a DOT to select a class and we'll
select the class js-
too- list so this will get this div element
and put it in inside our JavaScript and then every HTML element
has a property called dot inner Capital HTML which controls the HTML inside this
element and now to put the to-do list HTML into this div element we're going
to make the inner HTML equal to the
to-do list HTML and now let's save this
file and also save the HTML file so this code will take the HTML
that we created using the loop and put it into the div element and that's how
we make them show up on the page so now let's try adding another to-do we'll
type watch YouTube and click add and unfortunately
this new Todo doesn't show up on the page and that's because when we click
add it will run this add Todo function and update the list but we didn't
actually update the HTML on the page so to update the HTML we need to
run all this code again every time we add a too so let's create a function for
this code so we can reuse it so at the top we'll create a
function and let's name this render
to-do list brackets and curly brackets so the word render means to
display something on the page so we'll put all of this code into this function
so we can delete this curly bracket and then at the end we'll type a closed
curly bracket and let's reformat this code by selecting these lines and then
press tab to add an indent so now let's use this function at
the start we'll display this to-do list on the page so we'll call this function
by typing render to-do list and brackets and then let's scroll down
every time we add a to-do to the list we're also going to display the list
again so at the bottom render to do list and brackets again so
if we save at the start it will display the
list on the page and then if we add it to the list like watch YouTube and click
add it will add it to the list and also display it on the page so that's how we
create the second version of the to-do list
project by the way if we scroll up to the render Todo list function this
technique is called generating the HTML instead of writing all the HTML by
hand up here we looped through an array and we generated the HTML using
JavaScript so when creating websites with
JavaScript we usually follow a three-step process first we save the
data in this case we saved our data as an
array next we use the data to generate the HTML which we did here and finally
we make the website interactive which we'll do later in this
lesson this is the main idea of JavaScript and we follow follow this
overall process when creating websites the rock paper scissors project
from the previous lessons was a bit different because all the HTML we needed
was already there we just had to modify it with
JavaScript so this process we're using for the to-do list is one step above
what we did for rock paper scissors we need to generate some
HTML and this is a standard process for creating websites we're going to use
this process for the to-do list and later the Amazon Project as well as
websites that you build Beyond this course let's take a break before
continuing with the rest of this lesson here are some exercises that will help
you practice what we learned so far now let's create the final version of
the to-do list we'll go back to superimple
dodev and then here we'll scroll down and we'll create this final version so
in this version we can type a too like make
dinner and we can also add a due date and when we click add each to-do
will now have a name and a due date and they will also have a delete button that
we can click to remove it from the list so let's build this out one feature at a
time we'll start by creating this delete button we'll go into our code and
remember we're generating the HTML for the to-do list so for each value in
the array we create a paragraph element so to add a delete button we just have
to add a delete button inside here so inside the paragraph we'll create a less
than button greater than and then less than SLB button greater than and then
inside this button we'll put the text delete
let's save and in the console you'll see that
the HTML we generated now has a delete button inside the paragraph and that's
what shows up on the page next we're going to reformat this
HTML to make it a little easier to read so we'll create some new lines here and
at the end and let's put the content of the
paragraph on its own line like this and also put the delete button on its
own line so remember that template strings have a feature called multi-line
strings so this is perfect for writing HTML
code the last step in the process is to make the website
interactive so next let's make our delete button do something when we click
it to do that we use the onclick attribute as usual so inside this button
we're going to add an onclick attribute equals double quotes
and then inside these double quotes we can run some JavaScript when we click
this button so this works the exact same way as what we've been doing so far in
this course the only difference now is that here we're generating this HTML
using JavaScript okay so when we click one of
these delete buttons we want to remove this to-do from the list earlier in this
lesson we learned how to remove a value from an array using a method called
splice so inside this onclick attribute we're going to type the to-do list dot
splice and brackets so splice takes two numbers the
first number is the index that we want to remove
so if we click this delete button how do we know which index to
remove well if we look at our Loop up here we already have the index it's this
variable I so we're going to insert I into this string and we can do that by
typing dollar curly brackets and I now splice also takes another number
so we'll type comma and the second number is how many values we want to
remove so here we just want to remove one value at this
index and finally because we updated the to-do list we need to display the list
again on the page to display the list we can use this function render Todo list
so down here we're going to type render Todo list and brackets
now if we save you can see that in the generated
HTML when we click the first delete button it will remove the value at
index0 which is the first value if we click the second button it will remove
the value at index one which is the second value so we're basically
generating all this HTML using a loop so now if we click this delete button
it will remove it from the list and then display the updated list on the page so
that's how we create the delete button next let's go back to superimple
dodev and we're going to create the due date
feature so first let's create this date selector in our
HTML we'll go to our HTML file and then under the text box we're going to add
another input element so less than input greater than and to
make it a date selector input elements have an attribute called
type so this attribute determines what kind of input it is if the type is text
which is the default value it's going to be a text
box now if we change the type to date and
save it's going to create a date selector now let's go back into our
JavaScript code and first we're going to scroll up and remember that right now
our to-do list is just an array of strings but this time each to-do is also
going to have a due date so how do we group the name and the due date together
we can do that using an object so here instead of just a string we're going to
create an an object and we'll give it a name property which is make dinner and
we'll give it a due date property and we'll make the due date a
string so you can type whatever date you have on the page for me it's
2022 D12
d22 and I'll end this object with a curly bracket and I'll turn this to do
into an object as well so open curly bracket
name and do date
2022 D12
d22 and closed curly bracket now that each to-do is an object
we need to update the rest of our code let's scroll down and we'll start with
the render function so here inside the loop each to-do is no
longer just a string it's an object so let's change this variable name to to-do
object to make it more clear and now we need to get the name and due date out of
this object so we'll type const name equals to do object. name and const do
date equals to do object. do
date and now instead of inserting to-do which no longer exists we're going to
insert the name and we're also going to insert the
DU date if we
save now each to-do will also display a due
date before before we continue we're going to review a shortcut we can use
with objects called destructuring so here you'll notice the
variable name is the same as the property name we actually have a
shortcut for this using const curly brackets
name equals Todo object so this is called destructuring
this takes the name property out of the object and and puts it in a variable
also called name and this is a shortcut for this line up here so we can comment
out this line we can also use multiple properties in this shortcut to also take
the due date out of the object we can just add a comma and do
date so this will do the same thing as this line of code and we can comment
this out if we save
everything still works next let's scroll down and we're
going to update our add Todo function so this time when we click the add button
we're going to get the name and the due date and put it into our list so let's
get the due date out of this date selector first we can do that using the
Dom like we did here so let's add a class attribute so we can get it using
queries selector js-
do- date- input and then down here let's create a
variable const date input element and make it
equal to document. query
selector and a string Dot and then the class we want to select which which is
this class js-
do- date-
input so this will get the date selector element and put it into our
JavaScript and now below this let's get the due date out of the
element we can do that using the value property again so let's create a
variable first const do date and we'll make it equal to the date input
element. value so this will get the date that we
selected and save it in this variable and now when we add a to-do to
our list instead of just a name we're going to add an object so open curly
bracket We'll add a name property and the value will be the name variable up
here so name and then comma and a do date
property and the value will be this due date variable up here so doe date and
then a closed curly bracket and remember that objects also
have a shortcut for this if the property and the variable name are the same we
can just type it out once like this this will do the same thing as this
line above same thing with the second line if the property and the variable
name are the same we can just type a comma and type it out
once this is called the shorthand property syntax so these two lines do
the same thing as these lines above so we can comment this out using double
slash and double slash so that's all the code that we
needed to update now let's save our Javascript
file and we'll also save our HTML file and let's go to our project We'll
add a new to-do like watch YouTube and select a
date and click add and scroll down you can see that it
added our new to-do with a name due date and a delete button
if we click this delete button it will remove that to-do if we click this one
it will also remove the correct to-do and that's actually all the
functionality that we need for this project so let's go into our code and
we're going to clean up by removing the console.log
here and the console.log up here and Save
finally let's add CSS to our project to make it look like the final design we'll
go into our code editor and scroll to the top and instead of writing all the
CSS in here let's put the CSS in a separate file just like our JavaScript
so we'll click here to show our files and then find the Styles folder
and we'll click the Styles folder and click this icon to create a new file
inside and we'll name this file 11-
to-do-list docss and press
enter and for the video I'm going to take this CSS file and put it at the
bottom of my code editor so I can see these files side by side and now I'll
click here to close it and will load this CSS into our
HTML to do that we can use a link element so inside the head section let's
type less than link greater than and we're going to give it two attributes
Rel equals style sheet and
HRA equals the file that we want to load so we created this this in the Styles
folder so we'll type Styles and then a slash to go into the folder and we load
this file 11-
too- list. CSS and
save now let's style our project one by one until it matches the final design
we'll start with the text on the page we're going to change the font so in
here let's typee body curly brackets and then we'll
change the font Das family colon Arial and
save so that looks pretty good now let's work on styling the to-do list first
let's add some more to-dos to the list so we'll type
watch YouTube and then we'll select a date
and click add and we're going to learn how to
style our list to look like this so notice that this list creates a sort of
grid we're going to create this grid using a feature called CSS grid so let's
go into our HTML first we're going to add a class to this
div element so we can style it to-do Das grid R and let's
save and inside our CSS we're going to style this class using dot Todo Das grid
and curly brackets and to turn this into a grid
we're going to use the property display and
grid and we're going to add another property called grid Das template Dash
columns so this basically sets how many columns are in our grid the number of
values that we give it is the number of columns for example if we give it 200
pixels 150 pixels and 100 pixels this will create three columns in
the grid the First Column will be 200 pixels the second Colum column will be
150 pixels and the third column will be 100
pixels and now each element inside this div will go into the columns so the
first element will go in the First Column second element will go in the
second column and the third element will go in the third column if we have more
than three elements it will wrap around and create a new
row so let's save and and unfortunately that didn't
quite work and that's because if we go back to our
JavaScript remember that each to-do is one paragraph element so this entire
to-do with the name due date and delete button will go inside the First Column
and then the next entire to-do will go inside the second column but what we
actually want is for the name to go in column 1 due date column 2
and delete button column 3 to do this we're going to separate this element
into three elements so that each element will go into each
column so instead of one paragraph let's actually use a div
element so less than div greater than and less than slash div greater than and
in between we'll insert the name so the reason we use a div element is
because div elements don't have any default styling so it's a little easier
to style with CSS for the due date let's also create a
div element so less than div and then at the end less than SL div
greater than and finally for the delete button we already have an element so so
let's just reformat these lines we'll select these lines and then press shift
tab to remove the indent let's remove the extra line and
we basically separated each to-do into three
elements if we save now the grid is working because
this element goes into the First Column this element goes into the second column
and the button goes into the third column
and that's how we lay out these elements in a grid like the final design next
let's also lay out the inputs and the add button in a grid we'll go to our
HTML and let's put these three elements in a div so we can use grid so we'll
create a less than div greater than and then
inside let's remove this and we'll add it at the end less than slash div and
let's reformat these lines by selecting them and then press tab to add an
indent and now let's make this div a grid as well let's go back to our CSS
and we'll add a class to this div class equals let's call it to-do Das input d -
grid and instead of writing all this CSS again we can use a feature of CSS so
here we're going to type a comma and enter so when we type a comma we can
style multiple classes at the same time so we're also going to style dot
too- input dgrid if we save the CSS file
and let's also save the HTML file now the input and the add button
are also laid out in the same grid next let's adjust the spacing
inside our grid so grid has some properties for this we'll go to our CSS
press enter and we'll use the property column Das Gap so this sets the spacing
between the Columns of the grid so let's make this colon 10 pixels and
save so now it will add 10 pixels between each column let's add some
spacing between the rows as well and grid has another property for this row
Das Gap colon 10 pixels and save so that will add 10 pixels of space
between the rows now notice it didn't add space between these two rows and
that's because these two are separate grids this is the to-do list and this is
the to-do input grid so to add space between them we
just going to use margin at the bottom we'll style dot
too- input Das grid and we'll just add some margin
under this grid so margin Das bottom colon 10 pixels and
save all right now let's move on to styling the inputs and the buttons we'll
start with the inputs first let's add a class so we can style them here let's
add a class name Das input and down here let's let's also add
another class do- dat Das
input let's save and now inside our CSS we'll style
both of these inputs so we'll style dot
name- input curly brackets and first let's make the text bigger like the
final design we'll set the font Das size colon 15 pixels and save okay so that
looks pretty good now let's add spacing on the inside of this input so we'll add
padding six pixels and save and that looks pretty good let's
move on to the due date input so we actually want the same Styles as the
name input so again we can use that feature of CSS we'll type a comma and
then dot do- dat Das input so now these Styles
will be applied to this class and to this class let's
save and that looks pretty good to me let's move on and style the
buttons we'll go into our HTML and find the add button let's add a class so we
can style it and we'll use add Das too Das button
let's save and then inside our CSS we'll style
that class using dot add- too- button curly
brackets and let's start with the background color we'll set the
background-color colon
green and save now let's do the text
color color colon white and
save now let's remove the border around our button using border colon
none save and let's make the text a little
bigger so we'll do font D size colon 15
pixels and save and the last thing we'll add is
when we put our Mouse over the button it turns into this pointer icon we can do
that using cursor colon
pointer and save next let's style the delete buttons
so these delete buttons are created in our JavaScript we'll go into our
JavaScript file and then here let's add a class to
each of the delete buttons so we can style them so we'll add class equals
double quotes and then delete Das too-
button let's save and then inside our
CSS at the bottom we style dot delete Das too Das button curly
brackets and let's start with the background color so we'll set background
Das color colon and for this design I use the color dark
red and save so that will style our delete
buttons now let's change change the text color to white so we'll use color colon
white and save now let's remove the Border using
border colon none
save and let's also make the text bigger using font Das size colon 15
pixels save let's add this pointer icon using cursor
colon pointer save and let's add some padding
at the top and bottom of the button so we'll add
padding-top colon 10 pixels and padding Dash bottom colon 10 pixels and Save
so that's all the Styles we need for the delete button and we can also close the
console to see the entire list however now we have another problem which is
this text and this button are not vertically aligned in the center to
vertically align in the center we're going to go back to the grid Styles so
we'll scroll up to the to-do
grid and CSS grid has another property for vertical alignment and that is align
Das items Colon Center to vertically align in the center
if we save now the text is aligned with the
button but now we have a new problem our add button is no longer stretching to be
the same as the inputs so by default align items is
stretch that's why this button stretches to match the inputs and now that we
changed it to align center it's no longer going to stretch so to solve this
problem we just have to make this grid stretch so down here in the to-do input
grid Styles we'll change align Das items back to
stretch and Save save and that will cause this Grid at
the top to stretch vertically again and that's it that's all the styling that we
need and now we finished this to-do list project in the rest of this lesson we're
going to learn more details about arrays and
Loops so I'm going to put this back in the same
window and I'll rearrange this window and now let's go back to 11
arrays and loops. HTML and we'll open the tab for that
file and we can also close these other files for
now and first let's comment out the previous code
using slashstar and at the bottom star
slash and we'll scroll down and save the first detail we're going to
learn is that that arrays are references so in the object lesson we learned that
objects are references arrays work the same way so for example if we create an
array const array 1 equals the array 1 2
3 this variable doesn't actually contain the values 1 2 3 this array is saved
somewhere in the computer's memory and this variable only contains a reference
that points to where this array is in memory and that means if we create a
copy of this variable const array 2 equals array
1 array 2 doesn't contain a copy of the values it actually just contains a copy
of the reference so now both of these variables are pointing to the same array
so if we did array 2. push
for and then we console.log array 1 and we
console.log array two and
save it will show us that even though we added four to array two array 1 and two
were both modified and that's because arrays are references so both of these
point to the same array in memory to avoid this Behavior we can create a copy
of the values in the array using a method called slice so here if we did
array 1. slice instead
this will make a copy of the values in Array one and now these two variables
point to two different arrays if we save now you'll see that this line only
affected array two the second detail we're going to
learn is a shortcut called destructuring so at the bottom here
let's create a new array const array 3 3 equals the array 1 2
3 and let's say we want to get the first value and the second value out of this
array one way to do this is to use the index like this another way is to use a
shortcut called destructuring so here we're going to
replace this with square brackets and now we can type some variable name
if we type first value it will take the first value and save it in a variable
called first value if we type comma and second value it will take the second
value and save it in this variable so this is an easier way to get values out
of an array and save them inside a variable next we're going to learn more
details about loops so Loops have two features called break and continue break
lets us exit a loop early for example let's create some new lines and let's
create a loop that counts from 1 to 10 so as usual we can use a four
Loop let I = 1 I less than or equal to 10
and I ++ and we'll
console. log I and save so this will count from 1 to
10 so now let's say that when I is 8 we want to stop this Loop early so first
let's check if I is equal to 8 if it is equal to 8 we're going to stop
this Loop by typing break and semicolon if we
save once this reaches eight break will cause this Loop to stop and now it only
counts up to eight so that's the break feature of a loop it lets us stop a loop
early the next feature is called continue continue lets us skip one
iteration of the loop or one run of the loop for example let's say we want to
skip the number three so at the top we can check if I is equal to
three and if it is we can use the code continue this will skip the rest of this
code and go back up to the top of the loop and do i = 4 if we
save this will skip three in the loop so continue let us Skip One iteration of
the loop so now let's say that we want to skip a number if it's divisible by
three divisible by three means the number can be divided evenly into three
for example 3 and six are both divisible by three but seven is not divisible by
three because there's one remaining this is called the remainder and we can
calculate the remainder using the remainder operator which looks like this
so to check if a number is divisible by three we can check if the remainder is
zero so here we're going to replace this with I remainder 3 and we'll check if
the remainder is equal to to0 if we
save this will skip 3 and six because they're both divisible by
three next let's use continue in a while loop so at the end here we'll create
some new lines and let's say we want to count from 1 to 10 using a while loop so
we'll create a loop variable let I equal 1 and we'll create a while
loop I less than or equal to 10 curly brackets and the increment step
i++ and inside the loop we just console. log I and
save so this will count from 1 to 10 again and let's say we want to not count
numbers that are divisible by three so 3 6 and 9 so at the top here we can check
if I remainder 3 is equal to zero and curly brackets and we might just try to
do continue however in a while loop
continue will actually skip the increment step and this will cause an
infinite Loop Loop so when using continue in a while loop we have to do
this increment step manually so before continue we have to do I
++ to avoid an infinite Loop if we save it will skip the numbers that are
divisible by three which is 3 6 and 9 so remember in a while loop if we use
continue always do the increment step manually in a for Loop however the
increment step is done automatically after every
iteration all right the last detail we're going to learn is how to use loops
with functions so let's say we have an array of numbers and we want to create a
copy of this array where each number is doubled so we already have the code for
this we can scroll up and the code for this is here
so let's actually make a copy of this code from before we'll
rightclick copy and scroll down
here and at the bottom right click and
paste at the top let's create an array called
nums so const nums equals array and one 1 and
three if we save this will create an array where
each number is doubled now what if we wanted to use
this loop on a different array other than one one and three we can do that
using a function so let's create a function around this Loop we'll create
function let's name it dou full array brackets and curly bracket we'll
remove the closed curly bracket and at the bottom We'll add it back and we'll
select these lines and press
tab so now instead of doing this loop on the same array every time we can turn
this into a parameter so at the top here we'll create a parameter called
nums and we're going to delete this line and we're going to Loop over this
parameter instead so at the bottom we can call our function using double array
and brackets and between the brackets we're
going to save an array into nums so square bracket 1 1 and 3 if we
save this will do the same thing as before but now because it's in a
function we can use this loop with any array not just one one and three so at
the end we can do double array brackets and an array 2 2 five this time
and save and it will create an array where
these numbers are doubled so using a function we can reuse this Loop for any
value another feature of using a function with a loop is that we can
break out of this Loop using a return instead so first let's actually use a
return in this function instead of console.log we're going to
return nums doubled and here we're going to console.log the
result console.log and
console.log and save so this does the same thing as
before except we're returning the result and console. logging outside of the
function now let's say that if we see the number zero we want to stop this
Loop early to do that we can click here and check if num is equal to
zero and if it is we can break out of this Loop now when we're inside a
function we can also use a return statement to break out of this Loop so
we can also do return nums doubled so a return statement will end
this function immediately so this is another way of ending the
loop so down here if we add the number zero and then five and
save you'll notice that the loop stops when we see the number zero so return is
another way of breaking out of a loop when it's inside a function and that's
the end of this lesson in this lesson we learned about arrays which represent a
list of values we learned about loops which let us run some code over and over
just like a loop we learned a Technique we can use with loops called the
accumulator pattern and we used it to create a to-do list project we learned
that arrays are references and the destructuring shortcut and we learned
more features of Loops like break continue and using Loops inside a
function here are some exercises to help you practice arrays and loops
in this lesson we're going to learn some Advanced features of functions and we're
going to use them to improve our previous
projects first let's create a new file for this lesson we'll go to our code
editor and click here to show our files and click here to create a new file and
we'll name this 12- Advanced D
functions. HTML and press
enter now let's copy 11 arrays and Loops into this file so we'll click here
control a or command a and then rightclick
copy and in here right click and paste
and we can close this for now and let's prepare this file for this lesson so
we'll scroll up and change the title to
Advanced functions and let's remove all the
JavaScript code from before and now let's save and open this
file in the browser by right click clicking open with live
server and let's also open the console on this page so we'll
rightclick inspect and open the
console and now we can close the previous
tabs as well as the previous files and now we're ready to begin so
first we're going to review how to use fun
functions inside the script element let's create a function using the word
function will give it a name greeting brackets and curly brackets and
inside the function we'll type the code console.log the string
hello so this is a function and it lets us reuse code to run the code inside
this function we can type the function name which is greeing and then
brackets if we save this line of code we'll run the
code inside the function and display hello this is known as calling the
function or running the function so now that we understand
functions we're going to learn an advanced feature of functions which is
functions are values so we learned many types of values in this course like
numbers strings and booleans and we can save a value in a variable for example
let's create some new lines and we'll create a variable const num equal
2 so this will save the value two inside the variable num
now functions are also values and this means just like a number we can save a
function inside a variable so let's give it a try we'll create a new line and
type const function one and we'll make this
equal to a function this time so we'll just type
function and a name greeting brackets and curly
brackets and inside the function we'll type
console. log the string hello 2 and we'll put a semicolon at the end
since we're saving in a variable so this variable now contains a
function we're using the exact same syntax as before except we're just
taking this function and saving it in a variable because functions are values
so now that this function is inside this variable let's actually console.log it
so we console.log function one and
save and this will show us that the variable function one actually contains
this function now on a new line we can also
do console.log and check the type of function one and
save and it will tell us that the type of this variable is a function so as you
can see a function is just another type of value and we can save it in a
variable we can also run the function inside this
variable by typing the variable name function 1 and because this contains a
function we can actually just call it using
brackets so this will run the code inside this function if we save it
displays hello to now let's do some Cleanup in this
code in JavaScript as long as there's a way to access a function this function
name is not needed so here we can access this function using this variable so
this function name is not needed and we can actually just delete it like this
and now this is called an anonymous function which means a function without
a name now an interesting thing to know is
that the function syntax that we've been using this entire course up here is
actually a shortcut for this code now even though this syntax uses VAR and we
usually don't recommend VAR this syntax actually has a couple advantages number
one it's easier to read and number two it gives us a feature called hoisting
which means we can call this function greeting brackets before we create it in
the code so using hoisting we don't have to worry about what order we write this
code hoisting doesn't work when we create our function and save it in a
variable like this so in JavaScript functions are values and just like any
other value we can save it in a variable now let's think what else can
we do with a value well we can save a value in an object for example let's
scroll down and create some new lines and we'll
create an object const object 1 equals curly
brackets and inside this object we'll have a property num with the value
two so this saves the number two inside this object now because functions are
values we can also save a function inside this object so we'll type comma
and then a property fun colon and we'll create a function this time function
greeting brackets and curly brackets and inside we type
console. log the string hello 3 so this saves a function inside this
object under the property fun now to access this function we just use the dot
notation as normal so object one dot fun and because this value is a function
we can call it using brackets if we
save this will run the code inside the function and display hello 3 so remember
this is called a method when we have a function saved inside an
object again as long as there's a way to access this function for example using
object one. fun then we don't need this function name so we'll delete it and use
an anonymous function now let's think what else can
we do with a value we can pass a value into a function for example down here
let's create a function function
display brackets and curly brackets and we'll give this function a parameter so
in here we'll create a parameter and name it
param and inside the function we can use a parameter just like a variable so we
console.log the param and then down here let's call this
function using display brackets and two
this will take the value two save it inside Pam and then we can use it just
like a variable if we save this will display two in the
console so this is known as passing a value into a function now because
functions are values we can also pass a function into a function so let's give
it a try down here we'll create a new function
function run brackets and curly brackets and this function will also
have a parameter let's call it param and down here we'll call this
function run brackets and between the brackets we're
going to give it a function this time so we'll type function
brackets and curly brackets and inside the function we'll type
console.log the string hello 4 so this will take this function and
save it inside Pam and now up here we can use Pam just like a variable so we
can type Pam and because Pam contains a function
we can actually just call it using brackets if we
save this code will run the function that we created down here and display
hello 4 so this is called passing a function into another
function the function that we're passing in is called a callback function or a
callback so to summarize functions are values anything we can do with a value
we can also do with a function now let's do some practical
examples using functions as values we're going to learn a feature of JavaScript
called set timeout set timeout allows us to run a function in the
future first we'll comment out the previous code using
slashstar and at the bottom star slash and let's create some new
lines and we're going to type the code set capital T time
out so set timeout is a built-in function so we can type brackets to call
this function Now set timeout takes two parameters inside these brackets the
first parameter is a function that we want to run in the future
let's create a function brackets and curly brackets and
inside this function let's type console. log the string time
out so here we're using a function as a value and we're passing it into another
function at the end we'll type a comma and we'll give set timeout a second
parameter the second parameter is how long to wait before running this
function so this is a number in milliseconds 1,000 milliseconds is equal
to 1 second so if we type 3,000 milliseconds this is equal to 3 seconds
so set timeout will wait for 3 seconds and then call this function if we
save after 3 seconds it's going to display timeout in the
console so that's set timeout we give it a function and it will call this
function after a certain amount of time so now we're going to learn an
important concept called a synchronous code so after set timeout let's type
console.log the string next line and Save
so notice that it displays next line first and then after 3 seconds it
displays timeout so what's happening here why are they reversed set timeout
sets up a timer and after 3 seconds it will call this function however it
doesn't actually wait for the 3 seconds to finish it just sets up the timer and
immediately goes to the next line so that's why this line is displayed first
so this is called asynchronous code asynchronous code means the computer
won't wait for this line to finish before going on to the next line so for
set timeout it'll just set up the timer and then immediately go to the next line
synchronous code on the other hand means the computer will wait for one line to
finish before going to the next line so all the code we've written in this
course so far has been synchronous code in addition all the code inside this
function is also synchronous code so if we added
console.log the string time out to and
save the code inside the function will still run line by line it will wait for
each line to finish before going to the next line and after 3 seconds it will
display timeout followed by timeout 2 so don't worry all the code that we
normally write will be synchronous code it will run line by line as usual the
only time that code becomes asynchronous is when we use certain features of
JavaScript like set timeout so set timeout is the only part that is
asynchronous now the advantage of set timeout being asynchronous is that it
does doesn't block our code for 3 seconds waiting for this timer to finish
it just sets up the timer in the background and then goes to the next
line of code so this allows our code to do other things while this timer is
running in the background and this is similar to real life if you set up a
timer on your alarm clock you're not going to stop and wait for the timer to
finish you're going to go and do something else asynchronous code is the
exact same concept next we're going to learn a similar
function to set timeout called set interval so at the bottom let's type the
code set capital I interval and set interval is another
built-in function so we can call it using
brackets and set interval takes these same two parameters as set timeout the
first parameter is a function that we want to run in the future so let's type
function brackets and curly brackets and inside we'll type
console. log the string interval now let's add a comma and the
second parameter is also a number in milliseconds so we'll type 3,000
milliseconds or 3 seconds so set interval will run this function 3
seconds in the future but this time it will keep running the function every 3
seconds if we save in the console every 3 seconds it
will run the function and display interval so set interval is also
asynchronous below it if we type console. log the string next
line two and
save it will set up the interval and then immediately go to the next line and
display next line two so that's set interval we give it a function and it
will keep running this function after a certain period of time so now let's do a
project using what we learned so far let's go to our browser and we'll create
a new tab at the top top and here let's type
superimple dodev slash projects slash Advanced Das
functions and press enter so this is basically the rock
paper scissors game that we created earlier except this time it has an extra
button called autop playay if we click this Buton
button every second the computer will play by
itself so this feature will help us practice using set
interval so first let's make a copy of the project files we'll go into our code
editor and click this icon to show our files and let's make a copy of 10 rock
paper scissors for this lesson so we'll rightclick copy
and down here rightclick and paste and I'll stop this for now so here
we're going to change the name by right clicking
rename we'll remove copy at the end and at the beginning we'll change it to 12
and press enter and let's also make a copy of the
JavaScript and CSS files so we'll click this file and right click
copy and then click the folder right click
paste and we'll rename this file rightclick
rename remove copy at the end and at the beginning change it to 12 and press
enter and let's also make a copy of the CSS file select it right click copy
click the folder right click and paste and right click
rename remove copy and at the front change it to 12 and press
enter now let's scroll down to 12 rock paper
scissors and I'll close this for now and inside the head let's change
this to load 12 rock paper scissors and we'll scroll to the
bottom and here instead of the lesson 10 file we'll load The Lesson 12 Javascript
file let's save and we'll open this in the browser by
right-clicking open with live server so now we're ready to begin let's
go back to superimple dodev and the first thing thing we're
going to create is this autoplay button so beside the reset score button which
is here we're going to create a new button less than button greater than and
inside we'll have the text auto play let's
save and go back to our Tab and now we have this button so next
let's style this button with CSS so we'll give it a
class class equals auto-play Das
button and save and now let's open the CSS
file I'm going to take this file and then drag it to the bottom so I can see
it side by side so I'll close this for now and rearrange this a little bit and
then down here and we're going to style the autop playay button so let's just
make the style the same as the reset score button so in the CSS we'll scroll
down to the reset score button Styles so we'll add a comma at the end and type
dot auto-play dasb button so now these
Styles will apply to the class reset score button and the auto playay button
if if we save now we styled our project so next
let's make this button interactive so at the top here we'll add an onclick
attribute and then in here we're going to run some JavaScript code let's
actually create a function so we can separate the JavaScript into its own
file so we'll run a function called auto play and
brackets so now let's save and right now this function doesn't
exist so we have to create this function in the Javascript file so for me the
file is right here I'll select it and then drag it down here so I can see it
side by side so let's scroll down and I'm going to create it just above the
play game function so here we'll create some new lines and type function
auto play brackets and curly brackets and now inside this function we
want to play the game every second so we can use set interval to run some code
every second so let's type set interval
brackets and inside the brackets will give it a function that we want to run
so brackets and curly brackets and then at the end let's type
a comma and we'll give it 1,000 so this means it will run this
function every 1,000 milliseconds or 1 second and now inside this function
we're going to automatically play the game and to play the game we can use
this function right here play game so here we'll type play game
brackets now we need to provide this function with a Player move and remember
we have another function pick computer move which will give us a random move so
above this line let's create a variable const
Player move and we'll make it equal and we'll pick a random move using pick
computer move and
brackets and finally we'll take this move that we picked and pass it into
this function so Player move so now when we click this button it
should play the game every second let's save and click
autoplay and it works the computer is playing against itself every second so
now let's make this button button stop playing when we click it again so at the
top let's create a variable to keep track of whether or not we're playing so
we use let is auto playing and at the start we'll make it equal to
false and save and now inside this function we'll
check using an if statement brackets and curly
brackets and inside this condition let's check if we're not playing so not is
auto playing so if we're not playing then we
want to start playing the game which is this code down here so let's select this
code and then right click cut and in here right click and
paste and also after we start playing the game we're going to change this
variable to true so is auto playing and we'll make it equal to true because now
we are autop playing so now let's add the else Branch to this
statement else curly brackets so now we need to stop this
interval so how do we do that the answer is that set interval actually returns a
number and this number is like an ID we can use this ID to stop the interval so
at the front let's create a variable to save this ID
const interval ID and
equals however there's another problem here every time we run the function
we're going to get a different ID so in order to save the ID from last time we
need to put this variable outside the function so let's select this and remove
it for now and we'll scroll up and here we'll create the variable let
interval ID and we'll leave it undefined to start and now down here we're going
to save the return value into this variable by typing
interval ID equals set interval and now at the bottom we're
going to use the interval ID to stop the interval let's scroll down and to stop
an interval we can use a function called clear interval so we'll type clear
capital I interval and
brackets and between the brackets we're going to give it an ID that we want to
stop so we'll give it this interval ID
interval ID and then at the bottom let's also
change is autop playing to false because we just stopped it so is auto playing
equals false and
save so now if we try out this button it will start playing the game by
itself every second and if we click the button again it will stop playing the
game so that's how we stop an interval we need to save the ID and then call
clear interval with this ID so now I'll clean up the code a little by removing
this extra line and Save and now we're finished with this
feature so next let's go back to our Advanced functions file so I'll click up
here and then at the bottom I'll open 12 Advanced
functions and hide the files for now and we're going to learn some more features
of functions as values so let's actually close the other files that we opened
and first let's comment out the previous code with
slashstar and at the bottom star slash let's scroll down and
save and let's open the tab for this file so now we're going to learn another
way to Loop through an array first let's create an array we'll type square
brackets and inside the array we'll have the string make
dinner and another string wash dishes and another
string watch YouTube so in the previous lesson we
learned how to Loop through an array using a for Loop or a while loop another
way to Loop through an array is using a method of the array called four each so
at the bottom let's type dot for capital E each and
brackets so this is the for each method and it allows us to Loop through this
array inside these brackets we're going to give for each a function so we'll
type function brackets and curly brackets so
again we're just passing a function into another
function however this function will be a little different we're going to give it
a parameter so up here let's create a parameter called
value so what four each does is that it Loops through the array and for each of
these values it will save the value in the parameter and run the function so
let's console.log
value and save so this will Loop through the array
and display each value in the console so let's go through this step bystep so
it'll take the first value save it in this parameter and run the function then
it will take the second value save it in the parameter and run the function then
it will take the Third value save it in the parameter and run the
function so the for each method is actually the preferred way to Loop
through an array because this is easier to read than a for Loop like this and
for each also has another feature we can give this function a second parameter so
we can type comma and the second parameter is the
index or the position of the value in the array so for the first value index
will be zero for the second value index will be one third value index will be
two and so on so above this line let's also
console.log the index and
save and this will also display the index of each
value all right now let's do a practical example using the for each method we're
going to go back to the to-do list project that we created in the previous
lesson so we'll click up here to show our
files and let's scroll up and let's open 11 too
list.js so in this code we used a for Loop to display the to-do list on the
page we're going to switch this to using a for each method instead said so first
let's actually make a copy of the files for this project we'll click up
here and let's click 11 to-do list and rightclick
copy and let's click the script folder rightclick and
paste and now we'll rename this by right-clicking
rename remove copy from the end and change the beginning to 12 and press
enter let's also make a copy of the CSS and HTML file for this project so we'll
click the CSS file right click copy click the Styles folder right click
and paste rightclick
rename remove copy and at the front change it to 12 and
press enter and finally we'll scroll down
click 11 Todo list. HTML
rightclick copy and then down here right click and
paste right click rename remove copy at the end and at the
beginning change it to 12 and and press enter now we can hide these
files and we can close the lesson 11 files and now here we're going to change
the CSS file that we load to 12 to-do list and we'll scroll down and we'll
also change the Javascript file that we load to 12 to-do list now let's
save and we'll open this in the browser by right clicking
open with live server okay now let's go back to the JS
file so I'll take this file and drag it to the
bottom and I'll rearrange the windows here we're going to scroll down and
we'll change this for Loop to use a for each method so first let's type above
this for Loop and we'll type the array that we want to Loop through which is
Todo list and we'll type Dot and use the four each method and
brackets inside the brackets we'll give it a function that we want to run for
each to do so we'll type function brackets and curly
brackets and this function can have two parameters the first parameter will
contain each value in the array so we'll call it too
object we'll type a comma and the second parameter contains each index in the
array so we'll just call it index and now inside this Loop we
basically want to do everything that we did here so let's just make a copy of
this code right click
copy and then up here inside for each right click and and
paste so now if we scroll up we already have the to-do object up here so we
don't need to get it from the array like before so we can remove this line and
let's also remove these comments the other thing we have to
change is that previously we were using I for the index but now the index is
called index so we just change this to to
index so that's how we use a for each method instead of a for Loop if we
compare this code to the four Loop that we had before the for each method is
easier to read so for the rest of this course we're going to prefer to use four
each instead of a for Loop so we're going to remove this for
Loop let's scroll back up and save and the project still works so
that's a practical example of using the for each method now let's go back and
learn some more details about for each we'll close the Javascript file for now
and go back to Advanced functions. HTML and open the tab for this
file so in the previous lesson we learned a feature of Loops called
continue continue lets us skip to the next iteration or the next run of the
loop for each methods don't have continue but we can do the same thing
with a return statement so let's say in this Loop we don't like washing dishes
if the value is wash dishes we're going to skip it and not display it in the
console so above we'll create an if statement
and then inside the condition we'll check if value is equal to the string
wash dishes and then in the curly brackets if
it is equal will return and semicolon so this return statement will
end this function early and it will go on to the next function so it basically
does the same thing as continue in a for Loop if we
save you'll notice that it skipped wash dishes in the previous lesson we also
learned a feature of Loops called break break lets us exit a loop early
unfortunately there's not an easy way to break in a 4 each Loop so if we need to
use break to exit this Loop early then it's better to use a regular for
Loop let's take a break before continuing with the rest of this lesson
here are some exercises that will help you practice what we learned so far
so next we're going to move on and learn a shorter way to write functions called
Arrow functions so let's go to the bottom of
this code we'll create some new lines and let's create a variable
const and we'll name the variable Arrow function and we'll make it equal to to
brackets equal greater than or an arrow and then curly
brackets inside the curly brackets we'll type some code
console.log brackets and the string hello and we'll put a semicolon at the
end so this is an arrow function it works the same way as a regular function
for example we can call this Arrow function by typing the variable name
Arrow function and
brackets if we save this line of code will run the code
inside this Arrow function and display hello so Arrow functions mostly work the
same way as regular functions so to compare them let's actually type above
this code we'll create some new lines and type
const regular
function equals the word function brackets and curly brackets
console.log string hello so these two syntaxes do the same
thing the difference is that instead of using the word function an arrow
function just uses an arrow now parameters work the same way
in an arrow function we just type the parameter between these round brackets
so here let's type param and here as
well if we want multiple parameters it also works the same way up here we can
type comma param 2 and down here comma Pam 2 and finally return statements also
work the same way so in this function we can return five and in the arrow
function we can also return five so now let's learn some differences
between these two Arrow functions have a few shortcuts that regular functions
don't have for example at the bottom let's create an arrow function using
const and we'll name it one perm and make it equal to an arrow
function brackets arrow and curly brackets now in this Arrow function
we're going to give it one parameter param and inside the function will
console.log param plus one so when an arrow function only has
one parameter these round brackets are optional so we can actually remove
them if we do one param brackets 2 if we save it will display 2 + 1 which is
3 let's learn another shortcut we'll create some new lines and type const one
line and make it equal to an arrow function brackets arrow and curly
brackets and inside will return 2 + 3 so when an arrow function only has one
line like this we can actually put it on the same line as the
arrow and now that everything's on the same line the curly brackets are
actually optional so we can remove them and we can also remove the return
statement so this is a oneline arrow function if we just have an arrow it
will automatically return the result on the right so at the bottom we can
console. log and call the one line function with
brackets if we save this function will return to plus
three and it will display five in the console so that's Arrow functions it's a
shorter way of writing a regular function and it has a few
shortcuts for now let's get some practice using Arrow functions so let's
scroll up in this code to the for each method so let's use an arrow function
here instead we just have to remove the word
function and after the round brackets add an arrow equals greater than if we
save the loop still works so when we're passing a function into another function
like for each it's recommended to use Arrow functions because it makes our
code easier to read so now let's use use Arrow functions in some of our previous
projects we'll start with the rock paper scissors game let's open our files by
clicking here and we'll find the 12 rock paper
scissors. JS file and then inside this file we're
going to scroll down to the autoplay function so here we're passing a
function into another function so it's recommended to use an arrow
function let's remove the word function and add an arrow so now this
code is a little easier to read now what about this function up here function
autoplay should we also switch this to an arrow function so this situation is
more personal preference so above this let's actually create an arrow function
version of this const auto play equals brackets and arrow and
curly brackets so even though we could create
an arrow function version of this I actually prefer the regular function
syntax here for two reasons number one I think this is easier to read than this
and number two this function syntax enables hoisting which means we can call
this function before we create it and we don't have to worry about which order we
write the code so for these reasons I actually prefer this situation to use a
regular function syntax and not an arrow function so we'll comment out the arrow
function using double slash and double
slash now let's save and let's open the tab for this
project and we'll give give it a try so click
autoplay and this still works after replacing with an arrow
function next let's go to the to-do list project and switch to Arrow functions so
we'll go to our code editor and find the to-do list project which is
here and let's scroll down so inside render to-do list we're
using four each and we're passing this function into another function so it's
recommended to use an arrow function here so we'll remove the word
function and after the brackets We'll add an
arrow and again I'll leave this function syntax as a regular function because
it's easier to read and enables hoisting so let's
save and go back to our to-do list and everything still
works next let's go back to 12 Advanced functions.
HTML and we'll scroll to the bottom and we'll open the tab for this
file and we'll review another place we could use Arrow functions which is
inside an object so at the bottom here let's create a new object cons
object 2 equals object and then inside let's type the
property method colon and an arrow function brackets arrow and curly
brackets so even though we could save an arrow function inside an object like
this objects already have a shortcut for functions so at the bottom we could just
type method brackets and curly
brackets so this syntax is called the shorthand method syntax so this
shorthand method syntax is actually easier to read than an arrow function so
when saving a function in an object it's actually recommended to use this syntax
instead there's also another difference between regular functions and arrow
functions but we'll learn about it later in in this course because it's a more
advanced feature now let's move on and we're
going to learn another Improvement we can make to our projects so let's
comment out this code we'll scroll up and type SL star and at the
bottom star slash and save and next we're actually going to
scroll up to the very top of this file and we're going to create a button on
the page so inside the body we'll type less than button greater than and inside
the button we'll have the text click now let's say that we want to run
some JavaScript code when we click this button so here we can type on click
equals double quotes and write some JavaScript inside this double quotes
quot now we're going to learn a better way of doing this called add event
listener to use add event listener first we're going to get this button and put
it into our JavaScript using document. query selector so let's add a class to
this button so we can select it and we'll set it to
js- button and now inside the script element
we're going to use document. query
selector brackets and the string do js-
button so now let's save this button in a variable so we can use it later at the
front we'll type const button element equals this
result now every HT H ml element has a method called add event listener add
event listener let us run some code when we interact with the element so it sort
of does the same thing as onclick so at the bottom let's type
button element dot add capital E Event capital
L listener and brackets
so add event listener has two parameters the first parameter is the event or what
type of interaction we want to listen for so between these brackets let's type
the string click so this will run some code when we
click the button the way to find these event names is to look at this attribute
the word after on is the event next the second parameter is a
function that we want to run when we click this element so we'll type a comma
and because we're passing a function into another function we're going to use
an arrow function so we'll type brackets arrow and curly
brackets so inside here let's just do console. log string click
and save and now when we click this button
it will run this function and display click so this code does the same thing
as the onclick attribute however add event listener has some advantages over
using an attribute first it lets us add multiple event listeners for an event
for example let's add another click event listener we can select this
code and rightclick
copy and then down here rightclick and
paste and let's change this to log click to if we
save and click the button it will run both these functions
so add event listener let us add multiple listeners to one event another
advantage of doing this is that we can remove an event listener using a method
called remove event listener so under this code we can type
button element do remove capital E Event
capital L listener and brackets and remove EV listener also has
two parameters the first parameter is the
event so in this case it is the string click and we'll type a comma and the
second parameter is the function that we want to remove so that when we click
this button it will no longer run that function now we can't just type a copy
of this function we need to use this exact function inside remove event
listener to do that we'll save this in a variable first so above this let's
create a variable
const event listener equals and we'll select this
code right click copy and in here right click and
paste and now we'll replace this with the VAR
variable event listener and down here we'll remove this
same variable event
listener if we save and click the button again it will
only display click two because we added this event listener and then we removed
it so it will no longer run this function when we click the button so as
you can see add event listener gives us more control
over event listeners we can add multiple listeners to an event and we can also
remove a listener from an event so because of these advantages the best
practice is to use add event listener instead of an onclick attribute so let's
go back into our projects and switch to using add event listener we'll start
with the rock paper scissors project so we'll open our
files and we'll open 12 rock paper scissors and click here and
save and we'll scroll up to 12 rockpaper scissors. JS and for the video I'll drag
this down to the bottom and I'll hide the files for
now and then rearrange the windows and finally open the tab for
this file now let's go to the HTML we'll scroll up
to these move buttons which is up here so here we're using the onclick
attribute and we're going to switch it to add event listener so first let's get
this button into our JavaScript We'll add a class so we can
select it js-
rock- button and
save and then down here let's go below the autoplay
function right here and we'll use add event listener so we'll get this button
into our JavaScript using document do query
selector brackets and a string dot js-
ro- button and we're going to use dot add
event listener
brackets so we're going to listen for a click and a comma and we'll give it a
function that we want to run so a common mistake here is to actually run the
function for example play game brackets and the string
Rock so we're supposed to give a function to add event listener however
this doesn't result in a function this will actually run play game and give us
the return value which is undefined so this code will actually result in
undefined and then we're giving undefined to add event listener so it
won't work so in order to give add event
listener a function we need to create a function here
so let's remove this code and we'll create a function using brackets arrow
and curly brackets and then inside this function
we're going to call play game so we'll type play game brackets and
rock so now when we click the rock button it will run this function and
play the game so let's remove the onclick
attribute and save the HTML and also save the
JavaScript and then go to our project and click the rock button you can see
that it works except this time we're using add event listener so let's do the
same thing for the paper and the scissors button feel free to pause the
video if you want to try it yourself so we'll scroll down here and
let's add a class to the paper button so we can select it
js- paper- button and then in our JavaScript
we'll make a copy of this code so right click
copy and then down here right click and
paste and now we're going to replace the rock button
with paper and when we click this button
we're going to play the game with paper now let's
save and we'll remove the onclick attribute and save the
HTML if we click the paper button it works as
before finally let's do the scissors button so we'll add a class Js
s- scissors dasb button and then inside our JavaScript
we'll make a copy of this rightclick copy and then down here create some new
lines rightclick and paste and now switch to the scissors
button and play game with scissors let's save
and remove the onclick attribute save the
HTML and try the scissors button so everything still
works and I'll leave switching the reset score button and the autop playay button
as exercises so now let's try add event
listener with a different event we'll use it with key down so let's say that
in our project we want to make it so we can play the the game with our keyboard
if we Type R it will play Rock if we type P it will play paper and if we Type
S it will play scissors let's go into our
JavaScript and we'll scroll down and we're going to add an event
listener to the body this time so that if we type anywhere on the page we can
run some code so we're going to get the body element using document
body and then add event listener and
brackets this time the first parameter or the event will be the string key
down and let's type comma and give it a function that we want to run brackets
arrow and curly brackets inside here let's just type
console.log key down forap and
save so now if we go to the project and we open the console
rightclick and click inspect click the
console and then click on the page if we type a key on our
keyboard it will run this function and display key down so now we have to check
what key was pressed and play the game so how do we know which key that we
pressed earlier in this course we used the attribute on key down and we learned
that it gets a special object called event and the event object contains
which key was pressed add event listener also provides this event object but it
provides it as a parameter to this function so inside the round brackets
let's add a parameter event now every time we type on our
keyboard add event listener will save the event object in here and run the
function and this event object contains the key that we
pressed so in the console.log let's display event. key this time and
save now if we click on the page and type R
event. key will contain R if we press P event. key will contain P so that's how
we know which key we pressed so now let's close this and instead of
console.log we'll create an if statement to check which key we pressed so if
brackets and curly brackets and here we'll check if event.
key is equal to the string R if it is we're
going to play the game with rock so inside here we can just run this play
game function play game and brackets and
inside we'll type the string Rock now let's check if we pressed P so
we'll add another Branch else if brackets and curly brackets and in the
second condition we'll check if event. key is equal to the string P if it is
we'll play the game with paper so inside here we'll run play game brackets and
the string paper and finally we'll check if we pressed s so at the end We'll add
another else if brackets curly brackets and inside here we'll check if event.
key is equal to the string s if it is we'll play the
game with the string scissors now let's
save click our page and type R and it plays the game with rock if we
type P it will play the game with paper and if we Type S it will play the game
with scissors so that's an example of using
add event listener with a different type of event with a key down if we need the
event object we can get it using a parameter up here so those are all the
features we're going to create for our rock paper scissors project
now let's move on to the to-do list project and switch to add event listener
we'll go into our code editor click up here and find 12 to-do list.
HTML we'll also scroll up to the scripts folder find 12 to-do
list.js and open this file and I'm going to put it at the bottom here so I can
see it side by side I'll close this for now
and close rock paper scissors and then open the tab for this
project okay so let's start by switching the add button to use add event listener
we'll go into our HTML and find the add button which is here and we're going to
add a class so we can select it in JavaScript
js- add- too dasb button
now let's go to our JavaScript and scroll
down above the add Todo function we'll get this button into our
JavaScript using document. query
selector brackets and then a string Dot and the class we want to get
js- add- too dasb button and then after this we use do add event
listener brackets inside these brackets we'll
give it the event the string click comma and then a function to run when this
event happens so brackets arrow and curly
brackets and in here we just want to do the same thing as the onclick attribute
which is ADD too and call this function let's
save and then in the HTML let's remove the onclick
attribute and save and let's try it out so we'll type
A too watch
YouTube select a due date and then click add
and the add button still works as before but we're just using add event
listener next let's switch all the delete buttons let's scroll up to where
we create these delete buttons which is here and first We'll add a class to all
the delete buttons so we can select them in
JavaScript js- delete D too dasb button
and now we're going to use document. Query selector and add an event listener
to all of these buttons however there's two problems here first is that at this
point in the code this is just a string we haven't actually put this button on
the page yet we do that down here in this line of code we put the HTML that
we generated onto the page so in order to add an event listener we need to put
the HTML on the page first so we have to do it after this code so down here we're
going to type document. query
selector brackets and the string Dot and we'll select this class
js- delete Das too Dutton however there's also a second
problem here which is we're going to have multiple delete
buttons and query selector only gives us the first one so how do we select all
the buttons on the page that match this criteria instead of just the first one
to do that the document object has another method called query
selector all so query selector all will give us
all the elements on the page that have the class JS delete Todo button so down
here let's console.log this result to see what it looks like
console.log brackets and close bracket and
save and then here rightclick
inspect and the console and expand this you'll see that
document. query selector all gives us a list of elements and this list works
just like an array this is index zero or the first button and this is index one
which is the second button so now let's remove
console.log and add event listeners to all of these
buttons to do that we're going to Loop through this list of delete buttons
so again this list works like an array so we can use a for each method to Loop
through it so at the end let's type enter and tab and then dot for each and
brackets as usual we'll give for each a function that we want to run for each of
these values so we'll type brackets Arrow and curly
brackets and now every time we Loop through the list for each will give us
two parameters the first one is the value in the list which is a delete
button element so let's name it delete button and we'll type comma and the
second parameter is the index so index so now we want to add an event
listener to each delete button so inside here we'll type delete button dot add
event listener and brackets inside these brackets we'll
tell it what event we want to listen to which is the string click and comma and
then a function that we want to run when this event happens so brackets Arrow and
curly brackets so now when we click a delete
button we want to do the same thing as this onclick attribute above so let's
select this code we'll
rightclick copy and then down
here right click and paste and now we can remove these
characters because we're not in a string anymore and that's all we need to
do so to summarize we used query selector all to get a list of all the
delete buttons on the page and then we looped through the list using four each
and for each delete button we added a click event listener and ran the same
code that we did before so now we can scroll up and remove this onclick
attribute and Save go back to the page close a console and
try out the delete button and you can see that it still
works so that's how we switch the to-do list project to use add event
listener so now we're finished improving all of our
projects in the rest of this lesson we're going to learn more features that
use functions as values so let's close this for now and
we'll go back to 12 Advanced functions.
HTML and we'll open the tab for this file and let's also comment out this
JavaScript code using slashstar and star
slash let's save and now let's scroll to the bottom
of this code and create some new
lines so in this lesson we learned the array method for each which lets us Loop
through an array now we're going to learn two more array methods called
filter and map so let's start with Filter let's say we have an array of
numbers and we want to create a copy of this array with all the negative numbers
removed so let's go up here and create an array of the number one comma -3
comma 5 and type the method do filter and
brackets so Filter Works the same way as for each we give it a function so
bracket arrow and curly bracket and this function has two parameters the value
and the index so filter will take the first
first value save it in here and run the function then it will take the second
value save it in here run the function and the third value save it and run the
function now the only difference is that this time this inner function will
return a value so we'll type return and we're going to return a
Boolean like true so now the return value matters so
what filter does is it creates a new array if the inner function returns true
it will put this value in the new array if the inner function returns false it
will not put this value in the new array for example at the front let's
console.log the result of this so we'll type
console.log Open Bracket and down here close bracket and Save
so in this example the inner function always returns true so all three values
will be in the new array if we change the return value to false every time and
save all three values will not be added to the new
array so now let's use this to solve our problem we want to remove the negative
numbers from this array so inside this inner function we're going to return
true if the number is positive and return false if the number is
negative so we'll check if value is greater than or equal to
zero curly brackets will return true and include it in the new
array else will return false and not include
it in the new array so let's remove this and
save so now only values that are greater than zero will be in the new copy so
using this we can sort of filter out values based on a criteria that's why
this method is called filter now we can shorten this logic by
using this code return value greater than or equal to zero so this comparison
will return true if it's greater than or equal to zero and it will return false
otherwise so this line does the same thing as this code up here so we can
comment this out with slashstar and star slash and
save and as always we can return a truthy or falsy value instead of just
true or false the last array method we're going
to learn is called map so let's create some new lines and scroll
down and let's say we have an array of numbers again like the array 1 1 3 and
we want to make a copy of this array with each number
doubled so at the end we'll type dot map brackets and Map works just like for
each and filter between the brackets we'll give it a function bracket arrow
and curly brackets and this function will get two
parameters the first parameter is each value in the array and the second
parameter comma is the index so map will take the first value
save it in this parameter and run the function take the second value
save it in this parameter run the function third value save it and run the
function and inside this function we're going to return a
value so what map does is it creates a new array and then whatever we return
will be added to the new array so if we return
10 and then we console.log this result console.log
and close bracket and save it will create an array where each
value becomes 10 now the interesting thing is that we
can actually use the value itself in the return so here if we did value + 10 and
save it will take each value in the original array add a 10 and put it in
the new array so map will transform an array into
another array based on the return value so if we want to return an array where
each number is doubled we just have to multiply each value by two and save and
this will give us 2 26 next we're going to review some
shortcuts of Arrow functions to make this code more
compact first let's make a copy of this code rightclick
copy and down here right click and
paste so notice in the inner function we're not using index so let's just
remove it for now and now that this Arrow function only has one parameter
these round brackets are optional so we can also remove these to make the code
more compact another shortcut is if we only have one line of code in an arrow
function we can put the code on one line like
this and now the curly brackets and the return are optional so we can actually
just remove all of this code so if we have just an arrow it will
automatically return this result on the right and we don't have to type return
ourselves so this code does the same thing as the
code above but as you can see these shortcuts make our code very Compact and
clean so let's save and this will give us the same
result the last thing we're going to learn in this lesson is a feature of
functions called a closure a closure means if a function has access to a
value it will always have access to that value so let's take a look at an example
we're going to go back to the to-do list project so we'll click up here and then
scroll up to 12 to-do list.js and close this and then open the
tab for the to-do list which is here and let's scroll down to the query selector
all so we're going to focus on this inner function here so notice that this
fun function uses index from above now the interesting thing about index is
that as soon as this for each ends index gets deleted for example if we add some
new lines and we try to console.
log index and
save and then go into our project rightclick
inspect and the con it'll tell us that the index is not
defined so as soon as we end the for each Loop index doesn't exist
anymore however if we move this into the inner function so inside here and we
console.log index and
save and we click a delete button it will tell us that the index is zero so
even though index gets deleted right away down here if we click one of these
buttons later on it still has access to Index this feature is called a closure
if a function has access to a value it will always have access to that value
the value like index gets packaged together or enclosed with the function
that's why we call it a closure so even if the value index gets deleted
after the loop we can click the delete button 5 seconds later or even 5 minutes
later and this function will always have access to
index so closures are something that naturally happens as we write JavaScript
code and it's nice to know how this feature works there are some Advanced
Techniques that we can do with closures but they're not used that often so I
won't be covering them in this course but maybe in a different video now let's
remove console.log and
save and that's the end of this lesson in this lesson we learned that functions
are values we learned set time out and set interval which lets us run a
function in the future we learned an array method called for each which is a
cleaner way of looping through an array we used four each Arrow functions and
and add event listener to improve our projects we learned two more array
methods filter and map and we learned a feature of functions called
closures here are some exercises to help you practice what we learned in this
lesson in this lesson we're going to start the
Amazon Project and we're also going to learn a very useful technology called
git so first let's take a look at the Amazon Project to see how it works we're
going to go to our browser and create a new tab at the top and
we're going to type super simple dodev SL projects SL Amazon and press
enter so this is going to be the project we're going to build in this course this
is an e-commerce website that looks like Amazon where we can see a list of
products on the homepage and then we can add these products to a cart by clicking
add to cart and then we can see our cart by
clicking the top right and on this page it will show us
which products are in our cart and it will also show us the cost of our order
including shipping and taxes and once we're ready to create an order we can
click this button to create the order and it will take us to this page which
shows us a list of our past orders we can also track our order by clicking
this track package button and it will take us to this page
which tells us the progress of our order whether it's preparing it's shipped and
it's delivered so that's an overview of the
project we're going to built this is a complex multi-page website where the
different pages interact with each other to create a full app the first thing
we're going to do is to download the starting code for this project we're
going to create a new tab and here we're going to type
github.com slup
simple Dev SL JavaScript D Amazon d project and press enter
you can also find the starting code in the description by clicking
here and then going to the links for this
lesson and on this page we can see the starting code for the Amazon Project so
this code contains all the HTML and CSS that we need the reason we're going to
use some starting code instead of writing all of this ourselves is because
this course is focused on JavaScript not HTML and CSS if we were to write all of
this code ourselves it would just take up too much time and it would be an
entire course by itself if you want to learn how to create this code you can
check out my HTML and CSS full course which would teach you all the skills
that you need but for this JavaScript course we're going to start with the
HTML and CSS here and we're just going to focus on adding JavaScript to this
website so now let's download all of this code we can do that by clicking
this green code button here and then click download
zip once that's finished downloading we're going to go to our downloads
folder so for me it's this folder right here called downloads
and then we're going to unzip this file by double clicking
it and this will give us a folder that contains all the code so we're going to
select this folder and move it to our desktop next let's go to our desktop so
we're going to close this for now and I'll hide the
browser and on the desktop we're going to select the folder that we downloaded
and we're going to rename this so at the end we'll remove Main and press enter to
rename it to JavaScript Amazon Project next we're going to take this
folder and open it in our code editor so let's open vs
code and we're going to click file open
folder and we're going to find the folder that we downloaded for me it's on
the desktop and it's this folder right here so we'll click this folder and then
click select folder and then we can close this
welcome message okay so now we have our starting
code and we're going to set up the project so first let's open our browser
again and we can close the GitHub page as well as the tabs for the
previous lessons so we'll close these tabs right
here but we'll leave the final Amazon Project
open next let's go back to vs code and we're going to open this
project in our browser so we're going to select this file amazon.
HTML so this file corresponds to the homepage here so let's select this file
and then rightclick open with live server
so I'm just going to rearrange my windows here so we can see these side by
side and now we're ready to begin so let's take a look at the code that we
have to start with as I mentioned all we have here is the HTML and CSS for this
website there's currently no JavaScript at all on this
page so one thing you'll notice is that we can actually create almost all of the
website using just HTML and CSS we actually don't even need JavaScript to
create all of this we're able to create the header at the top as well as three
products to start with and this shows that HTML and CSS can pretty much create
everything that we see visually on the website where JavaScript comes in is
that JavaScript makes this website interactive so right now if we click the
add to card button it looks pretty nice but it doesn't actually do anything and
that's because we haven't added JavaScript yet so the role of JavaScript
is to make our website interactive after we created all the content and The
Styling now before we begin adding JavaScript to this website we're
actually going to take some time and learn another very useful technology
called git so git is a technology that lets us track changes in our code for
examp example do not follow along here but let's say that I'm working on this
website and I go into my code editor and I change some code here so let's say
that I add some code here and then in this file I'm going to
delete some code so I just select some code and delete it and then
save and then in this file I'm going to change some code at the bottom
so now let's say that I made a mistake and I want to undo all the changes that
I just made so how would I do that how would I remember all the code that I
changed in the different files so right now this is really difficult and this is
a problem that we run into in bigger projects we're changing lots of code in
different files and it's really hard to keep track of what code has changed and
this is where git comes in git lets us track changes in our code and it helps
us solve this problem so here's what it looks like if
I have git set up in my project I can go into this section of VSS code this
section is for git and then here git will tell me which files I changed and
if I click these files it will tell me which lines I changed and exactly which
code I changed if I want to I can click this button
to reverse all the changes in this file I can also click here to reverse
all the changes in all the files so as you can see kit helps us
track changes in our code and it lets us easily undo our changes if we need
to and this technology is really useful in bigger projects like this Amazon
Project where we're going to be changing lots of code in in many different files
so before we start this project we're going to learn how to set up and use
git the first thing we need to do is to install git to do that we can go to this
section of vs code called Source control now if this section looks like
this with a button initialize repository that means you already have git
installed otherwise if you're on Windows you can click this button and then click
open or you can go to this website directly and then click this link to
download git once it's finished downloading we're
going to run the installer and then just go with the default
options if you're using a Mac you can click up
here and then type terminal and press enter
and inside here you're going to type git and press
enter and then click this link and install
git all right after installing git we're going to restart vs
code and make sure you have the Amazon Project
open and now if if we go into the git section it should look like this with
the button initialize repository so now that we've installed
git we're going to set up git in our Amazon Project we can do that by
clicking initialize repository if this button doesn't work
for you you can also try going to the terminal menu and click new terminal
and then inside this terminal type kit in it and press
enter so a repository is just a folder where changes are being tracked by
clicking initialize repository this turns the current folder which is
Javascript Amazon Project into a repository and now all the changes
inside this folder will be tracked by git so to start off git will tell us
that all of these files are new files and that's because we just set up this
repository so all of these files are considered new changes that we're
starting to keep track of next we need to configure a username
and email with Git now don't worry this information is not used anywhere online
this is just forget to add an author to the changes that we make so to configure
a username and email we're going to go to the
top and open the terminal menu and click new
terminal and then inside here we're going to type get config
user.name and double quotes now if this looks familiar to you
and you've already done this before you can skip this step and and the next
step so between these double quotes we'll pick a username that we want to
use so for me I'll use super simple Dev and press
enter and we'll also configure an email by typing get config user. Emil double
quotes and between these double quotes we'll put an email so I'll put Simon at
superimple dodev and press
enter so now that we configured a username and email we can close this
terminal next we're going to save these changes into git so that git will start
tracking any new changes that we make to save these changes we're just going to
type type a message here describing what we changed so let's just type the
message add the starting files and then we're going to click
commit and if this popup shows up we're going to click
yes so that will take all of our changes and save them into git so now that we've
saved those changes into git any new changes that we add will start showing
up here so let's do an example and let's change some code in a couple different
files for practice so let's click this icon up here to show our code and let's
go into amazon. HTML and we'll just change this title to
intro to git and save and then let's go into checkout.
HTML and at the top let's actually remove the title and save and then let's
open orders. HTML and at the top let's just add
something to the title like page if we
save and then go into the source control section or the git
section it will tell us all the changes that we just made in our code in the
three different files if we click one of these files it will actually tell us
exactly which code that we changed now if your git section looks
like this where the changes are on top of each other instead of side by side if
you want to you can change this by clicking these three dots here making
sure that inline view is unchecked and also unchecking use inline view when
space is limited so now it's very easy to undo
this code we can just take the code on the left and then copy paste it on the
right to undo this change we can also click here to undo all the changes in
this file and up here we can also click this
button to undo all the changes in all the different
files so that's an intro to Git it helps us keep track of changes in our code and
it's very useful for bigger projects like this Amazon Project where we're
going to be changing lots of code in many different files if you want to
learn about git in more detail you can check out my git and GitHub full course
in the video description so now that we've setup git
let's start the Amazon Project so first make sure that this section is empty and
we've reversed all the changes that we made when practicing
git next let's click the this icon to show our
files and let's remove the previous code and we're going to start in the
amazon. HTML file and let's close the git page and
then open the tab for this file it should say amazon. HTML up
here so we'll start by creating the list of products on the homepage so right now
we start with three products if we go to the final project we're going to add the
rest of the products that you see here and we're also going to make this
interactive so that when we click the add to card button it will add this
product to our cart so let's go back to our
project and in order to create this we're going to learn the main idea of
JavaScript so when using JavaScript script we usually do a three-step
process the first step is to save the data and then we generate the
HTML and finally we make it interactive let's go through each step
to create this list of products so right now we have three
products on our page to start with and we're going to add more products to this
page so let's start by finding the HTML for one of these products because we can
always just copy and paste this to create another one now we're going to
learn a very important skill for bigger projects which is how to find the code
for something on this page so let's say that we want to find the code for one of
these products we're going to rightclick and click
inspect and this will bring up the console and I'm actually going to click
these three dots and click this icon to move the console to a separate window so
that we can see the whole web page so now we're going to click this icon in
the top left and we're going to hover over and
click the thing that we want to get the code for so I want to get the code for
this entire first product so I'll click in this
space and this will tell us that the code for the product is this code a div
with the class product - container so now we're going to take
this class and then search for it in our code editor so let's open vs
code and we're going to type contrl f on Windows or command F on Mac to search
for code in this file so we're going to search for the class that we saw earlier
which is product-
container and this will take us to the code for one of these products so we can
actually click the arrow on the left to collapse this code and we'll see another
product container which corresponds to the second product we can click this
Arrow again and we'll see a third product container which corresponds to
the third product so that's how we find the code
for something on the page now to add another product to this page one thing
we can do is to take this HTML and just make a copy of it at the bottom of the
page however this is not a good idea because if we add lots of products we're
going to be copying this HTML over and over and if we expand this you can see
that each product has a lot of HTML code so we don't want to be copying all of
this over and over again it's going to be a lot of code and it's going to be
hard to manage in instead another strategy is to generate this HTML code
using JavaScript so let's learn how to do that before we can do that we need to
add JavaScript to this page so we're going to create a Javascript file so
let's click up here to show our files and first let's create a new
folder to contain all of our JavaScript code so let's name this folder SC
scripts and press enter next let's click on our folder and
we're going to click this icon to create a new file and we'll name this file
amazon. JS and press enter so this will be the Javascript file for this HTML
file next inside this Javascript file let's type the code
console. log
hello just to make sure that this works and
save next we're going to load this Javascript file in our HTML file so
let's go back to amazon. HTML and then at the bottom of the code
we're going to scroll down and then right above the closing tag for the body
we're going to add a script element and we're going to give this element an
attribute SRC or Source equals double quotes and we're going to load this
Javascript file so this Javascript file is in a folder called scripts so here
we're going to type the folder name scripts and then a forward slash to go
into the folder and we'll load the file amazon. JS and
save so now let let's go back to the page and we'll open the console right
click inspect and then click the
console and it should display hello so now we're loading JavaScript on this
page so let's open up vs code again and we're going to generate all of
this HTML using JavaScript instead so the first step in our process is to save
the data what does this mean data means information so in this case the data is
the information about our products for example the products name the price
ratings and the image so right now the information about the products or the
data is inside our HTML so in our code if we click here to
expand this element you can see that the inform
about the products for example the name and the image is inside the
HTML so what we need to do is to take this data and save it inside our
JavaScript so that our JavaScript can use it so let's go to our Javascript
file and I'm just going to put it down here so we can see it side by
side and we're going to move this data into our JavaScript
so let's remove console.log and let's create a variable
to save the data so we'll type const and let's name it
products and make it equal and now we want to create
something that closely matches our data so in this case we have a list of
products so in here we're going to create an array because an array
represents a list and now each product in the list has
many values like an image a name and a price so we're going to use an object to
represent each product because an object lets us group multiple values
together so inside this array we're going to create an object using curly
brackets and now inside this object we're going to save the data for the
first product so first let's find the data in our HTML we're going to search
for the product's name by typing contrl F or command F and we'll search for
black and gray and this will take us to the code
for the first product so this is the name of the first product so let's
actually scroll up and we're going to get get the image for the first product
and we're going to take this and save it in our JavaScript so let's select this
code we're going to rightclick
copy and then inside this object let's create a property called image colon and
then here right click and paste and let's save this as a string so
at the front we'll type a single quote and at the end we'll type a single
quote so we just saved the image inside our
JavaScript let's move on and save the name inside our JavaScript so we'll
scroll down we'll select this code and then
rightclick copy and in this object we'll type comma
and a property called name col in a string
and we'll right click and paste next we're going to save the
rating into our JavaScript so we'll type comma and let's create a property called
rating colon for the rating there's actually
two parts the stars and the number of ratings that it has so let's actually
group these two values into an object because because these values are related
to each other so in here we'll make the rating and
object and each rating will have the stars and for the socks it's
4.5 comma and the rating will also have a
count and for the first product it's 87 next let's save the price into our
JavaScript so we'll create another property called
price and for the first product the price is
$10.90 however JavaScript has problems doing math with decimal numbers or
floats like this so a best practice when calculating money is to calculate in
cents instead of dollars so for this reason we're going to save the price as
cents so we'll save it as 1,90 as a reminder $1 is equal to 100
cents and because we're saving in cents it's helpful to rename this property to
price cents instead so now if we scroll up we just
saved all the information or the data about the first product into our
JavaScript next let's go to the end here and type comma and create another object
and we're going to save the data for the second product into this object so feel
free to pause the video if you want to try it yourself
first so again let's find this product in our HTML we'll go to our HTML and
type contrl f or command F to search for code and we'll search for the name
intermediate size basketball so now this is the code
for the second product we're going to scroll up a bit and find the image for
this product and we're going to select it rightclick
copy and then inside the second object we'll create an image property just like
we did up here and we'll save it as a string and
we're going to rightclick and paste and let's type comma and we'll
save the name inside the second object so we'll scroll down and select the
name and then right click copy and then down here create a string
and rightclick and paste and we'll type a comma and we'll
save the rating colon
object and we'll save the number of stars which is
four and the number of ratings that it has count colon
127 and finally we'll type a comma and we'll save the price of the product in
cents colon 295 so now the data for these second
product is saved inside our JavaScript let's go to the end and type
comma and create another object and we're going to save the data for the
third product inside again feel free to pause the video to try it yourself first
so let's save the image we'll find the code for this product in our HTML so up
here we'll typ contrl F or command F and we'll search for the product name
which is adults plain cotton
t-shirt and scroll up and we're going to save the image first so let's select
this right click copy and then down here create an image property colon and a
string and then right click and paste and we'll create a comma and let's
save the name in our Javas script next create a string and then we'll scroll
down here we'll select the name right
click copy and then in here right click and
paste and comma and we'll save the rating colon and object and we have the
number of stars for this one it's 4.5 colon and the
count and for this one it is 56 and lastly type a comma and we'll
save the price in cents colon
799 and now let's save our Javascript file now one really important thing is
to make sure that in each of these objects we have the same property so we
have the image property the name property and the same rating property
with the same structure we want all of our objects to have the same structure
so that our code can handle each product the
same so that's what it means to save the data we create something in JavaScript
that closely matches the data that we have on the Page by the way this is
called a data structure because its structure structures or organizes the
data and this represents a list of products so we usually use a combination
of objects and arrays to create a data structure in
JavaScript so now that we've saved the data the next step is to use this data
to generate the HTML instead of writing the HTML
manually to generate the HTML we can Loop through this array and for each of
these products we're going to create some
HTML so let's go ahead and loop through this array first we'll scroll down to
the bottom and we'll type the name of the
array which is products and then we'll Loop through this array using a for each
method so we'll type Dot 4 Capital each brackets and inside we create a function
using brackets arrow and curly brackets and we'll give it a parameter
called Product so I'm going to move this back
to the top here so we can see more of the code so the way that for each works
is that it takes each object saves it in this parameter called Product and then
runs the function so it takes the first object saves it in product runs the
function function takes a second object saves a product runs a function and so
on so for each of these products or each of these objects we want to create some
HTML so inside this function let's create a variable const
HTML equals and we'll create a template string using back
ticks and now inside this template string we're basically going going to
copy all the HTML for one of these products so let's go back to our HTML
file and how do we find the HTML for one product so we learned this earlier we
can rightclick
inspect and then click the top left icon and click the element we want to
get the HTML for so this HTML represents one product and we can search for this
class product- container in our code so we'll go back to our vs
code inside the HTML file we can contrl f or command F to search for code and
we'll search for the class product Das container and let's go to the first
result so we'll go to the first result which is here and let's copy all of the
code inside this ele element one trick we can do is to click the arrow on the
left to collapse it and then we'll select all this code and we'll
rightclick copy and then inside our Javascript file
inside the string we're just going to rightclick and paste the
HTML and if we need to fix the formatting we can select all of this
code and then press tab a few times to add some indexs and here we can remove
the indent and let's save so now we're basically looping
through the array of products and for each product we're creating all of the
HTML that we had before so we're generating this HTML using
JavaScript now let's console.log this HTML to make sure that it's working
we'll scroll down to the bottom and here let's
console.log the HTML that we just created if we
save and then go back to our page right click and
inspect and click the console you can see in the console that
we just generated all this HTML and we generated three of these
let's go back to our code and scroll
up now one problem here is that in the HTML that we generate we don't want to
have the name black and gray socks every time for the second product we want to
have a different name and a different image and for the third product we want
to have a different name and a different image so how do we create slightly
different HTML for each product to do that we're going to
replace this part of the code with whatever the image property is so for
here we're going to delete it and we're going to insert the property image into
this string so to insert values into a template string like this we can use
Dollar open curly bracket Clos curly bracket and then inside here we're going
to insert the product. image property so it's going to
take whatever the image property is of the product and put it inside this HTML
code same thing for the name instead of black and gray socks every time we're
going to delete this and then insert a value we're going to insert the
product Dot and we'll insert the name property this time into this HTML so dot
name and we'll do the same thing for the other pieces of data so for each product
the number of stars could be different so instead of 4.5 every time let's
delete this and we're going to insert the products rating and stars so
product. rating. Stars
one thing we have to watch out here for is that this image has to exist so right
now if we substitute the product. ratings. Stars into this we will get
this image and if we go into our files by clicking here and open the images
folder and then open the ratings folder we can see that there's no image
called rating -4.5 instead there's an image called
rating -45 so if the rating is 4.5 we should
convert it into 45 so that this image actually
exists similarly if the rating is four we should convert it into 40 so that
this image actually exists so in here we should actually multiply this by 10 so
that this points to an actual image that exists
here next let's move on and we'll work on replacing the count
so we'll remove this and dollar curly brackets and we'll replace it with the
products. rating Dot and the count property so
count and finally we're going to replace the price for each product so in here
we're going to remove this and substitute
product. price sense and remember that this is a number
in cents but when we display it on the page we want to display it as dollars so
we're going to divide this by 100 because there are 100 cents in each
dollar so now in the HTML that we're generating we're actually inserting the
details about each product if we save and then go back to the console
right click inspect and
console and look at the HTML that we generated you'll see that it's different
for each of the products so that's how we use JavaScript to generate all the
HTML here so now the last step is we're going
to combine all this HTML together into one string and put it on the web page
let's go back into VSS code and to combine all this HTML
together let's create a variable at the top for combining all the strings
together so we'll type let let's call it products cap Capital
HTML and make it equal to an empty string to start and then each time we go
through the loop we're going to add this HTML string up here so instead of
creating a new variable we're just going to add products
HTML equals itself products HTML plus this string and remember a
shortcut for this is to just type plus equals so this is called the accumulator
pattern we Loop through an array and each time we're adding to the result so
we're accumulating the result and now that we combine all the HTML into this
variable we can scroll to the bottom and let's remove this line
because this doesn't exist anymore and then after the loop let's
console.log the products HTML and
save and now if we go into our console we combined all the HTML for all
the products together and now the last step is to
take this HTML and put it on the page and we can do that using the Dom
so let's go back into our code and to use the Dom we're first
going to get an HTML element from the page and put it inside our
JavaScript so first let's go to our HTML file and remember that a product-
container represents one of these products here so we're going to look for
this element here a div products- grid so this element contains all of our
products so we're going to use the Dom to take this element put it into our
JavaScript and replace all the HTML inside so to put this element in our
JavaScript we're going to give it a class so let's add a class
js- products- grid and
save and let's go into our JavaScript so I'm just going to move this this down to
the bottom again so we can see it side by
side and then inside our JavaScript at the bottom we're going to use the Dom by
typing document. query selector brackets and a
string and we're going to type dot to select a class and we're going to select
js- products-
grid so the DOT means we're going to look for a class called JS products grid
which is right here and it's going to take this element and put it inside our
JavaScript and now we can change the HTML inside the element to do that we'll
use the property do inner Capital HTML and we'll change it to the products
HTML that we created Above So for products Capital
HTML and save so it's not going to look any
different but now we're actually generating all the HTML with JavaScript
and then using the Dom to put this HTML inside here so now we can actually
delete all of this because we're generating this with
JavaScript if we save this file our products will still be here because
even though we deleted the HTML we're now generating it with
JavaScript now one problem that I see here is that the price shows up with one
decimal but we actually wanted to show up as
10.90 so let's scroll up to this part in the code so we'll scroll up
here and look for Price sense and the reason this happens is
because price sense is 1,90 so if we divide that by 100 the
result is actually 10.9 if we want to force this to show
two decimals like 10.90 we actually have a special method
that we can use with a number so here we can add brackets around this to make
sure we calculate this number first and numbers have a special method called dot
2 Capital fixed and brackets so to fixed we'll convert a number into a string but
we can tell it how many decimals we want between the brackets if we type two it
will show two decimals so if we save now it shows correctly on the page if you're
wondering how to find this method you can find it by searching in Google or
using an AI tool okay let's let's take a break here
and take a look at git to see all the changes that we made so I'm going to
expand this here and we're going to click the get
section and it's going to tell us that we changed two files if we click the
HTML file git will tell us that we deleted
all of the HTML code for the products which is correct if we open the
Javascript file it will tell us that we added all of this new JavaScript code
including the data and the loop for generating the
HTML so git helps us track all of the changes that we made so now let's
actually take these changes and save them into git so we can track new
changes at the top let's type a message to describe the changes that we made so
let's type generate HTML with
JavaScript and click commit and yes if this shows
up so now let's talk about the benefit of generating the
HTML so let's close git for now and I'll move this to the side
here so the benefit of generating the HTML is that if we want to add another
product we don't have to copy paste all of this HTML again all we need to do is
to go up to the data and add the data for a new product so let's do an example
and add a fourth product to our list so at the end here let's type a comma and
create another object and let's go to the final
project and we'll scroll down to this four fourth product here so we're going
to take the data about this product and save it in our JavaScript so first let's
create a property image colon string and we're going to take this image and put
it in here to do that we can rightclick the image
inspect and then we're going to copy this Source attribute so we can double
click it and we can select this attribute
rightclick copy and then inside our JavaScript
we're going to right click and paste and at the end we'll type a comma
and create the name property and a string and we're going to
select this name rightclick copy and then in here
right click paste copy comma and a rating property
colon and object we have these Stars which is five and the
count which is 2,197 and at the end we're going to add
the price in cents colon 1,899 so now if we save this JavaScript
file and then go back to our project and we scroll down you'll notice
that it automatically added the fourth product and all we had to do was to add
another object to our array and then our Loop will handle generating all the HTML
for us so you can see that generating the HTML with JavaScript is a lot easier
than copy pasting this HTML every time and that's why weuse use this
technique next we're going to add the rest of the products in the final
project now one thing we could do is to manually copy this over one by one but
to make this easier inside the starting code I've actually created a file that
contains all the data so if we scroll up and close this for now and we're going
to go to this data folder and open it and inside this folder I've provided a
Javascript file called products. JS and in here it contains an array with the
data for all the products in the final project so we don't have to create it
ourselves so now let's use this products array in our code so first we need to
load this file on our page we can go to our amazon. HTML file and then scroll
down to the bottom and then at the bottom in the
script element we're going to add another script element above it so we
type script and then the source is going to be equal to this Javascript file so
we'll type the folder called data and then a slash to go into the folder and
load the file products.
JS so what this does is that it will run the files one by one
first it will run the products. JS file and create the array and then it will
run our amazon. JS file and generate the HTML so back here let's
save and then go back into amazon. JS so now instead of using our own
products array let's just use the products array in this
file so we'll go back to to amazon. JS and we're just going to delete this
array so over here we can click this Arrow to collapse the code and I'm going
to select it and then just delete it and
save so now this variable will be coming from this file if we go back to our
project and scroll down you can see that we created all the products in our final
project so the way this works is that inside our amazon.
HTML we're loading two JavaScript files this Javascript file creates all the
products and then this Javascript file Loops through the products and creates
all the HTML so keep in mind that script
elements are loaded one by one so the order matters we have to first create
the products array and then we can use it if these two were reversed then the
code wouldn't work so this is how a real world website
is created we don't write all the HTML manually instead we save the data for
the website in a data structure like this and then we use JavaScript to
generate the HTML using the data so now let's go into get and look at our most
recent changes so here it will tell us that we
changed two files in the amazon. HTML file we added a script element and then
in the amazon. JS file we deleted the products array that we created on our
own so let's type a message to describe our changes use products. JS file and
then click commit and yes now one other thing I want to show you
about git is if we go back to our files here and then open amazon. JS git has a
really useful feature called a history so we can open this timeline section and
then click this filter icon and only check git
history and now you can see that we actually have a history of all of our
changes for this file so if we click the first line in the history it will show
us that here we added all of the code and then the second line in the history
we deleted this part of the code so this gives us a step-by-step history of all
the changes in our code and in git this is called a version history you can also
see that the messages that we created when we commit show up here and these
messages help us us understand what was changed in each version in the
history all right so let's close this for
now and the last step in the process is to make it
interactive so let's take a look at our current
project so we'll go here and open this tab and let's scroll
up so right now if we click the add to cart button Buton it doesn't do anything
so we're going to add some JavaScript to make this interactive and actually add
this product to a cart so first let's find the add to cart button in our code
we'll go back to our amazon. JS file close this for
now and to find the code we can actually just search the text in the button so
inside here let's typ contrl F or command F and we're going to search for
the text add to cart and this will take us to the code
for this button so now we're going to add an event listener to this button and
make it do something when we click it to add an event listener we're first going
to add a class
js- add-2
dcart and then we're going to use the dawn to add an event listener to this
button so down here after we've put this HTML on the
page we're going to use document. Query
selector all brackets and then a string a DOT and we're going to select all the
js- add to cart so js- add-2 to- cart so this will give us
a list of all the add to cart buttons on the page and then we can Loop through
each of the buttons so we can type dot for each
brackets and then in here we'll give it a function bracket arrow and curly
brackets and a parameter so the parameter is going to be the button
element that we got from the page so now for each of these buttons we're going to
add an event listener so we can do something when we click the button to do
that we'll type button. add event
listener brackets and then the event that we want to listen for which is the
click event and then a function that we want
to run when we click this button so brackets arrow and curly
brackets so for now let's just console.log a message to make sure that
this is working so we'll console.log added
product and save and we can also remove this line
for now because we're not using it and save again and then now on our page
we're going to click add it to cart and then look inside our console so
rightclick inspect and click the
console and it displays added product so now whenever we click one of these
buttons it will display this message so that means that our code here is working
correctly next we need to figure out how to add the product to a cart and we need
to figure out what this looks like if we think about a cart a cart is basically
just a list and inside this list we have the product that we want to buy and the
quantity or the number of this product that we want to buy so we can actually
represent this in JavaScript as an array inside the array we can have some
objects and each object is going to contain the product and a
quantity so we can use something like this to represent our cart so let's go
ahead and create create this cart array now to keep things cleaner let's
actually separate the cart into its own file so we'll click up here to show our
files and then we'll go into the data folder and click this folder and click
this icon to create a new file and we'll name this file cart. JS
and press enter so this file will contain all the
code related to the cart and the reason we separate it is to keep our code
organized each file will focus on one particular thing so inside
C.J let's create our cart so we can just create a variable const cart and make it
equal to an array so we'll start off with an MD cart and let's save this
file and now we need to load this file into our
HTML so we can open amazon. HTML and again we can just add another
script element so let's add it at the top to make sure we load the cart before
running the rest of our code so we'll type less than
script and the attribute source and we'll load the data folder
slash to go inside cart. Js and
save so now it will run this file at the start and it will create an array
representing our cart so now that we have a cart we need to figure out what
happens when we click a button how do we add a product to this cart so let's go
back into amazon. JS and we'll figure this out together so down here this is
the function that is run when we click the button so in here we have to figure
out how to add this product to the cart one way to do this is to just add
an object to the cart like this we have the product's name and the quantity that
we want however when we click this button how do we know which product
we're supposed to add to the cart to solve this problem we're going to learn
a feature of HTML called a data attribute
a data attribute is just another HTML attribute except the purpose of a data
attribute is that it allows us to attach any information to an HTML element so
let's do an example and create a data attribute we're going to scroll up to
the add to card button here and then at the end of the opening tag after the
class we'll type enter and then we're going to type data Dash
and then we can type any name that we want like
product-name and we'll make it equal to double
quotes and then inside the double quotes we're going to put the product's name
like a basketball or a t-shirt so to do that we're going to insert using dollar
and curly brackets product
AME and save so now let's inspect the HTML on
the page we're going to rightclick on this add to card button and
inspect and then in the elements tab it will show us the HTML for the button and
now you can see that each of these buttons now has a data attribute called
data- product-name and it's equal to the product name
so before we continue let's learn the syntax rules for the data
attribute a data attribute is just an HTML attribute that means it follows the
same syntax rules we have an attribute name on the left and an attribute value
on the right the one difference is that data attributes have to start with data
Dash and then we can give it any name that we want like product- name but we
have to make sure to separate the words with a dash this is also known as Kabob
case so the purpose of a data attribute is that we can attach any information to
an element so here we attached the product name to this button but we can
also attach the product's image or the price and so on so now that we attached
the product's name to this button when we click this button we can actually get
the name and this will tell us which product we should add to the
cart so let's see what this looks like in our code so we'll go to our
code and then when we click the button we're first going to get the product
name from the button to do that we're going to type button and then the
property dot data set so the data set property basically gives
us all the data attributes that are attached to this button so now we're
able to get the product name so let's console.log this to see what it looks
like console.log Open Bracket close bracket
and save and then in here let's click the
basketballs add to cart button and we'll go into our console
right click inspect and
console and I'm just going to move this to the left so we can see it side by
side with our code so this is what the data set
property looks like it gives us all the data attributes that are attached to the
element so in our case we have the product name now this works just like an
object so to access the product name we just have to type dot product capital N
name so notice that the name gets converted from Kebab case to camo case
so now if we save and let's go back to our
website and click the add to card button it will get that data attribute
from the button and display it in the console if we click the socks at to cart
button this will tell us which product we should add to the cart so now that we
have the product name let's actually put this into our cart so let's go into our
code and here let's save the product name in a variable called const
Product name equals and then here we're going to add
this to the cart so we already created a cart variable
here so we're just going to type the variable cart and we're going to dot
push into the array and let's push an object because we said we wanted a
product and the quantity so we'll add an object
containing the product name which is this variable product
name and a quantity of
one and that's pretty much it we first attached the product name to the button
using a data attribute and then when we click the button we got the product name
out and then we add the product to the cart so at the bottom let's
console.log thee cart to see what it looks like if we
save and then go here and open the console right click inspect
console and let's add a basketball to our cart so we'll click here and then in
our cart we now have a basketball with a quantity of one so now let's add another
product to our cart we'll go to the t-shirt and click add to
cart and now we have two products in our cart one b basketball and one
t-shirt so now we're successfully adding products to a cart next let's try adding
one t-shirt again if we click add to cart and unfortunately this doesn't look
quite right the T-shirt product is repeated twice and each of them has a
quantity of one what we actually want to do is we want one t-shirt product with a
quantity of two because this is how we're going to
display it on the cart page so let's figure out how to achieve this and we'll
do this step by step first we'll check if the product is already in the cart if
it is in the cart we'll just increase the quantity by one if it's not in the
cart We'll add it to the cart so let's convert these steps into code so the
first step is to check if a product is already in the cart so how do we do that
let's go back to our code and one way to check this is we can
Loop through our cart and look for a particular product name so up here let's
create some new lines and let's check if this product name is already in the cart
array so we'll type cart and we'll Loop through the cart using dot for each
brackets and then inside we'll give it a function brackets arrow and curly
brackets and we'll give this a parameter and let's just call it an item so an
item will contain a product name and a quantity so we want to see if this
product name is already in the card so we're going to check if the
product name over here is equal to this item's
product name so we'll type equals the item.
product name and curly brackets so if the product names match
that means this product is already in the
cart so let's save this matching item in a variable so we can use it later so
we're going to create the variable outside the for each Loop and outside of
its scope so we'll type let matching capital I item and we'll make it
undefined to start and if we find a matching item we're going to save it in
this variable so matching item equals
item so this is how we figure out if a product is already already in the cart
now the next step is If the product is in the cart we'll just increase its
quantity by one so we'll type if
matching item and curly brackets so we can just type matching item here because
if we did find a matching item it will be an object which is a truthy value so
in here we're going to increase the matching items quantity by one using
matching item. quantity and we'll plus equal
1 and finally If the product is not in the cart We'll add it to the cart which
is basically what we do here so at the end we can just type else if we did not
find a matching item curly brackets and move this code so we'll select it right
click cut and then in here rightclick and
paste and remove the new lines and save so now let's go into our project
we'll rightclick inspect the
console and let's click the add to card button for the basketball so we'll click
this and then in our cart we have a
basketball with a quantity of one let's add a
T-shirt and now we have one T-shirt with a quantity of one and if we click add to
cart on the T-shirt again now we have a t-shirt with a
quantity of two so that's how we solve the problem of combining the quantities
together now there's one last problem that we have to solve here
which is it's not good to use the product name to identify the product in
the cart because in an e-commerce website we might actually have two
products that have the same name but from different brands so to fix this we
should give each product an ID and this ID should be unique so no two products
will have the same ID so let's use an ID to identify these products instead of
using the name we'll go back to our code and if we open our files here and
go to data products. JS you'll notice that I've actually
added an ID for each of these products and this ID is unique so I added it here
to save us a bit of work so we don't have to create the IDS
ourselves so now let's just use this ID in our code so we'll go back to amazon.
JS and then in here instead of using the product name we're going to use the
products ID to identify it in the cart but first we need to attach the ID to
the button so we'll scroll up and instead of a data- product name
attribute we're going to use a data product-id attribute and we're going to
save the products ID
instead and now down here we're going to grab the ID from the button to do that
we'll change this to product ID so remember this gets converted from Kebab
case to cam case and we'll rename this variable product
ID and then here we'll compare product ID is equal to the items product
ID and lastly when we add to the cart we're just going to add the product ID
to the cart and
save so now if we go to our website and click add to cart and check our
console and expand this you can see that we're saving the product ID so that two
products with the same name will be able to be added to the
cart okay so that's how we make the add to cart button
interactive and now we finished all three steps first we save the data for
the website in our JavaScript and then we use this data to generate the
HTML and finally we made it interactive and this is the main idea of
JavaScript this is generally how we use JavaScript on a real
website now let's go back to git so we'll open our code editor and open the
git section and review the changes that we made so we'll expand it and then in
the HTML file we just added the cart. JS file and then in here we just created
the cart array and in our amazon. JS file we basically added a data attribute
to the button and then down here we made the button interactive by adding an
event listener so now let's save these changes
into git we'll type a message to describe our
changes make add to cart button Interactive
and click commit all right so let's close this for
now and the last feature we're going to create in this lesson is we're going to
make this card quantity in the top right interactive so we'll do this step by
step first we need to calculate the quantity or the total number of products
in our cart and then we're going to put that quantity
on the page here so how do we calculate the total quantity of the cart so
remember that the cart is an array of objects and each object has a quantity
so to calculate the total quantity we can Loop through this array and add the
quantities together let's go into our code and we'll open amazon. JS and let's
scroll to the bottom so here after we update our cart
we're going to calculate the total quantity so let's create some new lines
and as we saw earlier we can Loop through the cart array so we'll type
cart dot for each brackets and a function arrow and curly brackets and
we'll give this a parameter item so this is going to Loop through
each object in the cart next we need a variable to store the
total quantity so let's create a variable up here we'll type let and name
it cart quantity and make it equal to zero to
start and then as we Loop through this array we're going to add the items
quantity to this variable up here so here we can type cart quantity plus
equals the items.
quantity so this will add up all the quantities and save it in this
variable so at the bottom let's console. log the cart quantity to make sure that
this is working so we'll save and go back to our page and open
the console rightclick inspect and console when we click add to cart on the
basketball the quantity will be one if we click add to cart on the T-shirt the
quantity will be two if we click again the quantity will be three so looking at
the cart it basically added one basketball and two T-shirts to get a
total of three so that's how we can calculate the total quantity of the cart
so now that we have the total quantity we're going going to put it on the page
here and we can do this using the Dom so let's go back to our
code and to use the Dom we first need an HTML element where we're going to put
this quantity so let's find the HTML element for this number here we can go
back to our page we're going to rightclick this number and then
inspect and then we can click this icon in the top
left hover over this number and click it so this will tell us that the code
for the number is this code right here a div with a class cart quantity so now
we're going to search for this class cart quantity in our code so let's go
back to our code and let's go to the amazon. HTML
file because the header is still in this file and we'll type contrl f or command
F to search for code and we'll search for cart Das
quantity and it will tell us that it's this line right here so next to use the
Dom we need to get this element into our JavaScript to do that we're going to add
a class to this element so let's add the class
js- cart D quantity and say save now let's go back to our JavaScript
file and I'm just going to move it down here so we can see it side by
side and we'll scroll down after we calculate the quantity let's get this
element into our JavaScript using the Dom so at the bottom we'll type
document. query selector brackets and a string we start
with a DOT and the class js- cart D
quantity and now that we have this element we can change the HTML inside
using the property do inner Capital HTML and we'll make it equal to the cart
quantity that we calculated above so let's
save and go back to our website and let's click the add to card button for
the basketball now it will update the
quantity to be one let's click the add to cart for the T-shirt it will update
the quantity again and it will be two if we click it again it will increase to
three so now the cart quantity up here is
interactive the last thing we need to do is we'll go back to our
HTML and in instead of starting at three the card quantity should start at zero
so let's save and now the cart quantity starts at
zero if we click add to cart it will increase to one so that's how we create
this cart quantity feature in the final project so now we're finished all the
features that we're going to do in this lesson let's go back to our JavaScript
and I'm just going to move it back up here
and let's clean up this code by removing these console.
logs and save and finally let's check git one
more time to see the changes that we made so we can expand this and go to the
git section if we click amazon. HTML it will
tell us we added this class and if we click amazon. JS it will show us the
code that we added for C calculating the card quantity and putting it on the
page so finally let's type a message to describe our
changes make the cart quantity interactive and
commit so now we can close this and that's the end of this lesson
in this lesson we started the final Amazon Project
we set up and learned how to use git to track changes we learned the main idea
of JavaScript which is save the data generate the HTML and make it
interactive we created a list of products on the homepage we made the add
to cart button interactive and we made the cart quantity
interactive thanks for watching this course so so far if you want to support
this channel you can check out the premium version of my courses just like
this one where you can get a certificate of completion and a Better Learning
platform if you're interested in extra videos from me more in-depth videos and
behind the scenes content you can check out these links here you can also
support the channel by liking the video subscribing and sharing this video with
others thanks again and let's continue with the course
here are some exercises to help you practice what we learned in this lesson
in this lesson we're going to learn a feature of JavaScript called modules
which is a better way to organize our code so first let's take a look at a
problem that we have in our current code we're going to go to our files here and
we're going to open amazon. HTML and then we're going to scroll to
the bottom of this file to our script tags so right now we're using three
script tags to run all of our JavaScript so this runs all the code in
cart. JS and then it runs all the code in products. JS and finally it runs all
the code in amazon. JS so this is basically the same thing as combining
all the files together into one big file and then running all of our code however
there's a big problem with using script tags like this and that problem is it
can cause naming conflicts so in our situation here we created a variable
named cart in cart. Js this means we can't use the variable
name cart in any of our other files so for example if we went to amazon.
JS and then we scroll to the top here and let's say that we try to create
another variable named cart so at the top we type const cart equals square
brackets and save and now if we go back to our
project you'll notice that the website stops working and if we rightclick
inspect and open the console it will tell us that we got an
error and it says that cart has already been declared so this is happening
because we created a variable called cart in cart. JS and then later in
amazon. JS we created another variable named cart now we can't have two
variables with the same name in JavaScript and this causes an error and
it causes our website to break so this is called a naming conflict when we have
two variables with the same name so the big problem with script tags
is if we go back to our code you can see here that it's really
hard to tell which variables have been created in other files and it's really
easy to accidentally create a naming conflict like this so that's the problem
with using script tags like this and running our code one file at a time it's
very easy to get naming conflicts so now we're going to learn
how to solve this problem using a feature of JavaScript called
modules so a module basically contains a variable inside a file so now this
variable is not going to cause conflicts with anything outside the file for
example in our project we created a variable called cart and we want to
contain this variable inside the cart. JS file so that it doesn't conflict with
the cart variable inside the amazon. JS file so we can do this using a module so
now let's learn how to create our first module we're going to go back to amazon.
HTML and then here to create a module we're simply going to delete this line
of code that uses a script tag to load cart. JS so we'll delete it and
save and you'll see that the website is working again so how does this work when
we use a script tag it will run all the code inside cart. JS so this code will
create a card variable and this will cause a naming Conflict by removing the
script tag we're no longer running the code inside cart. JS so we're no longer
creating a cart variable and it will no longer cause a naming
conflict so to create a module we simply do two steps number one we create a file
and write our code inside the file and number two don't load the file with a
script tag by doing this any variables we create inside the file will be
contained inside the file and it won't cause naming conflicts so that's
basically how we create a module okay so now we run into another
problem in our code if we open amazon. JS we created this card variable as an
example but what we actually want to do is to keep the cart variable inside
cart. JS because we want to keep all the code that's related to the cart inside
this file so in amazon. JS we're going to delete this code
and if we save and then go back to our project and
click add to cart you'll notice that it no longer works so let's look at the
console again to see what error we get we'll right click
inspect and open the console and it's going to tell us that
cart is not defined so the problem that we have here is that in this file we're
using the variable cart but now because we're not loading cart. JS using a
script tag the cart variable doesn't exist anymore it's contained inside
cart. JS and we can't access it from the outside so now we're going to learn how
to get a variable out of a file or a module to do that we're going to do
three steps the first step is to add a type equals module attribute the second
step is to export and the third step is to import let's learn these steps one by
one so the first step is to add a type equals module attribute we're going to
open amazon. HTML and we're going to scroll to the
bottom and here in the last script tag where we load amazon. JS we're going to
add an HTML attribute here so we're going to type type equal equal module
and save so the type equals module attribute
basically lets this file get variables out of other files it basically enables
this feature now the second step is to export so we're going to go to cart.
JS and now we're going to choose which variables can be accessed outside of
this file so for example we want to access the VAR variable cart outside of
this file to do that in front of the variable we're just going to type the
word export and space and save so now this variable can be used outside of
cart. JS the last step is to
import so we're going to go to the place where we're going to use this variable
which is inside amazon. JS and now at the top we're going to
tell the computer which variable we want to get from another file so we'll type
import open curly bracket close curly bracket and between these brackets we're
going to give the name of the variable we want to get which is the cart
variable and then we'll tell the computer which file we want to get this
variable from so we'll type from single quotes and and
semicolon and now inside these quotes we're going to locate the file using a
file path so let's open up our files here so it's easy to see what files we
have so right now we're in amazon. JS and we want to locate cart. JS so the
first step is we actually need to get out of the scripts folder we're in the
scripts folder and we need to get out of it and into the data folder so to get
out of the current Cent folder that this file is in we're going to type dot dot
so dot dot basically represents the folder outside of this current folder
which is this folder right here JavaScript Amazon projects and then
we're going to type a forward slash to go outside of the scripts folder so now
that we're outside of this folder we're going to go into the data folder so here
we're going to type data and then a slash to go into this folder and we're
going to locate the file cart. JS C.J and
save so what this code does is that it's going to take the variable cart out of
the file cart. JS and we use this file path here to locate that file so as a
reminder dot dot means to go outside of the current folder outside of scripts
into here and then we go into the data folder and then inside the data folder
we find cart. JS so those are the three steps to get a
variable out of a module first we add a type equals module attribute to enable
this feature and then we export the variables that we want to get out and
finally we import the variables when we need
them now there's two more things that we need to know about modules number one we
have to put all of our Imports at the top of the
file and number two in order for modules to work we need to use live server so
for example if I open the folder that contains amazon.
HTML so I open JavaScript Amazon Project and then I select this HTML file and
rightclick open with Google Chrome the website won't work and that's
because modules don't work if we open the HTML file directly like this so
let's close this for now and to get modules to work we need
to open our code editor and then rightclick the HTML
file and open with live server so in this course in order for
modules to work we need to use live server to open our HTML files
so now that we learned how to use a module let's talk about the benefits of
modules the first big benefit is that it helps us avoid naming conflicts the only
time that this causes naming conflicts is if we import this variable and we
have another variable named cart inside this file like
this so this will again create a naming conflict if I save this the website will
stop working but at least now we have control over when naming conflicts
happen they will only happen if we import the same variable name now
modules have another feature that allows us to avoid this problem as well so
after the variable name that we import we can type as and then a different name
such as my cart and save so this will basically take the input and rename it
to my cart so that this will no longer conflict with this variable name so as
you can see modules have a lot of features that help us avoid naming
conflicts when we have lots of files in our project so now I'm just going to
delete this and put the code back because that was just an example and
save so the second big benefit of modules is that we don't have to worry
about the order of our files before when we loaded everything with
script tags we had to make sure that we load cart. JS first because we need the
cart variable to be created and then we can use it in amazon.
JS so the order of our script tags really matter and it becomes really hard
to manage when we have lots of files in a big
project but now with modules we can just import the variables that we need and we
don't have to worry about the order that we're loading our
files so as you can see modules are a better way to organize our code
especially in bigger projects so now let's use git and save our changes so
we'll go to the git section here and it will tell us we changed three files in
amazon. JS we removed the script tag and added type equals module in cart. JS we
exported the cart variable and in amazon. JS we imported the cart variable
from cart. JS so now let's save these into get so here we'll type a message
use modules and import cart from cart. JS
and commit now that we learned modules let's
use them in more places in our project so let's close this for now and we're
going to open amazon. HTML and next we're going to turn
products. JS into a module as well so we'll start off by deleting the script
tag because the script tag will just load all the code onto the page so we'll
delete this and save so notice that our website stops
working and now inside amazon. JS we need to to access products from
products. JS so again we're going to do three steps the first step is to add a
type equals module attribute which we already have so we don't need to do this
again the second step is to export the variables that we want to get out so in
this case we want to get the products variable out of the products. JS file so
let's open our files and open products. Js
and we'll scroll to the top so to get the products variable out
of this file in front of the variable we're going to type export and space and
save and the last step is to import the variable that we need so inside amazon.
JS we need the products variable so at the top we're going to type
import curly brackets and then inside here we're going to type
the variable name that we want to get which is
products and we're going to get this variable from single quotes semicolon
and then inside here we're going to locate the products. JS file so we're
going to type dot dot and slash to go outside of the current folder so outside
of the scripts folder and then we're going to go into the data folder so type
data and a slash to go into the folder and we're going to locate the file
products. JS and save so now that we're importing this
variable from this file the rest of our code will work and our website will
start working again so that's how we turn products. JS
into a module as well so let's go into get and take a look at our
changes so in amazon. HTML we deleted the script tag and then in products. JS
we exported the variables that we wanted to get out and then in amazon. JS we
imported the variables that we need from the
file so let's type a message and save these changes into git import products
from products. JS and commit let's close
this and let's open amazon. HTML now the last thing is you might be
wondering should we also delete this script tag that loads amazon. JS and the
answer is no because we still need one Javascript file to load our code so this
file will import from all the other files that we created
and this is how we organize our code in a real
website so this file is called the entry point so now that we've seen some
examples of modules we're going to use modules to organize our code better so
let's go into amazon. JS and then we're going to scroll down
to the code for the add to card button so inside this file we're going to
scroll down here all the way down to this code here so this is a code that we
run when we click add it to cart and you'll notice that we're running a lot
of code here when we click that button we're running code that adds the product
to the cart and we're also running code that calculates the quantity and updates
the page so a best practice in programming is that when we have a lot
of code here that does different things it's better to split these up into
smaller functions to make our code easier to read so here this part of the
code takes the product ID and then adds it to the cart so it makes sense to
split this into its own function so let's scroll up and at the top here
let's create a function for this code so we'll type function and let's call it
add to cart brackets and curly brackets and then we're just going to move all
this code into the function so we'll select this
code and then rightclick
cut and then inside this function rightclick and
paste and then down here we're going to run this function inside here so when we
click add to cart we're going to run add to cart function that we just created
and Save so now let's give this a try so we'll
click add to cart and unfortunately it doesn't work
anymore so let's take a look at the console to see if there's any errors
we'll rightclick inspect and then open the
console and it's telling us that product ID is not defined so if we look at our
code here and scroll up in the function
you'll notice that we're using product but it's no longer anywhere in the
function and that's because product ID is outside the
function so we actually want to keep this code outside because it's using
this button so instead we're going to take product ID and put it into a
function using a parameter so at the top of the function we're going to add a
parameter product ID and then when we call this function
we're going to pass it the product ID so we're going to take this value put
it into the function and save it in here and then the function can run as normal
so now if we save and then go to our project and click add to cart you can
see that it's working again next let's go back and scroll
down and we're going to put the rest of our code into its own function as well
to make it more organized so at the top here let's create some new lines and
create a function and this code updates the card
quantity on the page here so let's name this function
update cart quantity brackets and curly brackets and we'll move this code into
the function so let's select this code and then rightclick cut and then in here
rightclick and paste and then down here we'll call the
function using update cart quantity and brackets and
save so as you can see by splitting up our code into smaller functions it makes
our code a lot easier to read when we click add to cart it's really easy to
understand what's going on first we're going to add a product to our cart and
then we're going to update the card quantity so now let's save and then go
back to our project and try it out and you can see that everything is working
again so we're going to do two more things to better organize our code so
let's go back to our code and the first thing is we're going to scroll up to the
add to cart function and I made a small mistake in the previous lesson I
actually want to rename this parameter from item to cart item instead to make
it a little more clear so we're just going to rename this to cart item and
here as well we name it to cart item and save and we'll scroll down here and
we're going to do the same thing for this parameter so we'll rename it to
cart item and then here cart item and Save
and the last thing we'll do is let's scroll up to the add to cart
function so you'll notice that this code manages our cart so it's actually a best
practice to move this function into cart. JS because cart. JS contains all
the code that's related to the cart a best practice is to group related code
together into its own file so here let's take the function add
to cart we'll select it and then rightclick
cut and then inside cart. JS we're going to rightclick and paste and just move
that function into this file because this file contains all the code that's
related to the cart so now that this function is inside the file we need to
access it from amazon. JS and we can do that using modules
using the features export and import so inside cart. JS in front of the function
we're going to export it so we can use it in other files so let's save this
file and then inside amazon. JS we're going to scroll to the
top and you'll notice that we're already importing something from cart. JS so we
actually don't need to write import again here we can actually import
multiple things from this file by typing comma and space and then something else
that we want to import so in our case we're going to import the function add
to cart so here we'll type comma add to cart so now it will import both the cart
and the add to cart function from this file so Imports can import multiple
things from a file Imports have another syntax import
Star as this Imports everything from a file and groups it together inside this
object and then we can access each import as a property or a
method so lastly I'm just going to scroll down to my code
here and I'm just going to remove this extra new line and
save now you might be wondering if we should move update cart quantity into
cart. JS as well so this function actually handles
updating the web page rather than managing the cart so we're going to keep
this function inside this file for now so now let's go into get and save
our changes so we'll go here and inside cart. JS we moved the add to cart
function and then we exported it and then inside amazon. JS we imported the
add to card function and then down here we took the
big block of code that we had before and we separated it into two functions add
to cart and update cart quantity and this made our code a lot easier to
read so now let's type a message describing our changes move add to cart
into cart. JS and commit next we're going to create the checkout
page in our final project and we're going to use modules to organize our
code again so let's open the final project and we're going to click this
cart icon in the top right and this will take us to another
page which is the checkout page so on this page we can see the products that
are in our cart so if you're wondering how that
cart icon works it basically uses is an HTML element called a link element which
looks like this link elements have a special attribute called href when we
click a link element whatever is inside the href attribute it will open it in
the page so if we put youtube.com inside the href and we click the link it will
open youtube.com in our browser if we put a file like checkout. HTML inside
href it will look for a file called checkout. HTML and open that
file so in our project if we look at our code and open our
files inside amazon. HTML we're basically just using a link
element or an a element and this has an hre of checkout. HTML so what this does
is it's going to look for a file called checkout. HTML beside the current file
amazon. HTML so here's amazon. HTML and it's going to look for checkout. HTML
beside it and then open that in our browser which is how that cart icon
works so in our browser at the top you can see that it opened checkout. HTML so
that's basically how a link element works and how we can navigate from one
page to another you can learn more about link elements in my HTML and CSS full
course but for now now we're going to learn how to build the checkout page
using JavaScript so first let's take a look at
the code for this page so again the code is inside checkout.
HTML so in our code editor we're going to open checkout.
HTML and this is a code for the page that we saw earlier that contains our
cart so just like with the homepage instead of writing all this HTML
manually we're going to use JavaScript to generate this
HTML so first we need to add JavaScript to this page so let's scroll down to the
very bottom here and right before the end of the
body we're going to create a script element to load some
JavaScript and we'll give it an attribute Source equals double quotes
and then a file we want to load so let's create a new Javascript file file for
this page so inside our scripts folder let's click amazon. JS and then click
this icon to create a new file and let's name this file checkout. JS and press
enter and now we're going to load this page inside checkout.
HTML so here in the source attribute we're going to locate this file so first
we need to go into this scripts folder so we'll type
scripts and then a slash to go into the folder and then we'll load the file
checkout. JS and next we're going to add another
attribute type equals double quotes module so remember from earlier in the
lesson this attribute enables module features for this file so now this file
can import from other JavaScript files so now let's
save and let's open checkout. JS and we'll start creating this page with
JavaScript so let's go back to our page first and take a look at the structure
of this page so you can see on this page we actually have two sections we have
the cart section on the left which shows the products in our cart and we also
have the payment section on the right which calculates the cost of our order
so let's use JavaScript to create the cart section first so remember the main
idea of JavaScript is first we're going to save the data and then we're going to
generate the HTML and finally we'll make it
interactive let's start by saving the data that we need for this section of
the page so for this section we're basically displaying a list of products
along with the quantity of each product that we want to buy and and if you
remember we already created a data structure to represent this which is our
cart inside our cart we have the ID of the product as well as the quantity that
we want to buy so we can just reuse this data structure to create this section so
let's go into our code and we're going to open cart.
JS so inside here we have an array called cart that's supposed to represent
our data here so right now our card is empty so to
make it easier for us to develop we're just going to add some default values
into this array so inside here let's create an object and put one product
into our card first so looking at this page the product that we want to put is
the socks so we'll go back into our code and I'll rearrange my windows so we can
see it side by side and we're going to get the product ID for the socks here so
we're going to go into products. JS and then here's the socks we just
going to take this ID right click
copy and then inside the cart and remember we structured our data
so that each card item has a product ID as well as a
quantity so here we're going to create the same structure that our current code
uses so we're going to give each object a
product ID colon and single quotes and we're just going to rightclick and
paste the ID that we copied earlier and then we'll type a comma and we'll give
it a quantity colon and for the first item
we're going to give it a quantity of two so we'll just create a cart that kind of
matches what we see on this page next let's create a second card item to
represent the basketball so we'll type comma curly brackets we'll give it a
product ID colon and single quotes and then we're going to get the ID for this
basketball so inside products. JS we going to scroll down to the basketball
here and we're going to copy this ID right click copy
and then inside cart. JS in here right click and
paste and we'll give this one a quantity colon one and
save so what we're doing here is we're just creating some default values that
we can use to write the code to generate this page so this is just for
development when we're actually using the website the cart will start off as
empty so so if we compare our data to our page you might notice that there's a
few things that are missing such as the product's image the name and the price
so how come we're not saving these into our data and that's because we're using
a special technique we're just saving the product's ID and then we can use
this ID to search for this product inside the products array here so using
the ID we can find all the other details of the product like the image the name
and the price so there's no need to save this data twice inside the products
array and inside the cart array all we have to do is save the ID of the product
that we want and then search for it so this technique is called duplicating the
data or normalizing the data and this is a very common technique in software
engineering okay so the one other thing that we probably need to save in our
data is the delivery times and the delivery options but we're going to
leave this for the next lesson because it requires some more features that
we're going to learn so for now we finished saving the
data that we need the next step is to use this data to generate the
HTML so let's open checkout. JS so I'm just going to drag it to the
bottom here so we can see it side by side
so the first step we need to do is to take the cart array and import it into
checkout. JS so we can use it so in here let's import curly brackets the cart
array and we're going to import it from single quotes and semicolon and we're
going to use a file path between the quotes to locate cart. JS so let's open
our files again and to get from here to here we need to go out of the scripts
folder so to do that we can type dot dot and then slash to go to the outer folder
and then we're going to go to the data folder so we'll type data slash to go
into this folder and we'll locate cart. JS so cart. JS and save and next we're
going to Loop through this cart and generate the HTML just like we did for
the homepage so let's close this for now and
here we're going to create a loop over the cart so we'll type cart. for each
brackets and a function and then we'll give it a
parameter let's call it cart item and then for each cart item here
we're going to generate this HTML so in here let's create a template
string for the HTML using back ticks and we'll create some new lines and then
here we're going to copy and paste the HTML for one of these products so first
let's find the HTML for one of these products and to do that we can
rightclick inspect and then click this top left
icon and then click the element we want to get the HTML
for so here's the HTML for one of these products and we're going to search for
this class card item container and our code so inside our
code let's open checkout. HTML and we'll type control F or command
F to search for code and we'll search for the class cart D item D
container which is this code right here so if we collapse it and collapse this
this is the code for these two products here so we're going to take this HTML
and we're going to move it into our JavaScript so we can generate it with
JavaScript so we'll right click copy and then in here right click and
paste and if we need to fix the formatting we can select all of these
lines and then press shift tab to remove some indents
and I'll add an indent here next when we're generating this HTML we want to
replace this with the actual products image and this with the actual products
name so we're going to take this card item and use it to get the data that we
need so let's open card. JS to see what each card item looks like so we have the
product ID and the quantity so first we need to use this
product ID to search for the product in order to get the other details like the
image the name and the price so to do that let's get the
product ID out of the cart item first so we'll create a variable const product ID
equals the cart item. product
ID and now we need to use this to search for the full product so the full product
if we open our files is INS inside products.
JS which is this array right here so I'm just going to move this up here so we
can see it side by side so to search inside this array we
actually need to import products into checkout. JS so let's use some module
features again at the top we'll import curly
brackets the products array and we'll import it from single quotes and
semicolon and then here we'll locate the products. JS file so we'll type do dot
slash to go out of the scripts folder and then we'll go into the data folder
data and then a slash to go into this folder and we import from products. JS
so products. JS and save so now we have
access to this products array here and we'll search the array for the full
product details so down here let's create a variable to save the
result so we'll type let and we'll name it matching
product and then down here we'll Loop through the products array so we'll type
products. for each brackets and a function and then we'll give it a
parameter product and now for each product here
we're going to check if the ID property is equal to our product ID here so down
here we'll check if the product. ID property is equal to our
product ID up here and then if they're equal that means we found the matching
product and we're going to save it in this variable so matching
product equals this product that We're looping
through so now that we have the matching product we have access to the image the
name as well as the price that we can use to generate this HTML so this is a
good example of duplicating or normalizing our data so now at the
bottom let's console.log our matching product to see
if it works so matching product and
save now if we go into our project and we rightclick inspect and check our
console you can see that we were able to get the full product details for each of
these products using the product ID so now that we have the full product
details we can use this to generate all this HTML
so down here instead of generating the same image every time we're going to use
the image in the matching product so let's get rid of this
code and here we're going to remove this and we're going to substitute using
dollar curly brackets the matching
product. image and we'll scroll down and instead
of the same product name every time we're going we're going to replace this
and we're going to substitute the matching
product. name so each time we're going to generate HTML with a different image
and a different name and down here the same thing remove the price and we'll
replace it with matching product Dot and then we'll just check here what the
property is it's called a price sense and remember this is in
and to display it as dollars we have to convert it by dividing by 100 and
save and lastly we're going to replace the quantity here so if we scroll down
we can see that this is the quantity so instead of two every time we'll
substitute and for the quantity remember it's not part of a product it's part of
our cart so each cart item has a property called called quantity so down
here we're going to substitute the cart item.
quantity and save so now we're generating all this
HTML by looping through our cart so the next step is we're going to combine all
this HTML together and then put it on the page so I'm just going to move this
up here so we can see more of the code so to combine all this HTML
together let's create a variable up here to store the result so we'll type let
and let's call it the cart summary HTML equals an empty string and now each
time we Loop through the cart we're going to add this HTML up here so that
we combine it so here we'll type cart summary
HTML Plus equals this HTML that we
generated and at the bottom I'll just add a
semicolon and then let's console.log the cart summary
HTML console.log cart summary HTML to make
sure that it worked so we'll save and then in here we'll check the console
right click inspect the console
and now you can see that we generated the HTML and each cart item is different
depending on the product that is being displayed so that's how we generate all
the HTML for this section and the last step is to take this and put it on the
page using the Dom so first we need an element that we can put the HTML inside
of to find this element let's rightclick inspect and click the top left left and
click one of these products and let's find this order
summary element because this contains both of our products here so we're going
to replace all the HTML inside here with what we generated so let's search for
the class order summary in our code so we'll go back to our code and let's open
checkout. HTML and we'll type contrl f or command
F to search for code and we'll search for the class
order- summary and then it's right
here and we're going to add a class so we can select it using the Dom so js-
order- summary and save so now let's use the Dom and put
this element in our JavaScript so inside here at the
bottom we use document. Query select VOR
brackets and the class we just created js-
order- summary and we'll use the property.
inner Capital HTML and we'll change the HTML to cart
summary HTML and we can remove this
line and now if we save we're basically generating all this
h HTML with JavaScript and then putting it on the page so now we can go back to
checkout. HTML and we can actually remove the code
inside this order summary so we can delete this
code and save and everything will still work because this is now being generated
by JavaScript so that's how we create the
cart section of this page with JavaScript let's go into get and save
our changes so we'll open the git section and then it will tell us that we
changed three files in checkout. HTML we removed all the HTML that was written
manually and then at the bottom we created a script tag to load our
JavaScript and then we also changed cart. JS and added some default values
to work with and then we created checkout. JS which loops through the
cart creates the HTML and puts it on the page so let's create a message to
describe our changes generate
HTML for the order summary and commit next let's open our project
again and before we continue we actually have two issues that we need to fix the
first issue is that the price is displaying as one decimal here instead
of two and the second issue is that these delivery options are actually
shared between the two products for example if I click this delivery option
here it will actually unselect for the second product so they're sort of shared
between the two products but what we actually want is
for each product to be able to select its own delivery options so we're going
to fix these two issues next first let's focus on the price and
we want to display it in two decimals so we actually learn how to fix
this on the homepage using the method to fixed so we're going to use the same
code here let's go into our code and we'll open our files and let's
open checkout. JS again so here we're going to scroll down
to where we display the price which is here price sense and to
show this in two decimal places we're going to surround this with brackets to
make sure we calculate it first and then use the method
do2 fixed brackets and then two to show two decimal places if we save and then
open our project now the price is displaying
correctly before we move on we're going to learn how to better organize this
code so if we go back so notice that we're using this
code inside the checkout page as well as inside amazon. JS which is the homepage
so we can actually share this code between the two files so we don't have
to repeat it and to do that we can use modules so let's open checkout. JS again
and what we'll do is we're going to create a function that does the same
thing as this code and then we can share this function between the two files so
let's create a file that's going to contain this shared function so we're
going to go to our scripts folder here and inside we're going to create a new
folder this time and let's call this folder
utils and press enter so we're naming it utils because
this code is sort of like a useful utility that we want to
share now inside this folder we're going to have different types of utils so
let's create a new file and let's name it money. JS so this
file is going to contain utilities that are related to money which is this code
right here so let's press enter and I'm just going to move this to
the bottom so we can see it side by side so now inside this UIL file we're
going to create a function that does the same thing as here and then we can share
it between the two files so here we'll create a function
and let's name it format currency because that's what this code is doing
and then brackets and curly brackets so this function is basically
going to do the same thing as here so we're going to add a parameter here
price sense because we want to use this function for
any amount of price sents and then in here we're going to do
the same thing which is price sents divid by 100 and then we're going to
surround this with brackets to make sure we calculate this
first and then display it in two decimal places using dot 2 fixed brackets and
two and finally let's return this result return and
save so what we just did is we created a function that does the same thing as
this code here and now we're going to share this function between checkout. JS
and amazon. JS so first in order to share it we need to export this function
so at the front we're going to type export and
save and now inside each of these files we're going to to import this function
and use it so let's scroll to the top and here we're going to import curly
brackets we're going to import the function format
currency and we're going to import it from single quotes and
semicolon and then inside here we're going to locate the file money. JS so
here we're in the checkout. JS file which is right here and to go here we're
first going to go into the UTS folder so we're going to Type U toils and then a
slash to go into this folder and we're going to locate the file money. JS so
money. JS now for modules we have to do one
extra thing at the front of this file path we need to type dot
slash so remember that dot dot represents the folder outside the
current folder so for checkout. JS if we go outside of this folder we're going to
go outside the scripts folder now a single dot on the other
hand means the current folder so this dot means we're going to go into the
current folder which is the scripts folder and then we're going to go into
the utils folder and then we're going to go and locate money.
JS so for modules if we want to start in the current f folder our file paths have
to start with Slash so that's one extra thing that we have to do so now that
we've imported the format currency function let's use it in the rest of our
code so we're going to scroll down to here and instead of writing this
all over again we're just going to use the function format
currency and then brackets and we're going to remove the rest of the code
here and and close bracket and save so we're basically running the same
code except we're using this shared function that's located in another file
so let's open our project and we can see that the price is
still displaying correctly so now let's go back into our
code and we're going to share this function inside amazon. JS as well so
let's open amazon. JS and then we'll scroll to where we
show the price which is here and we're going to use this function again so
first we have to import it so we'll scroll up to the top and import curly
brackets we'll import the function format
currency and we'll import it from single quotes semicolon and then here we'll
locate the file money. JS so remember for module if we want to start in the
current folder we have to type slash and then we're going to go to the UIL folder
so utils and then a slash to go inside the folder and locate the
file money. JS and now we're going to use this
function so let's scroll down and we're going to replace this
code and use format currency and brackets so we can remove the rest of
the code here and save and now let's look at our
project and we'll click up here to go back to the
homepage and you can see that the prices are displaying as two decimal
places and that's it if we look at our code again we're essentially taking this
function and sharing it across two files using modules so using modules we can re
use a lot of our code and reduce repetition next let's work on the second
issue that we saw earlier so we'll go back to our project and click the top
right to go back to the checkout page and then here the delivery options are
shared between the two products but we want each product to choose its own
delivery options so to fix that let's go back
into our code and just going to resize a here so we can see it side by
side and we'll open checkout. JS again and we can close this for
now so this is an HTML element called a radial selector and here's the code for
a radial selector so the way that radial selectors work is that if a set of radio
selectors have the same name then we can only select one of them so for example
if these three radio selectors have the same name attribute then we can only
select one of them now if the three at the top have one name and the three at
the bottom have a different name then we can select one from the first three as
well as one from the second three now what's the problem with the
radial selectors here well let's take a look at the code for these selectors to
do that we're going to rightclick one of them and then
inspect and then click the top left and click one of these selectors to get the
HTML code so here we have the code for the radio selector and you can see that
the name of the selector is delivery option one and now if we click the top
left again and find one of these bottom selectors you'll notice that these also
have the name delivery option one so all six of these have the same name at
attribute that's why we can only select one of these six at a time so what we
actually want to do is we want the first three selectors to have one name and the
second three selectors to have a different name so let's figure out how
to give these a different name so inside the console we can see the code for this
selector and we have a name attribute delivery D
option-1 so let's actually find this name in our code so we'll go to our code
editor and contrl F or command F to search for code and we'll search for
delivery Das option-1 and if we scroll
down you'll notice that every time we're generating these radio selectors we're
always using the same name delivery option one so every product is going to
have the same name for the radio selectors and all of these are going to
be shared so what we actually want to do is instead of using the name delivery
option one every time each product is going to use a different name for these
three selectors so one way we can do that is
instead of the number one every time we can replace it with the product's ID
because the ID is always unique for each product so let's substitute using dollar
and curly brackets the product
ID and then down here as well instead of using the name one every time we're
going to substitute
product. and actually we use the name matching
product so we'll scroll down and just update this to matching
product and then down here matching product and and as well down here
instead of one every time substitute the matching product. ID
and save so now these three radial selectors
will have a different name attribute than these three radial selectors that
means we can select one out of these three and we can select one out of these
three so that's how we fix that error instead of using the same name delivery
option one every time we're going to generate a name using the product's ID
so let's go into get and save our changes so in amazon. JS we imported
this shared function and we used it to format the price in two decimal places
and then in checkout. JS we also used the shared function
here and we fix the radio selectors and then in this file
moneyjar function so let's create a message to
describe our changes fix price formatting and radio
selectors and commit the last step in our process is
to make it interactive so I'm just going to close
these for now and going to move it to the right again
so we can see our project and for the order summary
there's a few things we can make interactive for now we're going to start
with this delete link when we click this link it should remove this product from
the cart so we're going to learn how to build
this so let's go back to our code and first let's add event listeners to all
of these delete links to do that we're going to find the code for these delete
links so we'll rightclick inspect and then in here this is the
code so we're going to search for this class in our code editor delete quantity
dlink so in here let's open checkout. JS and we're going to contrl f or command F
and search for delete - quantity dlink which is right
here next we're going to add a class to these elements so we can add event
listeners so at the end here let's add a class
js- delete daslink and
save and then at the bottom we're going to scroll down and then out here we're
going to add the event listeners so first we're going to select
all the delete links on the page using document. query selector all brackets
and then a string and we're going to select a class using Dot and the class
js- delete daslink and then we're going to Loop
through all these links so dot for each brackets and a
function and and in here it will give us the link every time and then for each of
these links we're going to add an event listener so
link. addevent
listener brackets and here we're going to give a
string and the event we want to listen for which is a
click and then a function that we want to run when we click these links so for
now let's just console.log string delete to make sure
that it's working so we'll save this and then in here we click these
delete links and then open the console right click
inspect console we can see that it's working now
so now let's go back to our code so when we click delete we're going
to do two steps the first step is we're going to remove the product from the
cart and the second step is we're also going to update our HTML and remove the
product from the page so let's start with the first step so when we click
delete how do we know which product we need to remove from the
cart so we learned how to do this for the added to cart button we can attach
the product's ID to the link element so let's scroll up again to where the
delete link is which is right here and we're going to attach the products ID to
this element using a data attribute so at the end here we're going to add
data- product-id equals double quotes and then
here we'll substitute the matching
product. ID and save and now that we attached the
product ID to this element we can get it in our JavaScript below so let's scroll
down and then here we're going to delete this line and using the link element we
can get that product ID using link. dat set to access the data attributes and
we're going to access product ID and let's save this in a variable so
we can use it later so const product ID equals this
value and let's console.log this to see if it
works and save so now if we go to the project and
click the delete link for the first product and then look at the console
inspect and console it will show us the products
ID if we click the second products delete link it will show us the second
products ID so now now we have the ID that we need to remove from the cart so
now how do we actually do that so before we begin figuring that out instead of
writing all the code down here let's actually create a function inside C.J to
do this task the reason we're going to do this is because cart. JS is supposed
to contain all the code that's related to the cart so this will help us
organize our code better so let's open our files again again and we're going to
open cart. JS and we're going to scroll to the
bottom and we're going to create a function for removing a product from the
cart so let's type function and let's name it remove from cart brackets and
curly brackets so this function we'll take a
product ID which we have and remove it from the cart so here let's let's create
a parameter for the ID product ID and now in here we're going to figure out
how to remove it so here's one way we can do this first we can create a new
array and then we can Loop through our cart and then add each product to the
new array except for this product ID so now let's convert these steps into code
so inside this function here let's create a new new array using const we'll
call it new cart equals an empty array the next step is we're going to
Loop through our cart so we'll type cart. for each brackets and a
function and we'll give it a parameter cart item and the last step is that
we're going to add each card item to the new array except if it has this product
ID so we can do that by checking if the cart
item. product ID is not equal to the product ID that we're looking for
product ID so if it's not equal to the product
we're trying to remove we're going to add it to the new cart so new cart. push
cart item so the result of this Loop is it's going
to contain all the cart items that don't match this product ID and that's the
same thing as removing this from the cart so now the last step is we're going
to take our new cart and replace the cart up here so we'll scroll
down and then here we'll make cart equal to our new
cart because we're reassigning this variable we have to scroll up and change
it from const to let and save so now that we created this
function let's use it in our checkout page first we're going to use the
modules feature and Export this function and
save and then inside checkout. JS we're going to import this function so I'm
just going to move this down to the bottom so we can see it side by side
so here so in checkout. JS we're going to scroll up and we're already importing
from cart. JS so we're just going to import one additional Thing by typing
comma and we're going to import this function remove from cart and
save and then we're going to use this function at the bottom so we'll scroll
down and then here we're going to remove from cart brackets and we're
going to give it the product ID we want to remove so product
ID and lastly let's just console.log the cart to make sure that this works so
console.log the card and save so now let's go into our
project and we're going to click this delete link for the first product so
delete and let's open the console right click inspect the console and now it's
going to show us that we have one product remaining in the cart and this
product has a quantity of one which is the second product here so by clicking
that delete link We successfully removed this product from the cart so now if we
refresh and tried clicking the second delete
link and look at the console and then EXP expand the cart it
will tell us that the remaining product has a quantity of two which is this
product so we successfully removed the second product from the cart when we
clicked delete so now let's go into get and look
at our changes so we'll go into this section well I can close this for now
and we'll open git and it will tell us that in C.J we change it to let and we
created this new remove from cart function and then in checkout. JS we
import that function and then at the bottom when we click the delete link
we're going to remove this product from the cart now finally we can remove this
console.log save and we're going to put these changes into git so we'll type a
message to describe our changes delete products from cart when
clicking delete and
commit the second thing we have to do when we click delete is to update our
HTML so if we go back to our project when we click delete we want to
remove this product from the page so one way we can do this is first we're going
to use the Dom to get the element we want to remove and then we can use a
method called remove so every element that we get from
the Dom has a method called remove which removes it from the page so first of all
how do we know which element to get from the page so let's actually look at the
HTML for one of these products we're going to right click
inspect and then click the top left and then click one of these products
here and this will give us the HTML so these two products are represented by
these two divs here with the class cart--
container so one way to identify which product this is for is to add a special
class to this element and this class will contain the product
ID and then if we go back to our code and we open checkout. JS and scroll to
the bottom when we click delete we have the
product ID here so we can use this to select that special class that we're
going to add so first let's add that special class to each of these elements
so we're going to scroll up to the HTML and we're going to go to the top
here to the div cart-- container and then here we'll add a
special class js- cart Das item Das container Das and
then we'll substitute the product's ID so we'll type the
matching product.
ID and let's put this class on a separate line so the line is not too
long now let's save and now we're going to scroll to
the bottom and use our code to get this class so we'll scroll to the
bottom and here we're going to use the Dom as well as this product ID to get
that special class that we just added above so here we can type
document. query selector brackets and then inside we'll type a string and
we'll select the class using a DOT js- cart D item D container Dash and then
we're going to substitute the product ID so because we want to insert something
in here we're going to switch this to a template string using
backtick and now we can substitute this product ID into this
string product ID so by creating the string like this
we're able to select the specific container that we need so now let's save
this in a variable so we can use it later so const container equals this
result so for now let's let's actually console.log this to see if it works
console.log container and
save and then we'll go back to our project so just move this
here and then in our project if we click delete on the first product and then
check the console right click inspect and the console you can see that we're
getting the correct element that we should delete if we go out here and
click this delete link and check the console you can see that this is also
getting us the correct element that we want to
delete so now that we have the element we want to delete the next step is to
use the do remove method so again every element we get with the Dom has a method
called do remove which will remove it from the page so if we go back into our
code down here all we have to do is type out the element
container. remove and brackets and this will remove it from the page if we
save and try it out so we'll go in here we'll click delete on the first product
and it will remove it from the page if we click delete on the second
product it will also remove it from the page so that's it now let's refresh to
bring the products back and that's how we make the delete link
interactive and remove the products from the cart as well as from the
page so now let's save our changes into git we'll go to the git
section and it will tell us that in checkout. JS at the top we added that
special class which contains the product ID and if we scroll down to the
bottom we created the string which will get us these specific element that we
want to remove and then we use the do remove method so now let's create a
message to describe our changes delete products from
HTML when clicking delete and commit the last thing we're going to do
in this lesson is we're going to add local storage to our cart so if we go
back to our project if we delete some products in
our cart and then refresh notice that our cart goes back
to what it was before and that's because right now if we look at our code and we
open cart. JS our cart is just a variable and
variables are reset when we refresh the page or when we go to a different page
so again if we go back to our project and we go to a different Page by
clicking the top left so on this homepage we can add as many products as
we want to our cart and if we go back to the checkout page our cart will just get
reset to whatever it is here so that's a problem with just using a variable to
save our cart it gets reset when we refresh the page or we go to a different
page to solve this problem we're going to use local storage to save our cart
so first let's create a function for saving the cart to local storage because
we might want to reuse this code so down here let's create a function we'll call
it save to storage brackets and curler brackets and we're just going to save
the cart to local storage using local storage do set item
brackets and set item takes two strings the first string is the name of
whatever we want to save so we're going to save our cart so we're just going to
call this the cart and then the second string is the data that we want to save
so remember that local storage can only save strings so to save our cart we need
to convert it into a string first and we can do that using
json. stringify brackets and then inside we're
going to give it the cart so this will convert the cart into a string and now
we can save it in local storage so now let's use this function whenever we
update the cart we need to save it to local storage so it doesn't get reset
when we refresh the page so here when we add it to the cart at the bottom after
we update the cart we're going to use that function we created above save to
to storage and brackets and also in the function remove
from cart so this function is also updating the cart so after we update the
cart we're also going to save to storage and brackets and
save so now whenever we update the cart we're going to save it in local
storage the last thing we need to do is at the top at the beginning of our code
we need to get the cart from local storage instead of using this default
value so let's add some new lines here to separate the code for a bit and here
we're going to get the cart from local storage and we can do that using local
storage. getet item and brackets so get item takes one string and that is the
name of what we saved earlier which is the cart so we're going to going to give
it the string cart so this will give us the cart that
we saved however remember that local
storage can only save strings so it will give us the string version of our cart
and we need to convert it back into an array to convert it back to an array we
can use the code json. pars and brackets and close
bracket the last thing we need to do is when we first use the website we might
not have a cart in local storage so if we don't have a cart saved local storage
will give us null so in this situation if this value is null we want to give
the cart a default value which is this value below so to give the cart a
default value if it's empty we can use an if statement by typing if brackets
and curly brackets and in here we can check if not
cart so if we don't have a cart in local storage this will give us
null in this case not null will become truthy and we're going to run the code
in this if statement so if the cart is empty we're
going to make the cart equal this default value below so let's just select
this code and we'll right click cut and then in here right click and
paste and remove the extra line and save so now if the cart is empty we just
give it a default value if we go back to our project and try out our code so
let's delete the first product and refresh the page notice that the cart
gets saved and the first product remains deleted if we go to the homepage and we
add some new products and then go to our
cart notice that our cart is saved between pages so by using local storage
we can save our cart even when we refresh the page or go between different
pages so that's all we're going to build in this lesson so to clean up let's
delete all these products in the cart and then go to the
homepage and we'll add back two socks and one basketball which which is the
default value of the cart let's go back to the checkout
page and now we're done with this part of the page so finally let's save our
changes into git we'll go to the git section and it will tell us that inside
cart. JS we're now loading the cart from local storage when we open the page if
the cart doesn't exist we're going to give it a default value and we created a
function to save the cart into local store
stage so now let's add a message to describe our
changes save cart in local storage and commit and that's the end of this lesson
in this lesson we learned about modules which is a better way to organize our
code we created the checkout page in our final project we learned about HTML link
elements and radio selectors we made the delete link interactive and we saved the
cart in local storage here are some exercises to help
you practice what we learned in this lesson e
in this lesson we're going to learn about external libraries and we're going
to finish the checkout page in our final project an external library is basically
just code that is outside of our project so far we've only been using
Code that is inside our project like these
files well a lot of developers write JavaScript code and then put their code
on the internet and we can actually load their code from the internet into our
project and use it we call this code an external library because it's code that
is outside of our project Let's do an example and load our first external
Library we're going to go to the video description and we're going to click
this link for the hello external Library
and it will open up a page that contains JavaScript code so I actually wrote this
code myself and you'll notice that this is just normal JavaScript code we create
a function called hello and it just console.log hello so this is called an
external Library it's code that is outside of our project so the cool thing
is we can actually load this code from the internet into our project so let's
give that a try we're going to go to our project and we're going to open
checkout. HTML and we're going to scroll to the
bottom and above the script tag we're going to add another script tag to load
some code so script and we'll give it a source
attribute and then in here instead of using a fth like we've done before we're
going to give this a a URL of a website that contains JavaScript code so if we
go back to our browser and here the URL of this page is
up here so we're just going to copy this right click copy and then paste it into
our code right click and
paste so now the computer will get all the JavaScript code from this URL or
from this page so it's going to get all the code
from this page and load it into our project like normal code so let's save
and let's give this a try so this code creates a function
called hello so let's try running this hello function in our project we'll go
to checkout. JS and then scroll to the top and then here let's just run the
function hello so hello and brackets and Save
now if we go back to our project go to the checkout page and
check the console right click inspect and the console you'll see that it
displayed the message hello so that's how an external Library
works it's just code that is outside of our project and we can load this code
using a script tag like this we just give it the URL of where this code is
located so there's two things you might be
wondering about how come we put the script tag at the top so generally we
load external libraries first and then we can use the library in our own code
below and the second thing is how do you put code on the internet like this to
learn this you can check out my video on how to put a website on the internet
it'll show you how to put any file like HTML CSS and JavaScript files onto a
website like this this next let's talk about why we use
external libraries external libraries let us share code instead of writing all
the code ourselves we can use code that other people wrote and this helps us
save time and avoid duplicating work right now we're loading a very simple
Library so let's load a more complex library to show how we can save a lot of
time and work let's go back to our project and go to the checkout
page here we have a section for choosing a delivery option for this product and
you'll notice that each option has a date so this is the date that the
product should be delivered by so the way this works is that the cheapest
option here takes 7 days to deliver the $4.99 option takes 3 days to deliver and
the $9.99 option takes one day to deliver so
to get these dates here we need to do three things first we need to somehow
get today's date in our JavaScript number two we need to do calculations
with the date such as ADD seven days or add 3 days and number three we need to
display the date in an easyto read format like
this now we could try to figure out how to do this ourselves by writing our own
code but this is going to be a lot of work instead we can use an external
Library to help us work with dates so in this project we're going to use an
external Library called DJs this is a popular library that helps us work with
dates so first let's load DJs into our project we're going to go to the video
description and we'll click this link for the DJs external Library
and when the page opens you'll see a bunch of random code here now you might
think that this is some special code but this is actually just regular JavaScript
code that has been compressed so basically all the extra spaces have been
removed and the variable names have been shortened to one
letter we can press JavaScript code like this because we need to load this code
from the internet into our project by compressing it it makes this code
smaller so it will load into our project faster so this compression process is
called minification or we Minify the code okay so this is the code for the
external Library DJs now let's load this code into our project we'll go back to
our code and then go to checkout.
HTML and then here we're going to add another script tag less than script and
the source attribute and then here we're going to
give it the URL of the code we want to load so let's go back to the code for
DJs and then up here we're going to rightclick and copy this
URL and then inside our code in the source attribute we're going to
rightclick and paste the URL and
save so again this will take all the code that's located on this page and
then load it into our project now let's give it a try the DJs
external Library creates a function called
DJs so we'll go to checkout. JS and then at the top we're going to run the JJs
function and brackets now make sure this is all
lowercase CU that's the name that the library used so now let's actually
console.log the result of this function console.log
and save and we'll go back to our project in
the checkout page we're going to check our
console and you'll see that the DJs function gives us an object and this
object represents the current date and time so we know that DJs is working and
that's it we successfully loaded the DJs external Library into our
project now let's learn how to use DJs external libraries usually have a
documentation page that shows us how to use the library we can find the
documentation Page by searching on Google the library name like DJs and
then documentation or we can ask an AI tool how to use the library to make
things easier in this video I'm going to show you the features that we need and
you can go through the documentation later if you want so earlier we said we
needed to do three things with the date first we want to get today's date number
two we want to do calculations with the date and number three we want to display
the date in an easyto read format DJs helps us do all of these things so first
let's use DJs to get today's date according to the documentation to get
the current date and time we can just use the DJs function like
this so if we go back to our code and that's what we have here we call DJs
and it gives us an object that represents the current date and time the
second thing we need to do is to do calculations with the date so for the
delivery options here we need to calculate today's date plus 7 days or
today's date plus 3 days so again the DJs Library can help us do
this so let's go back to our console and look at the object that we
get back from DJs so this object represents today's date and time and
this object also has a method called add which adds a certain amount of time to
this date so this is what we need for the project to calculate these dates
here let's go to our code and first let's save this result in
a variable so we're going to remove this and create a variable const today
equals DJs and then down here we're going to
use the add method so we'll type today. add and
brackets now the add method takes two parameters the first one is the number
of time that we want to add so if we want to add seven days we're going to
type seven and then the second parameter is the length of time that we want to
add so if we want to add seven days we're going to give it a string days so
this will add seven days to today's date so let's save this result in a
variable const delivery date equals this result and we'll console.log it to make
sure it's working correctly console.log the delivery date and
save now if we go back to our project and open the
console it will give us an object that represents 7 days after to date or 7
days after when you're watching this video so that's how we use DJs to do
calculations with the date it gives us methods like add to add a certain amount
of time to the date finally we're going to use DJs to display this date in an
easyto read format like this so according to the document
this date object has another method called format which will display the
date in an easyto read format so let's go back to our
code and we'll remove the console.log and we'll type delivery
date. format and then inside these brackets
we're going to give this method a string so this string tells DJs what kind kind
of format we want for the date so in the documentation it has a table showing us
some special characters we can put into this string for example if we want to
show the day of the week like Monday or Tuesday we can type four D's into the
string and this will give us a string where this text is replaced by the
actual day of the week if we want to add a comma and a
space to this format we can just add a comma and space and this will show up
directly in the result now let's say that after this we want to show the
month according to the documentation to show the month we can type for Capital
M's and it will replace this with the month and finally we'll type a space and
according to the documentation if we want to insert the day of the month into
the string we can type a capital D so this method takes this date and
converts it into a string with this format so now let's console.log this to
see what it looks like well console.log and
brackets and save and then go into our project and
open the console and now you should see the date
7 days after today but displayed in an easyto read format
so that's how we use the DJs external library to help us work with dates and
as you can see it saves us a lot of time and work we don't have to figure out how
to work with dates ourselves we can just use someone else's code to solve this
problem so a best practice in programming is when we need to do
something complicated try to find an external Library first before writing
the code ourselves to find external libraries we
can you can search in Google JavaScript and then what kind of Library we're
looking for like date Library we can also use an AI tool to
help us find external libraries next we're going to learn how
to use external libraries and JavaScript modules together right now if we look at
our code and go to checkout. HTML we're loading these libraries using
script tags the problem with script tags is that it runs this code directly on
the page and this might cause naming conflicts for example the hello Library
creates a function called hello so if something else is called hello in any of
our other code it might cause a naming conflict a better way to load external
libraries is to use JavaScript modules because a module will contain this code
inside a file and any variables that are created inside inside the file will not
conflict with anything outside of the file to use external libraries and
JavaScript modules together we're going to use a special version of the library
called an esm version esm stands for ecmascript modules ecmascript is just
another name for JavaScript so the esm version of a library is just a version
that works with JavaScript modules so let's do an example we're
going to go to the video description and we're going to open the esm version of
hello.js so you can see that it's the exact same code as before we're creating
a function called hello except this time I just added the word export in front of
function so this turns the library into an esm version and now it will work with
JavaScript modules so let's use the esm version in our code we're going to go
back to our code and we're not going to use script
tags to load this anymore so let's delete
this and save and then in checkout. JS at the top
we're going to use an import to import this function into our code so we'll
type import curly brackets we'll import the function
hello and we're going to import it from a string and then this time instead of
giving it a file path like before we're going to give it a URL that contains our
code so on the web page we're going to rightclick and copy the URL at the top
and then inside our code in here we're going to rightclick and
paste so this import works the same way as before before except now the codee is
coming from the internet rather than one of our files so let's
save and then go back to our project and check the
console and you can see that everything is still
working so that's how we use external libraries and JavaScript modules
together we just load the esm version of the library and we use import as normal
except this time we're importing from code that is on the
internet next let's use DJs with JavaScript modules to do that we're
going to load the esm version of DJs so we're going to go to the video
description and click this link for the DJs esm
version and now we're going to load this code into our project so let's go back
into our code and first let's open checkout.
HTML and we're going to remove this script tag because we're going to load
this with JavaScript modules so let's save and then go into checkout. JS and
then at the top we're going to import from the DJs esm version so we'll
import and we're going to use a slightly different syntax we're just going to
type DJs without the curly brackets and then
we'll type from a string and we're going to give it the
URL that contains the code so we'll go to our
browser and then click the URL at the top we're going to rightclick
copy and then in our code inside these quotes rightclick and
paste and save so now let's open our project and
take a look at the the console to make sure it works so we'll right click
inspect the console and everything is still working
so that's how we use the DJs external library with JavaScript modules so
before we continue we're going to learn about this new syntax that we used here
so this syntax is called a default export a default export is another way
of exporting something from a file we can use it when we only want to export
one thing from a file and it makes the syntax a little bit cleaner because we
don't have to type the curly brackets so let's do an example of a default export
to see how it works we're going to open the utils folder and open money.
JS and at the bottom we're going to create a default export by typing
export default and then whatever we want to export so let's say we want to export
this function here so we just type the name of the function format
currency and save and now when we import this we can
just import the name without the curly brackets so the syntax is a little bit
cleaner now each file can only have one default export so if we only want to
export one thing from a file this is another syntax that we can
use so some people like using default exports because they feel that exporting
only one thing from a file makes the code cleaner however in your own code
it's up to you which version of export you want to
use let's go back to checkout. JS and then here the DJs Library only
exports one thing which is the DJs function so they chose to use a default
export instead of a normal export that we were using before
by the way the syntax up here with the curly brackets is called a named
export so when we use external libraries in the future some libraries will use
named exports like this and other libraries will use a default export like
this so it's useful to know both syntaxes so that's how we use external
libraries and JavaScript modules together we just import from the esm
version of the library now keep in mind that not every library has an esm
version so for some libraries we still have to use a script
tag okay now that we learned external libraries let's do some practical
examples we're going to go back to the checkout page and we're going to use DJs
to create the delivery options here so the way this works is that we can select
one of three delivery options when we click an option it should change the
delivery date up here and it should change the prices on the right side so
let's get started as always we're going to do three steps first we're going to
save the data and then we're going to generate the HTML and finally we're
going to make it interactive so first what data do we need to save for this
section well each delivery option has a delivery time like 7 days or 3 days and
each option also has a price so right now here's what our cart
looks like now we could save the delivery option details inside the cart
like this however notice that this data gets duplicated for each product in the
cart instead we're going to save the delivery options
separately and then just save an ID that points to the delivery
option as a reminder this technique is called normalizing the data we save the
delivery options separately and then we just save an ID
that points to the full delivery option so let's create the data for the
delivery options we'll go into our code and then in the data folder let's create
a new file for this and we're going to name this file delivery options. JS and
press enter and in here we'll create a list of
delivery options that we can pick from we'll create a variable const delivery
options equals and array because we want a list and then each delivery option is
going to have multiple values like the time to deliver as well as the price so
we're going to make each of them an object to group these values together so
I'm going to rearrange my windows here so that we can see the data that we're
trying to save and we can actually close these tabs for now
so here let's save the data for the first delivery
option first let's give it an ID property because as we mentioned we're
going to save the ID in the cart and then we're going to use that ID to get
the full delivery option here so to keep things simple let's just give it a
string and an ID of one and then we're going to give it
another property and we're going to save the delivery time so for the first
option it's going to take seven days to deliver so let's create a property
delivery days colon 7 and comma and we're also going to save the price so
this one is free so we're going to save the price cents and zero remember that a
best practice when calculating money is to save it in
cents and next let's save the data for the second delivery option here we'll
type a comma and another object and let's give it an ID of two this time and
this one is going to take three days to deliver so we'll type delivery days
colon 3 and we'll give it a price cents and this one is
$4.99 so $4.99 and then finally we're going to
save the data for the third delivery option comma another object ID of three
and this one is going to take one day to deliver so we'll type delivery days
colon 1 comma and the price sense is $9.99 so price sense 999 and
save so now that we've created our delivery options for each product in the
cart we're going to save the ID of the delivery option that's selected so for
example here we selected the first First Option we're going to save an ID of one
in our cart so let's go back into our code and we're going to open the
cart so here in the default cart we're going to save the delivery option ID
colon and let's say that the first product selected the first delivery
option so we're going to save the ID one and then for the second product we're
also going to save a delivery option ID colon and then let's say that for the
second product we chose the second delivery option here so here we're going
to give it an ID of two next when we add a product to the
cart we also need to give it a delivery option ID so if we scroll down to the
add to cart function here we're adding a product to the cart so when we add a new
product we also want to give it a delivery option ID so we'll type
delivery option ID colon and for new products let's give it a default
delivery option of one so for new products to select the first one and now
let's save and lastly we might have a cart
that is saved in local storage so we'll need to add the delivery option ID to
local storage as well but to keep things simple let's just do a shortcut we're
going to delete the cart in local storage and then it will go back to
using this default value which has the delivery option
IDs so to delete the cart from local storage we're going to go into our page
and open the console right click inspect the
console and we're going to type local storage. remove item brackets and the
cart and press enter so this will erase the cart from
local storage and it will use those default values so now let's go to our
page and refresh and it should be using the
default cart so that's how we save the data for the delivery
options by the way in the rest of this course if you get an error in your
project but your code looks correct you may have some bad data saved in local
storage to fix this you can try running local storage. CLE in your console to
remove everything from local storage and then refresh the
page the next step is to generate the HTML first let's find the HTML for the
delivery options here to do that we can rightclick this part of the page and
inspect and this will give us the HTML for this
part so we're going to find the element that represents this part of the page
and that's this one right here it's a div with a class delivery Das options
and to find this in our code we're going to search for this class so let's go
back to our code and then we're going to open
checkout. JS which is right here and we'll press crlf or command F
to find code and we're going to look for the class delivery Das
options and it will give us this code right here so this is the HTML for the
delivery options so now instead of writing this
HTML directly we're going to generate this with
JavaScript to keep our code organized let's create a function for generating
this HTML we'll scroll to the
bottom and then here we'll create a function and let's call it delivery
options HTML brackets and curly
brackets and now inside here we're going to do three steps first we're going to
Loop through the delivery options we created earlier and then for each option
we're going to generate some HTML and then finally we're going to combine all
the HTML together so first let's import the delivery options at the top so we'll
scroll up and we're going to import curly brackets from quotes and
we're going to locate the delivery options file which is inside the data
folder so first we need to get out of the scripts folder we'll type dot do
slash and then go into the data folder slash delivery options. JS and we're
going to import the delivery options now one thing I forgot to do is
that inside these delivery options we need to make sure that we export this
variable so we're going to type export and
save and we'll go back to checkout. JS and then here we're going to Loop
through the delivery options below so we'll scroll back
down to this new function and type delivery options. for
each brackets and a function inside and we'll name the parameter
delivery option so for each delivery option we're
going to generate some HTML so let's use a template string to save the
HTML and then we're going to scroll up and we're going to find the class
delivery Das option so this is the HTML for one delivery option so we're just
going to copy this HTML into our Java JavaScript below so we'll right click
copy and then down here inside the string give some new lines and right
click and paste and if we need to reformat we can
select these lines and press tap okay now when we're generating the
HTML instead of using the same date every time we're going to calculate the
date using DJs and then insert it into here to calculate the date we're going
to get today's date first using DJs so up here let's create a variable
const today equals and according to the
documentation to get today's date we can just call the DJs function so we'll type
DJs and brackets next
each delivery option takes a certain amount of days to deliver so we need to
add that to today's date to do that we have a method called add So Below this
let's create a variable to save the result const delivery date
equals today. add
brackets and we're going to give it two parameters the first parameter is how
many dat days we want to add and this is saved in the delivery option so here
we'll give it the delivery option do delivery days
comma and then we'll give it the length of time we want to add which is a string
days now that we calculated the correct delivery date we need to display it in
an easyto read format and again DJs has a method called format that Let's us do
this so below let's create a variable const and we'll call it date string and
make it equal to delivery date.
format brackets and will give it a string so the format we want is we want
to insert the day of the week so according to the documentation we can
use 4ds and then a comma and a space and
then we want to insert the month and according to the documentation that's 4
Capital M's and finally we're going to insert
the day of month which is capital D so now that we calculated this date
string we're going to insert it into the HTML instead of using the same date
every time so we'll remove this and then insert the date
string next let's insert the price because it's going to be different
prices every time so at the top let's create a variable const and
we'll call it price string and make it equals and remember each delivery option
has a property price sense so if the price ense is zero we want to display
the text free if the price sense is not zero we want to display the price as
dollars with a dash so to do that let's practice using
a Turner operator so first we'll check if the price sense is zero so we'll type
delivery option. price sense is triple equals to
Z and then we'll type a new line and question mark and also a new line and
colon so remember the way that a Turner operator works is that if the first part
returns true the value is whatever is after this question Mark if the first
part is false then the value is whatever is after the colon so it's sort of like
an if statement except we can save the result in a
variable so if the price sense is zero that means it's free so we want to
display the text free so we'll create a string
free and if the price sense is not zero we want to display the price as dollars
so here we're going to type a template string a dollar sign and we're going to
insert the price sents as dollars so here we'll type delivery
option. price sense and to display this as dollars we already have a function
for this called format currency so at the front we're just going to type
format currency Open Bracket and close
bracket and then at the end let's add a dash so here we'll add space and dash
and semicolon so that's how we create the
price string for each delivery option so now let's substitute this into the HTML
so we'll remove this and substitute the price string and
save so now instead of using these same values every time we're substituting the
values in into the HTML finally let's combine all this HTML
together so we're going to scroll up to the top and outside of this loop we're
going to create a variable to save the result so let HTML equals empty string
to start and then every time we Loop through we're going to add this HTML to
this result so here we're going to type HTML plus
equals and finally after we've created this HTML we're going to return it from
this function so at the bottom we're just going to return the
HTML and save now that we generated the HTML for
the delivery options let's insert this into the HTML
above so instead of creating this HTML directly we're going to delete it
and then here we're going to insert and we're going to run this function to
generate it so here we're going to type delivery options HTML and
brackets now before we save one thing that we're missing in this function is
that if we scroll down here we're using a variable called matching product but
this variable is not accessible inside this function so let's actually pass the
matching product into here so at the top we're going to add a parameter matching
product and then when we call this function up here we're going to pass in
the matching product so matching product so now let's
save and check our page and now we're generating the HTML for these delivery
options and you'll notice that your delivery dates here will be based on
today's date or when you're watching this video so this will be 7 days after
today or 7 days after when you're watching this video this will be 3 days
after today or 3 days after when you're watching this video and this will be one
day after today now one thing we need to fix here
is that these selectors are empty however we want the delivery option that
is saved in the cart to be checked to do that let's go back to our
code and in order to make one of these selectors selected we're going to scroll
down to the input element and we're going to add an
attribute called checked and this attribute makes a
selector checked however we don't want all of
these delivery options to be checked we only want it to be checked if it matches
the delivery option ID that is saved in the cart so let's write some code up
here to figure out which delivery option should be checked we're going to create
a variable const is checked
equals and we only want it to be checked if this delivery options ID matches the
delivery option ID in the cart so we'll test if delivery option. ID is equal to
the cart item do delivery option
ID now inside this function we actually don't have access to cart item so let's
actually pass it in as a parameter cart item up here and then when we call the
function this outer function has access to the cart item so we're going to give
it the cart item so we're going to put it into this function and then we can
use it down here so now that we have this
variable instead of being checked all the time we're going to remove this and
insert and we're going to use a tary operator here is
checked question mark and colon so we can also use a ternary operator when
we're inserting into a string so again if this is true it's going to get the
value after the question mark So if it is checked we're going to give it the
value checked if this is false we're going to
give it the value of empty string so it's the same thing as if this attribute
didn't exist so now if we save you'll notice that the correct
delivery option is checked for each product the first product we saved
delivery option one and the second product we say delivery option
two finally let's replace this date at the top with the delivery date that we
selected here we'll go back to our
code and we'll scroll to the top until we see this date in our code
here so now we're going to calculate this date using the delivery option that
we picked so remember that inside the cart we only saved the delivery option
ID so let's use this to get the full delivery
option so at the top here let's get the delivery option ID out of the cart const
delivery option ID equals cart item. delivery option
ID next we're going to use this ID to find the full delivery option now we did
something similar with the product ID we Loop through the products found a
matching ID and then saved it in a variable up here so we'll do the same
let's create a variable to store the result let
delivery option and then we're going to Loop through the delivery options so
delivery options. for each brackets and a
function and let's name the parameter option because we use the name delivery
option up here so in here we're going to look for a matching ID so if this option
ID is equal to the delivery option ID here we're going to save this inside
this variable so delivery option equals option so now we have the full delivery
option in our code and we can use it to get the delivery days property and then
calculate the day that we need here to calculate this state we already
wrote some code for this at the bottom if we scroll down in our
code when we created the delivery options we calculated the date for each
delivery option so we can reuse this code above so let's select this code and
then right click
copy and then at the top after we get the delivery option
we're just going to rightclick and paste that code again
and if we need to we can reformat by selecting these lines and press shift
tab so this code will take the delivery option that we selected and calculate
the delivery date that we need to show down here and now instead of using the
same date every time we're going to remove this and insert the date string
that we created Above So date string and save so now this date string up here
will match the delivery date that we chose on the right side so that's how we
generate the HTML for the delivery options using the DJs external Library
so now let's take a look at our changes in git we'll go to our code and open the
git section and here it'll tell us in cart.
JS we added delivery option IDs to the cart
as well as when we add to the cart and then in this file we created
the list of delivery options and in checkout. JS instead of
writing this HTML directly we generated it and then in money. JS we learned
about default exports so let's type a message to describe our changes save
data and generate HTML for for delivery options and
commit the last step is to make it interactive so when we click a delivery
option we need to do two things first we need to update the delivery option ID in
the cart array and number two we need to update the page so we need to update
this date here to match the date that we select
let's start with the first step let's create a function for updating the
delivery option in the cart we're going to go to our
code and we're going to open the file called cart.
JS so because we're modifying the cart a best practice is to put the code inside
this file this file should contain all the code that manages the cart so we're
going to scroll down to the bottom and we're going to add a new function so
let's type function and let's name it update
delivery option brackets and curly brackets so when we update a delivery
option we need to know the product that we want to update as well as the
delivery option that we chose so we're going to need two things for this
function the product ID and the delivery option
ID so the steps to do this is first we're going to Loop through the cart and
find the product and then we're going to update the delivery option ID of that
product so to find the product using the product ID we already have some code for
this if we scroll up to the add to cart function we have this code which takes a
product ID and finds the matching product in the cart so let's just make a
copy of this code we're going to select it right click
copy and then paste it into our new function so down here right click and
paste so this will give us the cart item that matches this product ID and save it
in this variable next each card item has a
property called delivery option ID so we're just going to update that property
so down here we can just type the code matching item. delivery op option ID and
make it equal to the delivery option ID that we give to this function so
delivery option ID and lastly because we updated the
cart we should save it to local storage so we can use this function we
created earlier save to storage and brackets now let's
save now that we have this function let's use it on the checkout page so
first let's export it so we can use this in another file we're going to export
this function and
save and then open checkout. JS and then in our project we need to
add event listeners to each of these delivery options so we run some code
when we click them so inside our code here we're going to scroll to the HTML
for each delivery option which is right here and then we're going to add a class
so we can select it using the Dom js- delivery D option and then we'll add an
event listener to these so we'll scroll down and down here we'll add the event
listener using document. query selector all brackets
and a string will'll select that class we just created using dot js- delivery D
option and then dot for each brackets and a
function so for each option we're going to add an event listener and listen for
clicks so let's just call each of the options an
element so for each of these elements we're going to element.
addevent listener brackets and we're going to listen for clicks comma and
we're going to run this function when we click
it so as we said the first thing we'll do is to update the delivery option ID
in the cart so now let's import that function that we created earlier we're
going to scroll to the top and we're already importing from the
cart so to import something else we're going to add a comma and we're going to
import that function update delivery option so now let's scroll back down and
use use it in our code so here when we click a delivery
option we're going to update delivery option brackets now we said we need to
give this function two things the product ID that we want to updated for
as well as the delivery option ID that we picked but how do we get these two
values and the answer is if we scroll up here here we have access to the
product ID and we also have access to the delivery option
ID so we can use data attributes to attach it to this element
here so let's create a data attribute data-
product-id equals double quotes and insert the product ID which is matching
product. ID and we're also going to use a data attribute for the delivery option
data- delivery D option- ID equals double
quotes and we're going to insert the delivery option here so delivery
option. and save next let's scroll back
down and then here we're going to get those values out of the the data
attributes by using const and let's use the shorthand property here for practice
curly brackets equals the element. DAT set and then out of the data attributes
we're going to get the product ID comma as well as the delivery option
ID as a reminder this is a shorthand property it does the same thing as the
code down here but it's just a shortcut now let's
save and try out the project we'll go back and here if we click the second
delivery option and then refresh the page you'll notice that now this one is
checked and the date here is correct so that's how we make the
section interactive we just update the cart and then when we refresh the page
it will regenerate the HTML based on the new cart
now let's save our code into git we'll go back and open the git
section and then it will tell us in cart. JS we added this function for
updating the delivery option and in checkout. JS we imported
that function and then at the bottom we added some event listeners and data
attributes and we use that function to update the
card now let's add a message describe describing our changes make delivery
options interactive and
commit next when we select a delivery option we need to update the
page so right now in our project when we click a delivery option we need to
refresh the page for the text to be updated so what we're going to work on
now is when we click this we want the page to update
immediately so far in this course the way we solve this problem is once we
click this we're going to use a Dom to get this element here and then update
the text directly however the problem with this
approach is that we need to update the page one by one and later there might be
lots of places on the page that we need to update for example when we change a
delivery option we also need to change the numbers here on the right so there's
potentially a lot of things that we need to update one by one and it's easy to
make a mistake or forget something so now we're going to learn a better way to
update the page we'll go back to our code and let's open checkout. JS
again and notice if we scroll up here we already have all of this code
that takes our data and generates the HTML so another way to update the page
is after we update our data we just need to rerun all this code and regenerate
all this HTML so let's give this a try first we're going to put all of this
code inside a function so we can rerun it we're going to scroll to the
top and let's put this in a function by typing function and let's call call it
render order summary brackets and curly brackets so the word render just means
to display on the page and we're going to call this
section the order summary so this function should display
the order summary on the page next we're going to put all of this code inside our
new function so let's just remove this curly bracket
here and let's actually select all of this code and we're just going to
reformat it by pressing Tab and adding an indent and then at the end we're
going to add back that closed curly bracket to finish the
function so all we did was we put all of our code inside a
function and then at the bottom let's run this function because we still need
to run all this code at the start of our page so we're going to type render the
order summary and brackets so this shouldn't change
anything because we're just running the same code but now it's just in a
function let's save and check and everything's still working so
that's good so now let's go back into our
code and this time to update the page instead of using the Dom to update the
page directly like we did up here we're just going to rerun all of this code and
regenerate all the HTML so after we update the data we're going
to rerun the code using render order summary and
brackets now let's save and try it
out so here let's say we start off with the first delivery option if we click
the third delivery option you'll notice that the date up here updates
automatically if we click the second delivery option it updates automatically
as well so that's a better way to keep the page
up to dat instead of using the Dom and changing the HTML directly one by one we
just update the data and then regenerate all of this
HTML so let's go back into our code and there's two things that I want to point
out here so notice that we put our event listeners into this big function and
that's because when we're regenerating all the HTML we're essentially deleting
the previous HTML and replacing it so we need to add the event listeners again
and the second thing I want to point out is that inside the render order summary
function we can call render order summary
again so a function can actually call itself or rerun itself and this feature
is called recursion it's useful when a function needs to rerun all of its code
so now let's save our changes into git we'll open the git section and it will
tell us in checkout. JS we basically moved all of our code into this function
and then at the bottom we call the function at the start of the page and we
also call the function when we select a delivery option so now let's add a
message describing our changes
regenerate HTML when updating
delivery option and commit so the technique we just used
where we update the data and then regenerate all the HTML this technique
is called MVC MVC stands for model view controller
and is a popular technique in software engineering in MVC we split our code
into three parts the first part is the model this is all the code that saves
and manages the data so in our project all the code in
this data folder is called the model because this code saves and manages our
data the second part of MVC is the view this is code that takes the data and
displays it on the page so in our project if we open checkout. JS and
scroll to the top here we have code that takes our data and then generates all
the HTML so this code is called the view the last part of MVC is the
controller so this runs some code when we interact with the
page so in our project at the bottom these event listeners here would
be called the controller because they do something when we interact with the page
or with the view so in MVC we divide our code Lo
into these three parts and then they interact with each other in a
loop first we use the model to generate the
view so in our code that's what we did here we took the model or the data which
is our cart and then we generated the HTML or the view then when we interact
with the view it will run the controller so that's what we did at the
bottom here when we interact with the page we run
some code then the controller will update the
model so that's what we did here inside the controller we just updated our data
using this function and finally we use the updated
model to regenerate The View so that's what this code does it
takes the updated data and then regenerates all the HTM ml or
regenerates The View so that's how MVC Works instead of
updating the page directly with the Dom we just update our data and then
regenerate all the HTML so we use MVC because doing this
makes sure that the page always matches the
data so MVC is known as a design pattern it's a way to organize and design our
code in the future you might use a technology called a JavaScript framework
to build websites many JavaScript Frameworks are based on MVC so it's
useful to know how it works okay now that we learned the MVC
design pattern let's do some practical examples using
MBC we're going to open our project again to the checkout page and we're
going to create this payment section on the right now before we start if we look
at our code in this checkout. JS file you'll notice that we already have a lot
of code here instead of adding even more code to
this file let's actually split this up into two different
files so one file will be responsible for this left section and then one file
will be responsible for this right section we're doing this to keep our
code more organized and so that we don't have too much code in one file
so let's go back and let's create two new files for the checkout page so up
here we'll create a file and let's call this one the order summary. JS and press
enter and let's create another file for the right section and let's call this
one the payment summary. JS and press
enter now both of these files are related to the checkout page so let's
create a folder and group them together we'll create a new folder up here and
let's call it checkout and press enter and we're going to move these two files
into this new folder so we move that and we'll move
that next let's open checkout. JS and let's move all of this code into the
order summary so we'll press control a or command a to select all the code and
then rightclick
cut and then in here we're going to rightclick and
paste now there's a few things that we need to fix here so first our checkout.
HTML file is still loading checkout. JS so we actually need to run this function
inside checkout. JS instead of inside here so let's actually remove
this and save and we're going to scroll to the
top and let's export this function so we can run it inside here so we'll type
export and save and then inside checkout we're going to import curly brackets the
render order summary function from a string and to locate
this file we're going to type A do slfirst that means to start from the
current folder and we'll go into the checkout folder checkout SL orderers
summary. JS and finally we're going to run this
function when we load the page so render order summary and brackets and
save another thing we need to fix is if we open order summary .js we moved this
file into a folder so now all of these file paths need to be updated do do
slash is now inside the scripts folder and we can't find a data folder anymore
so this is going to cause an error so to find the data folder we need to get out
of the checkout folder and then we need to get out of the scripts folder so we
need to get out of two folders so we'll just add an additional do dot slash and
then same thing for this we'll add another dot dot slash and for the utils
now we need to get out of the checkout folder and then into the utils folder so
we'll change this to do/ utils and then for here we're going to
go out an additional folder so another dot dot slash and
save so now let's check if this still works we'll go to our project and
refresh and try it out and the p still works because we're
still running all of the same code but we just organized it into its own file
so now let's open git and save our changes so it's going to tell us that in
here we removed all this code and then we separated it into the order summary
file and the payment summary file which we're going to work on next so let's
type a message describing our changes move order
summary into its own own file and commit now let's start creating the
payment summary on the right side so in our code let's open payment summary.
JS and just like the order summary let's put all our code in a function so we can
regenerate the HTML if we need to so we'll type function and let's call it
render payment summary brackets and curly
brackets and let's just console.log string payment summary just
to make sure it's working so we'll save and let's export this function and then
run it inside checkout. JS so export save and then in checkout. JS at the top
we're going to import curly brackets the render payment summary function from a
string the current folder go into the checkout folder and the payment summary.
JS file and then at the bottom we're going to run the function so render
payment summary brackets and save let's go back to our project and
open the console rightclick inspect the console and we'll see the message
payment summary so now we know that our code here is working and the export is
working correctly now let's remove this code and
actually build the payment summary as always we're going to do
three steps save the data generate the HTML and make it interactive so let's
start with saving the data in MVC this is called the
model so if we go to our project for this section the data that
we need is just to calculate these numbers
here so let's start by calculating this first number here which is the cost of
the products to calculate this we can Loop through the cart and for each
product in the cart we can multiply the products price times the quantity and
then add everything together now let's convert these steps into code we'll go
to our project and inside the payment summary
file first we need to get the cart so let's import it import curly brackets
the cart from the string and we'll locate
cart. JS so first we'll go out of the checkout
folder do do slash and then go out of the scripts folder do do slash and then
into the data folder data.js and
save and now we're going to Loop through the cart so we can type cart. for each
brackets and a function and let's name the parameter
cart item so for each cart item we have the product ID and the quantity so we
need to multiply the product's price times the quantity so first we need to
use the product ID and get the full product details and we already have some
code for this inside orders summary. JS if we scroll down here we have some code
that takes a product ID and finds the matching
product now instead of copy and pasting this code let's actually put this into a
function so we can reuse this and we'll practice some modules so let's select
this code and rightclick and copy it first and then let's go into the
products. JS file and at the top we're going to
create a function so we can reuse that code so let's type function and let's
name it get product brackets and curer brackets and we're going to give this
function the product ID that we're looking for and then let's paste the
code we copied earlier right click and paste so this finds the matching product
using the product ID and then at the end of the function let's return the
matching product so we can use this outside of the function so now let's
export this function so we can share it across files so export and
save first we'll go to the order summary and at the top let's import that
function so we're already importing from product .js we're going to import
something else using a comma the get product function and then down
here instead of all this code we're going to run that function so
we make this equal to get product and run the function and we need to give the
function the product ID so let's just give that here product
ID and because we're no longer updating this variable we can change from let to
const and save let's go to our project to make
sure everything's still working so that looks
good and now let's use this function inside payment summary. JS so the same
thing we will import curly brackets the get product function from a
string and we'll go to the data folder do SL do do SL data SL
and products. JS and let's run that function to get
the full product so get product brackets and then each cart item has the product
ID so we're going to give it to the function cart item. product
ID and let's save this product in a variable so we can use it for our
calculations con product equals get product so now now as we said we're
going to multiply the product's price by the quantity so down here we can do
product and it has a property called price sense and we're going to
multiply it by the cart item and this has a property do
quantity and the last step is to add all of these
together so outside of the loop let's create a variable to save the result of
adding them together let's type let and we'll name it product price sense equals
and we'll make it zero to start and then every time we Loop through the cart
we're going to add this to this variable so we'll type product price sense plus
equals this value here and that's how we calculate the
cost of the products so at the bottom let's
console.log the product price sense just to make sure that this is working we'll
save and in our project we're going to check the
console and it will give us this number here and this number should match the
number on the page except it's in sense and assuming you also have two socks and
one basketball in your cart okay so that's how we calculate
this first number here now let's calculate the second number which is the
cost of shipping so to calculate this we're going to Loop through the cart and
add all the shipping costs together so let's go into our
code and here we're already looping through the cart so instead of creating
another loop let's just calculate the shipping cost in the same Loop so let's
create some new lines and each card item has a property
delivery option ID so we need to use this ID to get the full delivery option
which has the price so in the order summary we also have this code that
takes the delivery option ID and finds the full delivery option so again let's
create a function to share and reuse this
code so first let's select this code and we'll write click and
copy and let's go to the delivery options. Js
file and then at the bottom we'll create a
function let's call it get delivery option brackets and curly brackets and
we'll give this function the delivery option
ID and inside here we'll rightclick and paste the code that we copied earlier so
this will take this ID and get the delivery option from this array and
let's return return this delivery option so we can use it outside of this
function and just to be safe let's also give this a default value if we don't
find a delivery option so we'll use the default operator
or and let's make the default value the first delivery option so delivery
options square bracket 0 so now let's export this and
save and then inside order summary we'll use this function so at the
top we're already importing from delivery options so we'll type a comma
and get delivery option and then down here instead of
running all this code we'll select it and make this equal and run the function
get delivery option brackets and we'll give it this delivery
option ID delivery option ID and we can change from let to const
since we're not changing this variable so now let's save and let's use this
function inside payment summary as well so in here at the top we'll import curly
brackets the get delivery option function from
quotes the data folder do do slash do data slash and the delivery options. JS
file and now we'll run this function get delivery option and
brackets and each cart item has a delivery option ID so we'll put that
into the function cart item. delivery option
ID and let's save this in a variable con delivery option
equals and now we can get the price for the delivery option using delivery
option price sense property and finally we're going to add
all these together so at the top let's create a variable to save the result let
we'll call it ship shipping price cents equals zero and
when we Loop through the cart we're going to
do shipping price cents plus equals this delivery options
price and let's also console.log this to make sure it's working so shipping price
cents and Save now let's go to our project and check
the console and this value
here should be the same as adding these two numbers together in
sense so that's how we calculate the second number the shipping price so note
that this $4.99 number is just a practice number
right now the actual shipping price should be the total of adding all these
sh shipping prices together the next number we need to
calculate is the total before tax so just adding these two numbers together
inside our code let's remove these console. logs
and we'll create const total before tax sense and make it equal and we'll add
these two together product price sense Plus shipping price
sense and the next number is the tax so we're going to calculate a 10% tax on
this number here to calculate 10% of something we can multiply this by 10 /
100 that's what percent means so 10 ID 100 is also equal to
0.1 so we can also multiply this number by
0.1 let's go into our code and we'll create a variable const tax sense make
it equal to the total before tax sense times 0.1 or
10% finally to calculate the total we're going to add these two numbers together
so const total sense equals the total before tax sense Plus the tax
sense so that's how we calculate all the numbers in the payment summary and now
we have all the data that we need next we're going to generate the HTML in MVC
this is called The View so at the bottom here let's create
a variable to store the HTML const payment summary
HTML and we'll make make it equal to a template
string and then inside here we're going to copy and paste the
HTML so let's open checkout. HTML and we're going to scroll up until
we find the class payment D summary so we're going to generate all the HTML
inside here so let's actually select this HTML and move it into our
JavaScript so we'll select it up until this button and then we we can
rightclick cut and remove the new line save and
then inside the payment summary inside the screen we'll rightclick and paste
the HTML and if we need to reformat we can
select these lines and press tab a few times to
reformat it and and
save next instead of using these same numbers every time we're going to take
the numbers we calculated up here and insert it into this HTML string so
instead of 42.75 every time we're going to insert the product price
sense and let's give it some new lines to make it a little easier to
read now remember that this number is in sense and we want to display it as
dollars to do that we already have a function for this so in the utils money.
JS file we have a function format currency that displays it in dollars so
let's use this function inside payment summary so at the top let's import the
function first import curly brackets the format
currency function from a and to locate this folder we'll go out
of the checkout folder do do/ the UIL folder slash money.jpg
numbers here so this one is the shipping price so we can
insert format currency brackets the shipping price sents and let's give it
some new lines to make it a little easier to
read next let's insert the total before tax so we'll remove this number and
insert format currency bracket gets the total before tax
sents and new lines and next is the tax we'll remove
this and insert format currency brackets the tax
sense and we'll enter some new lines and finally the total so we remove this
insert format currency brackets total sense and
add some new lines and
save now before we continue I actually learned of a small issue with the format
currency function so let's open the money. JS
file and I recently learned that this two fixed method has a small issue with
rounding so for some numbers that end in five it won't round the number
properly one way to fix this issue is to round the price sense first so that this
method doesn't have to do any rounding so at the front here let's just type
math.round Open Bracket and close bracket so this is just a tricky issue
that I discovered with the help of AI recently we just need to add a little
bit of code here to fix it so now let's save this
file and go back to payment summary so now that we generated all
this HTML and inserted our numbers into it let's put this HTML on the page so
inside checkout. HTML let's give this payment summary
another class js- payment Das summary and then we'll
select this using the Dom so now let's save this
file inside payment summary at the bottom after we create the HTML we're
going to document. query selector brackets and a string and we'll select
js- payment D summary to get that element and we'll change the HTML inside
that element using do inner Capital H HTML and we'll make it equal to the
payment summary HTML that we just created so now let's
save and check our project and now these numbers on the
right should match what we have in the cart and the delivery options that we
selected so that's how we generate the HTML for this section
here now let's save our changes into git we'll open
git and it will tell us in checkout. HTML we removed the HTML we created
manually in delivery options. JS we created this shared function for finding
the full delivery option and the same thing in products. JS for finding the
full product inside checkout. JS we're now
running all the code inside payment summary in order summary we're just
using those shared functions that we created and then in payment summary we
calculated the numbers and generated all the
HTML and finally in money. JS we fixed a small bug related to rounding let's type
a message to describe our changes save data and generate
HTML for payment summary and commit
the last step is to make it interactive in MVC this is called the
controller let's go to our project and one thing we can make
interactive in this section is the place order button however we haven't figured
out how orders work yet so we'll work on this in the next lesson another thing we
can make interactive however is when we change the cart on the left these prices
should also update so let's make this interactive first when we delete a
product the prices here should update so let's actually practice using MVC to
create this functionality according to MVC when we
click delete we should update the data and then regenerate all of this
HTML so let's get started and go to the code for the delete link so this is in
the order summary section so in our code let's open the orders summary. JS
file and we'll scroll down and find the event listener for the delete link which
is right here when we click delete first we're
going to update the data so we already update the data using
this function remove from cart and now the next step according to MBC
is to just regenerate all the HTML so to regenerate the HTML for the
payment summary we created this function at the top render payment
summary so this will recalculate all the numbers and then regenerate the
HTML so let's import this function in orders summary. JS we'll
scroll to the top and down here we can import curly
brackets the render payment summary function from a string and we'll locate
the payment summary file so it's in the same folder so we're going to start with
a slash which is the current folder the payment summary. JS file and now let's
use this function in the event listener so let's scroll
down when we click delete we're going to update the data and then regenerate all
the HTML using render payment summary brackets now let's save and go to our
project focus on the numbers on the right here and now let's click
delete and you'll notice that all of these numbers updated to match our new
so that's another example of using MVC when we click delete instead of using
the Dom to change these numbers one by one we just update the data and then
regenerate all of the HTML MVC makes sure that the HTML always
matches the data or that the view always matches the
model let's do one last example of NBC for this lesson when we change the
delivery options here we also want these numbers on the right to update so let's
find the code for the delivery options again this is in the order summary
section so in our code we'll open orders summary. JS scroll down and then here we
updated the data and then we're just going to regenerate the HTML for the
payment summary using render payment summary and and
brackets now let's save and then look at our project and
let's try changing the delivery option here and you'll notice the numbers on
the right update automatically to match the cart and that's it we finished the
checkout page so now let's save our code into G we'll go into the git
section here and inside order summary we basically imported the render payment
summary function and then at the
bottom we used MVC so when we click delete we update the data or the model
and then we regenerate all the HTML or regenerate The View down here same thing
when we click a delivery option we update the data and then regenerate all
the HTML the last thing we're going to do is
at the top of this file we're going to remove this practice code
that we use to learn external libraries so let's open orders summary.
JS and at the top we're going to remove this
code and save now let's go back into
get and that looks good finally let's type a message describing our
changes make payment
summary interactive and
commit and that's the end of this lesson in this lesson we learned about external
libraries which is code that is outside of our project we learned about the DJs
external Library which helps us work with dates we also learned how to use
external libraries with JavaScript modules together as well as the default
export syntax we created the delivery section of the checkout page we learned
MBC which is a better way to design our code and we created the payment section
of the checkout page thanks for watching this course so
far if you want to support this channel you can check out the premium version of
my courses just like this one where you can get a certificate of completion and
a Better Learning platform if you're interested in extra videos from me more
in-depth videos and behind the scenes content you can check out these links
here you can also support the channel by liking the video subscribing and sharing
this video with others thanks again and let's continue with the
course here are some exercises to help you practice what we learned in this
lesson e in the rest of this course if you get an
error in your project but your code looks correct you may have some bad data
saved in local storage to fix this you can try running local storage. CLE in
your console to remove everything from local
storage and then refresh the page if you see an error like this
object object that means that you saved something directly into local storage
but you have to json.stringify it first so check your code to make sure that
you're always stringifying before saving to local storage and then clear your
local storage and refresh the page in this lesson we're going to learn
how to test our code so when we're writing code it's important to test our
code to see if it's working correctly and if you're working at a company in
the future you'll also be expected to test your code so let's learn how to do
that in this lesson the easiest way to test our code
is to just open the website and try out the code for example in our code here
let's open the file utils money.jpg server so on this website we have a
couple of prices here as well as here and we created these prices using the
function format currency so if we just look at the
website we can see that these prices look correct and this tells us that the
function format currency is working correctly so that's one way to test that
function we just open the website and try it out so this is called manual
testing when we manually open the website and try our code so manual
testing is really useful for quickly checking to see if everything is
working so now let's talk about the disadvantages of manual testing one
disadvantage is it's hard to test every situation for example here we just
happen to have the number 295 and we test with that however what
if we want to test with different numbers like the number zero or a number
that requires rounding like 2.5 in order to test all these
situations we have to manually set up our website so that our code runs with
those numbers so here we ran with 2095 as well as zero so we covered those
situations however we did not cover 2.5 so we have to do a bunch of setup in
order to test that situation so as you can see it takes a lot of time
and effort to test different situations in our code the second disadvantage of
manual testing is that it's hard to retest the code for example if we change
some of our code how do we retest format currency and make sure that it's still
working correctly well we would have to open the
website and set up all the situations again and retest all those situations
manually so this takes too much time and effort to retest the
code to solve these two problems we're going to learn another way to test our
code called automated testing automated testing basically
means using code to test code instead of manually opening the website and
clicking around to try our code we're going to tell the computer to do these
tests for us and this will save a lot of time and effort so let's go ahead and
create our first automated test we're going to go back to our
code and again let's test this format currency function to create an automated
test we're just going to write some code to test this function so first let's
create a folder to group all of our test code together we're going to click this
icon to create a folder and let's just name this tests and press enter
and we're going to move this folder so we'll drag it to the top level here
beside the HTML files so we want the test folder to be
beside the scripts folder next let's click on the test
folder and we're going to create our first test file we'll click
this and we're going to test format currency which is inside the money.jpg
money test.js so we know that this file
contains tests for money. JS so let's press
enter and inside this file we're going to write some code to test format
currency so first let's import format currency so we can test it at the top
we'll type import curly brackets format currency
from a string and from here we're going to locate money. JS so we start out in
money test.js and we need to get out of the test folder so we'll type do do
slash to get out of this folder and then we'll go into the scripts folder scripts
slash and then into the utils folder utils slash and locat
money. Js so as a reminder format currency takes a
number in cents like 295 cents and then converts it into Dollars like
$20.95 so first let's test this function using that number 2095 as an example
we're going to run the function format currency brackets and give it
295 and now we're going to check if the result of this function is correct to do
that we can just use an if statement so we'll type if Open Bracket close
bracket and we said we expect format currency
2095 to give us the string 2095 so we're just going to check if
this is triple equals to the string 2095 and curly brackets and and if these
two are equal that means the code is working correctly so we're going to
console. log the string pass to say that this test has passed
now if it is not equal to 20.95%
failed and save and that's it this is our first
automated test it checks if the result of this function is correct if it is
correct we're going to display past and if it's not correct we're going to
display failed now let's run this test code so
remember we can't run JavaScript files directly we need to load this Javascript
file using an HTML file so let's create an HTML file to run this test inside the
test folder we're going to create a new file by clicking up
here and let's name this file tests.
HTML and press enter and in here we're going to start
by creating a basic HTML structure so as a reminder at the top we'll type less
than exclamation dock type space HTML greater than and
we'll create an HTML element and then inside we'll create a
head element as well as a body
element and then inside the body we're going to create a script tag to run
JavaScript code and we're going to give the script
tag an attribute called SRC or source equals double quotes and we're going to
give it this JavaScript file to run money
test.js and also because this file uses import we also need to add an attribute
called type equals modules to give this file access to JavaScript module
features like import so now let's
save and we're going to run this file in live server so we're going to click it
and then rightclick open with live
server and then we're going to check the console by right
clicking inspect and open the
console and our code display the text passed so if we look at our
code and open money test.js it's telling us that the result
of this function matched what we expected
and this test passed so that's how we run an automated
test we just load it like normal JavaScript so as you can see automated
tests are pretty straightforward we're just using code to test
code okay so I mentioned earlier that a disadvantage of manual testing is it's
hard to test every situation now let's solve this problem
using automated tests so inside money
test.js if we want to test format currency in different situations or with
different numbers we can just add some more tests at the bottom so at the
bottom let's create some new lines and we'll just add another test using IF
brackets and curly brackets and inside here let's test
format currency with the number zero so we'll type format
currency brackets 0 and we expect this result to be the string 0.0 0 so we'll
check if this triple equals the string 0. if this result matches we're going to
console.log the string passed and if this result does not match
we're going to type else curly brackets and
console. log the string failed so that's how we test format
currency in a different situation with the number zero so now let's
save and then go back to our test page which is here and then open the console
right click inspect the
console and it will tell us that both of our automated tests
passed so as you can see automated tests help us test our code in different
situations very easily this is a lot faster than manually opening our website
and setting it up to test with different numbers so let's go back to our
code and by the way another name for a situation that we're testing is called a
test case so here instead of saying we're testing two different situations
we usually say we're testing two test cases okay now let's get more practice
and add another test case at the bottom of this file we're going to create
another if statement if brackets and curly
brackets and this time let's test format currency brackets and we'll give it a
number that requires some rounding so when we calculate the 10% tax on our
website the result could be a decimal like the number
2000.5 if we use the number 2.5 this will convert into $20 and
0.5 however we can't have 0.5 so we're going to round this up to 1
cent so we're going to have $20 And1 so let's check if this result triple
equals the string 20.1 and if it is equal we're going to
console.log past and if it is not equal else curly
brackets console.log
failed and save and open our test page and open the
con and you can see that all three of our
test cases passed and that's it we just created three test cases for format
currency using automated tests now let's go back to our
code and currently we have three test cases and you might be wondering how
many test cases should we have generally we create two types of test cases basic
test cases and edge cases a basic test case just tests if
the code is working or not so here our first test case is a basic test case we
use a normal number like 2095 and we see if format currency is
working correctly the second type of test cases
that we should have are edge cases this means we test a code with values that
are a little bit bit tricky they're on the edge of what our code can handle for
example in our test here the last two test cases are edge cases zero is sort
of a special number that's not positive or negative and
2.5 is a number that requires some rounding so these numbers are acceptable
we can use them with format currency but they're a little bit tricky and on the
edge of what our code can handle so when creating test cases make sure to
create basic test cases as well as edge cases if there are any edge
cases now we could have added another basic test case like format currency
1095 however this is very similar to 2095 it's basically testing the same
thing so we don't need another test case like this generally we should try to
test something different in each test case for example an edge case that we
have not tested is a number 200.4 so this would check if the code
rounds down correctly to $20 and0 however I'll leave creating this
test case as an exercise now let's move on and talk
about the second disadvantage of manual tests which is it's hard to retest the
code automated test also solve this problem for example let's say that we
Chang the format currency function so inside UIL money.jpg
we would have to open up the website set up everything manually and then click
around to see if it's working however with automated testing
all we need to do is to rerun all of this test code and it will instantly
retest all of these cases so let's go back to money. JS and save this
code and then go into our test page and check our console right click
inspect the console and you can see that it
instantly reruns all the test cases and it tells us that the last test case
failed so automated tests make it really easy to retest our code after we make
any changes okay now we have another problem
here we can see that the test Cas is passed passed and failed but it's not
clear which ones passed and which ones failed we don't really have a name for
these tests so we don't know what they're doing so that's what we're going
to add next we're going to give each of these tests a name so let's go back to
our code and open money
test.js and now we're going to give each of these test cases a name so above the
first test case let's just
console. log a string and we're going to give
this test a name so the name should describe what this test is doing so in
here let's just use the name converts cents into
dollars and that's how we give a test case a name let's do the same thing with
the other two test cases so down here we're going to
console.log brackets and a string and we give the second test case a name so this
one tests the number zero so let's use the name works with zero so again the
name just describes what the test is doing and let's do the same thing for
the third test case we console.log a string and here we're
testing if the function rounds up to the nearest scent so let's use the name
rounds up to the nearest scent and
save if you're wondering how I came up with these names a naming convention
that we use is to describe what the code is doing for example the code works with
zero or the code rounds up to the nearest scent and then we remove the
code some people also like to use the word it instead of the
code so now each of these test cases has a name above it if we open up our test
page and open the console now we can see exactly which
test case passed and which test case failed so this failed test case tells us
we have a rounding problem in our code so now we can go back to our code into
money. JS and investigate the rounding problem so of course we removed
math.round as an example we're just going to add it back to fix that failing
test capital m math.round Open Bracket and close
bracket and save and then open the console for our
test which is here and now all of our test cases
passed next another thing we do when naming our tests is to group related
tests together for example these three test cases are for the format currency
function so we're going to group these tests together and give this group a
name by the way a group of related tests is called a test
Suite so let's go back to our code and open Money test.js
and at the top let's give this group of tests or this test Suite A Name by
typing console.log brackets and a string we're
going to name it test Suite colon format currency and
save so now let's open the console for our
tests and now at the top it will show us test site format currency so this makes
it clear that this group of tests here are for the format currency
function in the future if we are testing some other code for example a calculated
tax function we can create another group of tests or another test Suite like this
and this makes it clear that the second group of tests is for the calculate tax
function so this is how we name our tests and group our tests together
together to make it more clear what is being tested and which tests have passed
or failed and now we created our first set
of automated tests as you can see automated tests are basically using code
to test code and they make it really easy to check if our code is working
correctly so now let's save this into git we're going to open the git
section and our first change in money test.js we created the tests for format
currency and then we created an HTML file to load our test
code so let's create a message describing these
changes create automated tests for format
currency and commit next we're going to learn how to
use a testing framework to write automated tests so what is a testing
framework in the previous lesson we learned about external libraries which
is code that is outside of our project that someone else wrote and we can load
external libraries into our project and use
them so a testing framework is an external library that helps us write
tests easier let's go back to our code and
we're going to open the money test.js file and notice that in our tests we
need to do several things first we create a test suite and we give it a
name and then we create some tests and for each test we give it a name and then
we compare the values and display the result in the console so a testing
framework helps us do all of these things automatically and gives us many
other features so now let's learn our first testing
framework in this course we're going to use a popular testing framework called
Jasmine now if you're working at a company in the future you'll definitely
be using a testing framework but it might not always be Jasmine and that's
okay because most testing Frameworks are pretty similar so by learning Jasmine
you'll be able to easily use other testing Frameworks in the
future to load Jasmine into our project we're going to go into the video
description and we're going to click this link to download
Jasmine so once that link opens we're going to be on this page and we're going
to scroll down and we're going to click this Jasmine DST standalone. zip file to
download it now once that's finished downloading
we're going to open our downloads folder and if you're on Windows we're
going to rightclick the zip file and click extract
all and click extract now if you don't have that
extract all option you can also create a folder with this name and then double
click the zip file and drag everything into that folder
if you're using a Mac you can just doubleclick the zip
file so this folder contains the code for Jasmine and we're going to drag this
folder into our project so let's open the code for our
project and then we're just going to drag this folder down
here and click copy folder so just make sure that this fold
folder is beside the scripts and images folder next we're going to rename this
folder so we'll right click rename and let's rename it to
test- Jasmine to make it clear this folder contains test created with
Jasmine so now let's press enter and now we have Jasmine inside our
project so inside the LI folder we have some JavaScript files here and this is
the code for the Jasmine testing framework so this is another way to load
an external Library into our project we can just download all the code and put
it into our project and this is useful if an external library has lots of
different files like this before we continue let's save the
changes into git so if we make any changes later it will be easier to see
them we'll open the git section and then we just added all the code for
Jasmine so at the top let's type the message add Jasmin testing
framework and commit now that we loaded Jasmine into
our project let's learn how to use it so Jasmine has a documentation page that
shows you how to use the testing framework however to save time I'm just
going to show you the features that we need and you can read the documentation
later if you want so first let's learn how to run tests using
Jasmine I'm going to close this for now and then in our code we're going to open
the test- Jasmin folder and at the bottom we're going to open this spec
runner. HTML file so this file loads all of the
tests so this does the same thing as our test.html file from before and by the
way in Jasmine spec is another name for test so spec Runner just means test
Runner this file runs all the tests so let's actually rename this file
to test.html so we can match what we had before and compare the two so here we're
going to right click and rename
tests. HTML and press enter and now let's open this file and
take a look at the code that's inside so here at the top this is the
code for the Jasmine testing framework so we're just loading the framework up
here below that here we have the code that we want to test so this code is
sort of like the money JS file that we were testing
earlier and then at the bottom these files contain the tests so these files
are sort of like the money test.js file that we had earlier and you'll notice
that these are in a spec folder so as a reminder in Jasmine spec is another name
for test so this is basically the test folder this folder contains all of our
tests so now let's run these tests and to do that we just need to open this
HTML file in live server just like we did before
so for this file we're going to right click and open with live
server and I'm just going to make this a little bigger by pressing control equals
so it's easier to see in the video so this is what Jasmine tests look
like up here we have five Green Dots this means we have five tests that we
ran and the green color means that all of them passed so that here each test
has a Green Dot and you'll notice that each test also has a name next to it
which tells us what the test does and don't worry if this is in a different
order for you Jasmine randomizes the order of the
tests also notice that some of these tests are grouped together into a test
suite and up here we have the name of the test Suite so as you can see a
testing framework helps us do all of the things we were doing before and it also
provides a nice looking website where we can see the test results so a testing
framework is just an external library that helps us write tests
easier now that we know what Jasmine and a testing framework is let's learn how
to write our tests using Jasmine first we're going to go back to
our code and we're going to remove the
example code provided by Jasmine so down here we'll remove these
four script texts and let's also remove the source
folder so we'll right click delete as well as the spec folder right
click delete but make sure we keep this lib
folder because this contains a code for Jasmine and now inside test Jasmin we're
going to create a new file for our test so we'll create a new
file and let's say that we're testing money. JS again so let's name it the
same thing here money test.js and press
enter and now let's create the same test we had before by using Jasmine this time
so to make it easier for the video I'm just going to take this file and drag it
to the top here so we can see these two side by
side so like before we're going to create tests for format currency first
we'll need to import this function at the top so let's just actually select
this and right click copy and then down here right click and
paste and just make sure that this file path still works so our money test.js
file has to be inside test- Jasmin and this folder should be beside the
previous test folder next we're going to create a test
suite and name the test Suite so in Jasmine to create a test Suite we're
going to use a function called describe so this describe function is
provided by Jasmine and it creates a test
Suite next we're going to give a name to the test Suite so to name a test Suite
in Jasmine we're going to give describe a string and this string is the name of
the test Suite so let's name it the same thing as before test Suite colon format
currency next we're going to add some tests inside the test Suite to do that
we're going to give describe a second parameter which is a function brackets
arrow and curly brackets and inside here we're going to
create a test and give the test a name to create a test in Jasmine we're going
to use another function called it and brackets so it is a another function
provided by Jasmine and this creates a test next let's give a name to our test
so that we know what it's doing to name a test we're going to give it a string
and this is going to be the test name so let's name it the same thing we had
before converts sense into
dollars and now we're going to add some code into our tests to do that in
Jasmine we're going to give it a second parameter which is another function
brackets arrow and curly brackets so this is the code inside the
test and in this test we need to compare these two values and display the result
in Jasmine instead of creating an if statement and displaying the result
ourselves Jasmine provides us another function to do all of this
and that function is called expect and brackets so expect lets us compare a
value to another value for example let's give expect the first value that we want
to compare which is format currency 2095 so we'll type format
currency brackets 295 and now to compare this value to
another value expect gives us an object and this object has many methods
we can use to do comparisons so one of the methods we can
use in this object is dot 2 equal brackets and then inside these brackets
we'll put another value that we want to compare this to so we want to compare
this to the string 2095 and that's it this checks if this value
is equal to this value and then displays the result on the page so it does
everything that we did before except with one line of code and you'll also
notice that jasmin's code is designed so that it reads like English for example
we expect format currency 2095 to equal this string and this makes
a test code easier to read so we just created our first test suite
and our first test using Jasmine now let's run this test to do
that we just need to run this Javascript file inside test.html
so first let's save this file and then inside test.html we're
going to load this file so in here at the bottom we're going to create a
script tag and we'll give it a source attribute SRC
equals double quotes and we're going to load money
test.js test.js and remember our test file uses
import so we also need to give it the attribute type equals module so this
file has access to JavaScript module features so now let's save
and we'll open this file in our browser so we should have it open from before if
you don't you can write click and open with live
server so we'll open the test page and now you can see that we have our one
test that we created here and it's passing so it's green you can see here
that we created a test Suite with a name and we also created a test with this
name so we just created the first test that we had before except using Jasmine
this time and you can see that Jasmine also creates a nice website for us to
see the test results okay now that we learned how to
use Jasmine to create a test let's get some practice and create the rest of our
tests from before we'll go back to our code and open money
test.js and here we're going to create the other two tests that we had here so
at the bottom inside the same test Suite we're going to create another test using
the function it brackets and we'll give it a string which is the test name and
let's name it the same as before works with zero comma brackets
arrow and curly brackets and now we can put something
inside this test so in the second test we're going to compare these two values
to compare values we're going to use the function expect
brackets and the first value is going to be format
currency brackets zero and then expect gives us an
object and this object has a method called dot to equal which lets us
compare this value to another value so we'll call this method using brackets
and compare to this string the string 0 0 0 and now let's
save and live server will update our web page automatically so we'll open the
test page and now we have two tests and they both passed so that's how we create
the second test using Jasmine and again don't worry if this is in a different
order for you Jasmine randomizes the order of the
tests finally let's create that third test that we had before we'll go back to
our code and then in our old money test file we're going to create this third
test feel free to pause the video if you want to give it a try
yourself so we'll scroll down and we'll create another test inside this test
Suite using the function it brackets and a string and we'll give it the same test
name as before rounds up to the
nearest scent comma brackets arrow and curly
brackets and we're going to compare these two values so we use exp brackets
and give it the first value format currency brackets
2000.5 and to compare it we'll use the method
do2 equal brackets and compare it to 20.01 and
save and let's go back to our test page and now we have three tests and all
three of them passed so we recreated the tests that we had
before now let's try making one of these tests fail to see what it looks like in
Jasmine we'll open our code and and let's open the file utils
money.jpg test so it tells us the test Suite name
and the test name that failed and it will also tell us the two values that
are not equal to each other and here it will tell us where this test failed so
it tell us that it failed in money test.js at line
13 so if we go back to our code and we open the Jasmine money
test.js line 13 is right here so just telling us that this line failed the
test here we can see the full list of tests
and it will tell us that we have three tests two of them passed and one of them
failed so Jasmine gives us a lot of details on where a test failed to help
us fix the issue now let's add back math.round to
make everything pass again we'll open our code and open UTS money. JS and
we'll just add back capital M math.round Open Bracket and close
bracket and save and if we check our test page
everything passes again so this is how we use a testing
framework like Jasmine to create tests the testing framework gives us a bunch
of functions such as describe it and expect and then we use these functions
to create our test so so these functions have a lot of features inside them they
do all of the setup for us and they also display the test on a nice web page for
us now there's one more thing I want to mention which is we can use describe
inside describe this helps us organize our tests
further so now let's save our changes into git we'll open the git
section and let's close this file at the top for
now so inside money test.js we created all the tests that we had before for
format currency by using Jasmine this time and for spec Runner we rename this
file to test.html and finally we deleted all the test code that came with Jasmine
so now let's add a message to describe our
changes remove default tests and add
money tests and commit now let's test a different
function using Jasmine and along the way we're going to learn some more features
of testing Frameworks let's go back to our
code and we're going to scroll to the top and open the data/ cart. JS
file so inside this file we have a function called add to cart so we're
going to create tests for the add to cart
function first since this function is in a different file we're going to create a
new test file so we're going to scroll down and let's close the test folder so
we don't get confused and then inside test- Jasmine we're going to click in
this folder and then create a new file and let's name it cart
test.js and press enter so we name it the original file
name which is cart and then just add test at the
end and to better organize our test files we usually try to match the folder
structure of the code so for example in our code money. JS is inside this UIL
folder so inside our tests we should also create a utils folder and put this
file inside so we'll create a new folder by clicking up here and let's name it
utils and press enter and then move the money test.js
file inside if it asks you if you want to
update Imports automatically you can click
yes if you check your code scroll to the top make sure that your file path starts
with do do slash do do slash because now we're inside another
folder VSS code sometimes updates the file paths for us automatically but if
it doesn't we can just add an extra dot do slash in front
ourselves and we're also going to open money test.js and save this
file next if we scroll up cart. JS is in inside a data folder so inside our test
we're also going to create a data folder let's click cart
test.js we'll create a new folder and let's name this the data folder and
press enter and then move card test.js inside
here now you'll notice that this folder structure doesn't perfectly match the
folder structure that we have up here because utils is inside the scripts
folder but usually this data folder should also be inside the scripts folder
I just made a mistake when structuring the
project so let's just use this folder structure in our
tests okay so now let's open cart test.js and now we're ready to test the
add to cart function so first let's import add to
cart at the top we'll import curly brackets add to
cart from a string and we're going to locate cart.
JS so first we need to get out of the data folder using do slash and then get
out of the test djine folder do do slash and we'll go into this data folder data
SL cart. JS next let's create a test suite for
this function so we'll create some new lines and to create a test Suite in
Jasmine we'll use the function describe
brackets and we'll give this test Suite A Name by giving it a
string so let's use the name test Suite colon add to
cart and we'll give it a second parameter which is a function brackets
arrow and curly brackets and now inside this test Suite
we're going to add some tests so let's look at the code for add to cart to see
what kind of tests we should add so we'll open data/ cart.
JS and then inside add to cart you'll notice that this function uses an if
statement a best practice in testing is to test each condition of the if
statement this is known as test coverage test
coverage means how much of the code is being tested and a best practice is we
try to maximize test coverage so for this if statement we'll
create a test for the first condition which is when the product is already in
the cart and we'll create a test for the else condition when the product is not
in the cart let's go back to cart
test.js and inside this test Suite we're going to create a test using the
function it brackets and we'll give it a string and this will be the test name so
for the video I'm just going to scroll up and take this cart. JS file and put
it at the top here so we can see our code and our test side by side so I'm
going to scroll down to the add to card function and we mentioned that we're
going to test each condition of this if statement so the first test is going to
be when the product is already in the cart so that here let's name it ads and
existing product to the cart comma brackets arrow and curly
brackets and let's add another test for when the product is not in the cart so
this else condition so down here we'll create another test using it brackets
and a string and the test name adds a new product to the cart comma and a
function brackets arrow and curly brackets so these are the two tests that
we need for the two conditions of this if
statement let's actually start with adding a new product to the cart since
it's a little easier to test now unlike the format currency
function add to cart doesn't return a value so we can't really compare it to
another value using expect instead we're going to call add
to cart to modify the cart and then check if this cart looks correct to do
that inside here let's call the function add to cart
brackets and this function takes one string which is the product
ID so inside here let's give it a string and to find a product ID that we can
test with we're going to go to the left and scroll up and we're going to open
the data/ products. JS file and inside here we have a list of
products so let's just take the first product ID and use it in our test we're
going to select this ID and right click copy and then inside cart
test.js in this string we're going to rightclick and
paste so this will add this product ID to the cart and now to check if this
code is working correctly we're going to check what the cart look looks like so
first we need to import the cart we're going to scroll up and since we're
already importing from cart. JS to UT the cart we can type a comma
cart and then at the bottom here we're going to create a new
line and first let's check if the card. length is correct so if we assume that
we start with an empty cart when we add a product the cart. length should should
be one so we can compare these two values cart. length and one so to
compare values we're going to use the function expect brackets and we'll
compare the cart.
length and then here we'll use the method2 equal brackets
1 so now let's save this file and we're going to run these tests
to run them we're just going to load this file inside test.html so we'll open
this and then at the bottom we'll create a script
tag give it a source attribute double quotes and we're going to load this file
so this file is inside the data folder so we need to type data SL to go into
the folder and then load cart test.js and this file also uses import so we're
going to give it the attribute type equals module to enable JavaScript
module features and one thing that I forgot to
do is we moved money test into the util folder so we need to update the source
attribute to add the utils folder and then slash to go into the folder and
then locate money test.js so now let's save this HTML file
and open this test page in our browser and now we should have two
additional tests and the test that we just created should fail if it doesn't
fail for you you can go into your console and run local storage. CLE and
then refresh the page and it should fail so this tells us that the failure
happened in the test suite at Dart in the test adds a new product to the cart
which is the one we just created so it's telling us that the
cart. length is not equal to one it's equal to a different number so why is
this happening let's go back to our test open cart
test.js and in here remember that we assumed the cart starts as empty and if
we add a product the card dot length would be one however the cart doesn't
actually start as empty in cart. JS at the top here we're
loading the cart from local storage if there's nothing in local storage we use
this default cart so our starting cart depends on what's inside local storage
and this is a big problem when testing because local storage can change if
there's an empty card saved in local storage our test will pass but if
there's not an empty cart in local storage then this test will fail this is
known as a flaky test a test that sometimes passes and sometimes fails
even if we don't change the code now to solve this problem we're
going to use a feature of Jasmine called mocks a mock lets us replace a method
with a fake version and then we can make the fake version do anything we want for
example when we load the cart from local storage
we're using local storage. getet item so we can use a mock to create a fake
version of get item and then we can make this fake version do anything we want
like return an empty array so let's go ahead and create our
first mock we'll go back to cart
test.js and at the top of this test we're going to create a mock using
another function of Jasmine called spy on and
brackets and we'll give spy on two parameters the first parameter is the
object that we want to mock in our case it's local storage so we'll type local
storage comma and then we'll give it a string and this string will be the
method that we want to Mark in our case we want to Mark the get item method so
here we'll type get item and make sure I is uppercase so that we exactly match
the method name so now this will replace local
storage. getet item with a fake version and we can make this fake version do
anything we want to do that spy on gives us an object and this object has a
property we can use so at the end we'll type Dot
and the property called an and this result is also an object and
this object has a method called dot call fake brackets so don't worry about all
the Dots here Jasmine just organizes its code so that it reads like English so
we're spying on local storage. getet item and call fake so next we're going
to give call fake a function brackets arrow and curly
brackets and this function is what we want get item to do so we're essentially
overwriting the original get item with whatever is inside this
function so earlier we said we wanted get item to return the empty array for
this test so inside this fake function let's make get item return the empty
array now remember that local storage only
supports strings so we need to return this as a string to do that we're going
to use the code Json all uppercase do stringify Open Bracket and close bracket
so this will convert whatever is in the brackets to a Json string and that's
what we need for local storage so now let's test out this mock
to see if it works below this we're going to
console.log brackets and run local
storage doget capital I item brackets the string
cart let's save this file and then open the test page in our
browser and we're going to open the console so
rightclick inspect and the
console and you'll see that Here Local storage. getet item is no longer loading
from the actual local storage it's giving us an empty array every
time so now we have mocked the get item method however you'll also notice that
our test is still failing so how come it still
fails to understand what's happening let's take a closer look at our code
we'll go back to our code and inside our tests here we're
mocking local storage. getet item but notice that above this if we scroll up
we import the cart at the top so the order of this code matters first we load
the cart from local storage and after we're mocking local storage. getet item
so the card is already loaded at this point and this code doesn't have the
effect that we want so one way to solve this problem is
after we mock local storage here we should reload the cart so inside cart.
JS just going to give it a little more space to reload this cart after we mock
we just need to rerun all of this code so let's create a function so we can
rerun this code at the bottom here we'll create a
function and we'll call it load from Storage brackets and curly
brackets and we're just going to move all of this code inside the function so
let's select all the code up to cart equals we'll
rightclick cut and then in the function we'll
rightclick and paste and at the top let's create the cart
variable again let cart and semicolon and lastly when we load this
file we need to run this function so that we run this code at least
once so down here we'll just run this function load from storage and
brackets so let's save so we're basically running the
exact same code as before except this code is now inside a
function and now in our test after we mock local storage. getet
item we're going to reload the cart using this function so first let's
export it so we can use it in our test we'll type
export and save this file and Insider test let's scroll up to the top we're
already importing from cart. Js so we'll type a comma and we'll import load from
storage and then we'll scroll down back to our test and here after we mock local
storage. getet item we're going to load from Storage brackets and
save so this time we mock local storage. getet item first to return an empty
array and then when we reload the cart this is going to be an empty array and
the cart will be empty and now in our test when we add a product to an empty
cart the cart length will be equal to one so this test will pass so we can
actually remove the console.log here and save and check our test
page and now this test should be passing next let's go back to our code C
and if we look at the add to cart function in cart.
JS so in here at the bottom of this function you'll notice that we're saving
the cart to local storage so this is going to call local storage. set
item however we don't actually want to save to local storage because this is
just test code we don't want our test code to be modifying local storage or
affecting our real code to prevent this we're also going to mock
local storage. set item so down here we're going to create
some new lines at the top of the test and we're going to mock local storage.
set item using the function spy on brackets and we'll give it local
storage comma a string and the method we want to mock which is set
item and save and remember the order of the code
matters so we want to mock local storage. set item first and then we call
add to cart so now set item will be replaced with a fake version and this
will no longer save to local storage next spyon has another useful
feature which is it records every time a method is used for example what if we
want to make sure that add to cart saves the cart to local storage at the end in
our tests set item is mocked so we can't really check what's inside the local
storage instead we can just check if add to cart calls set item at some
point to check if set item was called at the bottom we can use the function
expect brackets and we're going to give this
the method that we loed which is local storage. set
item and remember that expect gives us an object and this object has many
useful methods to check stuff like dot to
equal so another method we get from expect is dot 2 have been called times
brackets so make sure that you write this method
in cam case two is lowercase and every word after starts with a
capital so this method checks how many times local storage. set item was called
in the code above so we expect it to be called once inside add to cart so we're
going to give it the number one so keep in mind that this only works
if this method has been mocked with spy on so now let's
save and open our test page and you can see that all of our
tests passed and local storage. set item was called
once so after we mock a method we can check how many times this method was
called and we can even check what values this method received but I'll leave that
as an exercise another thing you'll notice
here is that each test can have multiple expectations
and the test will only pass if all of its expectations
pass now let's add a few more expectations to this test for practice
so one thing we can check is we can check the first product in the cart and
make sure that its product ID matches this string here so below this let's use
another expect brackets and we're going to check the first product in the cart
using cart square bracket 0 so this is going to be an object and
this object is going to have a property called product ID so down here we'll get
the dot product ID and we're going to check if this
product ID is equal to this string so to do that we'll use the dot 2 equal method
brackets and we'll give it this string here so let's just select this and
rightclick copy and here right click and
paste another thing that we can check is the quantity when we add a new product
to the cart the quantity should start out as one so down here we're going to
add another expect
brackets and we're going to check the first product
cart square bracket 0.
quantity. 2 equal brackets one and save now let's open our test
page and you can see that all of those expectations
passed now let's move on and create the test for adding an existing product to
the cart so we'll go back to our code and scroll up to the first test
here so first we need to set up the cart so that it already contains the product
that we want to add to do that we're going to Mark local storage. getet item
again so down here we can just reuse this code so we're going to select this
code and right click
copy and then in the first test here rightclick and
paste and this time do set up the test we're going to put a product into the
cart at the beginning and then we're going to add the same product to the
cart so inside this cart array let's add an
object and each product has a property called product ID so we're going to add
this property product ID colon and let's just give the same product ID
that we used down here so we'll select this and then right click
copy and then up here we're going to right click and
paste comma and each product also has a
quantity so we'll give it a quantity colon and let's just give it one comma
and also a delivery option so delivery option ID colon and let's just give it
the string one and
save so now when we do local storage. getet item it will give back this array
as the starting cart and then we need to make sure that we reload the cart from
Storage next let's scroll down and let's copy the rest of the tests because it's
going to be very similar so we're going to select this code and
rightclick copy and then up here create some new
lines and right click and paste and also one thing I forgot to
copy over is Tock local storage. set item so at the
top let's also spy on brackets
local storage comma a string set
item so a mock only lasts for one test once that test is finished the method is
no longer mocked so that's why in this test we also have to mock local storage.
set item and now in this test we're just
going to modify these expectations so that they make sense for this test
if we add an existing product to the cart the cart. length will still equal
one because these product ID match and we're just increasing the
quantity we're still going to call local storage. set item once so this is
correct still the first item in the cart is
going to have this product ID and the only thing we're going to change is that
the quantity is now going to increase by one so it's going to go from one to two
this time so everything is the same except if
we add an existing product we're just increasing the quantity now let's
save and check the test page and now the existing product test
is passing and that's it we created tests
for the add to cart function so now let's do some cleanup
and we're actually going to remove everything from local storage since we
were modifying it earlier in the test and we might have messed it up so on
this page we're going to rightclick
inspect and open the console and to remove everything from local storage
we're going to type the code local capital S
storage. clear and brackets and press enter and then we'll refresh the
page now finally let's go into get and save our changes so we'll open our code
and we can close this one for now and we'll open the get
Section so in cart. JS at the top we basically put all the code that loads
the cart into a function so we can use it in our
tests and then here we moved money test.js into a utils folder in test.html
we're loading the new cart test.js file and then inside cart test.js we added
some tests for the add to cart function so now let's create a message describing
these changes
create automated tests for add to cart and
commit the last thing we're going to learn in
this lesson is how to create more complicated
tests so far we've only been testing a single function for example we tested
the add to card function as well as the format currency function so these are
called Unit tests because we're only testing one unit or one piece of the
code now what if we want to test a whole page or part of a page this requires a
more complicated test called an integration
test an integration test tests many units of code or pieces of code working
together for example in our code we're going to go to scripts checkout thee
orderers summary. JS file and we're going to test this render
order summary function so this function creates a whole section on the checkout
page and it uses many different functions and libraries to create the
page so testing this function will be considered an integration test because
it uses many different pieces of code or units of code together so let's start by
creating a test file for this function so this is in the orders summary. JS
file inside our test here let's match the file structure that we have here
here so we're going to click test- Jasmin and first we're going to create a
checkout folder so we'll click here to create a
folder and we're going to name it checkout and press
enter and then inside the checkout folder we're going to create a new file
so we'll click this to create a new file and we'll name it the same as above
order summary and ADD test .js and press
enter so by matching the file structure it's clear that this test file is going
to test ORD summary. JS and again for the video I'm just
going to drag this file to the top here so we can see this and the test side by
side and now we're going to test this render order summary function so first
we're going to import this function into to our test file at the top we'll import
curly brackets the render order summary function from a string and we're going
to locate this file so first we need to get out of the checkout folder and out
of the test Jasmine folder so we'll use two do do slash do do slash and then
we're going to go into the scripts folder and into the checkout folder
Scripts slash checkout slash and we'll load order
summary. JS we'll create some new lines and let's
start by creating a test Suite using the function describe
brackets and inside we'll give it a string and we'll name this test Suite
test Suite colon render order summary a comma and a function brackets arrow
and curler brackets and now what test cases should
we create render order summary creates a part of the page so when we're testing a
page the two things we need to test is how the page looks and how the page
behaves let's start by testing how the page looks inside our test Suite we're
going to create a test using it brackets and we'll name this test with a
string and this will just be a basic test case so we'll describe what this
function does which is displays the
cart comma and we'll give it a function brackets arrow and curly brackets and
now we're ready to create the test so render order summary usually
displays the cart on the page however in our tests where does this cart get
displayed so if we look at the code in this
function and we scroll down here we generate the HTML for the
cart and then after we generate the HTML we put the HTML inside an element
with the class js- order- summary however we don't have this
element in our tests so to fix this we're just going to create an element
with the class js- order- summary to do this we're going to scroll
down and we're going to open the test.html
file and then at the bottom we're going to go to the body and then inside here
we're going to create a div so less than div and greater
than so remember how we said we need to create create an element with the class
js- order- summary we're going to create that element and put it inside this div
so this div is going to act like a container the reason we use a container
is that when we create elements in our test we don't want to be modifying the
entire body because the body might contain our test results from jasine so
we put everything inside a container so now let's give this div a
class so we can use it in our JavaScript we're going to give it a class equals
double quotes and we're going to call this the js- test-
container to make it clear this is a container for all of our test
code and save and now let's get this container
into our tests we can do that using document. query
selector brackets and a string and we'll select the class using using a js- test-
container and then inside this container we're going to create an element with
the class js- order- summary so to put something inside this element we're
going to use the property do inner Capital
HTML equals a template string and inside this template
let's create a div element less than div greater than less than SL div greater
than and as we mentioned we'll give this element a class equals double quotes of
js- order- summary so this basically takes this
HTML and puts it inside our test container so it will put it inside here
and now we have the element that we need for render order summary so when we call
this function it's going to create the cart and display it in this element
here next if we look at the code for render order summary and we scroll to
the top you'll notice that it takes the cart
and then displays it on the page but remember that by default we load this
cart from local storage and this can cause problems in our test depending on
what is inside local storage so to fix this we're going to mock local storage.
getet item again to control exactly what's inside this cart so let's
actually open the cart test that we had before and we're just going to copy
paste this mock that we created so we're going to start from here this function
and we're going to select the code up to spy on get item and then
rightclick copy and then down here we're going to
rightclick and paste and one other thing we need to do
here is we don't have access to load from Storage right now so we need to
import it at the top let's also copy the import that we
had here so we're going to select this and then right click
copy and then down here we're going to rightclick and paste the
import and we just need to make sure that this file path locates cart. JS so
do/ do slash it's going to go outside checkout and outside test- Jasmin and
then it will go inside the data folder and then locate card. JS so this file
path is correct and currently we're not using these two values so we can just
remove them and now let's set up this cart for
this test so we could just use this cart here however to make our test a little
more detailed let's open the cart. JS file and at the top here we're going to
use this default card instead because it has two products with different
quantities so we can test more things so we're just going to select this card
here and then right click copy and then down here open order
summary test and we're going to select this card
and remove it and inside these brackets we're going
to right click and paste that default cart and now that the HTML and the cart
is set up for this function at the bottom we can call the function render
order summary and brackets and Save
so now let's run this test file we're going to open test.html
and then beneath these tests we're going to add another script Tech less than
script Source equals and we'll load the checkout slash order summary test.js
file and we need to give it the attribute type Ty
equals module because we used Imports and let's save so we run this
test so we'll open our test page and you can see that the cart was
rendered onto this test page and we still have our Jasmine results at the
bottom here so you notice that when we render this it didn't load any CSS or
images and this is okay because we can't really use code to check if the page
visually looks correct however we can use this to check the contents of the
page like if the products and the quantities are
correct so first our cart has two products in it so we can check if there
were two products that were rendered on the page let's go back to our
tests and let's take a look at the orderers summary. JS file
and when we render the order summary we scroll down for each product in the cart
we create an element with the class cart--
container since we have two products in the cart let's check that we created two
of these elements on the page so we're going to open the order summary test.js
file and then in the first test at the bottom of this test we're going to add
some lines and we're going to check if we have two of these elements to do that
we can use the Dom using document. query selector all brackets
and a string and we could select the class card- item D container however
this class is used for CSS so remember if we're going to use a class in
JavaScript we start with js- let's add a new class to this element
that we can use for the test we'll add js- cart Das item D
container so now we're going to select all the elements with this class
using js- card- item D container and let's save the order
summary. JS file and then down here we're going to
check if we have two of these elements on the page so again to check something
in our tests we're going to use the function expect Open Bracket and let's
create a new line to make it a little cleaner and at the end we'll give a Clos
bracket like this and this code gives us an array of
elements so here we're going to check if the dot length of this is equal to to
two so expect gives us an object which has a method called dot 2 equal brackets
and two so this checks if we have two of these elements on the page so let's
save and then check the test page and scroll to the bottom and you'll
see that this test passed so that's how we check if we
render the page correctly next let's do another check of what we
rendered on the page so another thing we can test is If the product quantities
are correct so first we need to get this quantity element into our tests so we'll
go back to our code and then inside the HTML of the
order summary we're going to scroll down until we see a div with the class
product- quantity and we're displaying the Quant
here so now we're going to take this element put it into our test and check
that the quantity here is correct so to do that let's give another
class to this element so we can select it using JavaScript so here we'll add
another class js-
product- quantity and we want to check the
quantity for each product so we need to identify which product this is for we
can do that by adding a dash to this class and then inserting using dollar
and curly brackets the products ID which is the matching product matching
product. ID and save and now let's get this element into
our test so down here we're going to document. query
selector brackets and we'll give it a template
string because we're going to insert a product ID so we're going to select this
class using a js- product- quantity Dash and then insert the product ID so in our
cart we have two products and let's start with the first product ID now to
make this easier let's put this string inside a variable so we can reuse it
below so above the this let's create a variable with const call it product
id1 equals and we're going to select this ID and then right click
cut and then up here rightclick and paste and then we're just going to use
this variable down here product id1 and then when we're getting this
element into our our code we're also going to insert the product ID which is
product id1 so now we're going to check if the
text inside is correct so for the first product we have a quantity of two so the
text inside this element should say Quantity colon
2 so to check this at the bottom of our test as usual we're going to use the
function expect Open Bracket and a new line and
then here we can remove the semicolon and close
bracket and we're going to get the text inside this element now we're not going
to usein HTML because this element contains a bunch of HTML inside but we
only want the text to get just the text we're going to use the property do inner
text so we expect the text inside this element to contain quantity colon
2 however this element also has some other text like update and
delete so we just want to check if quantity 2 is somewhere inside this
element so how do we check that to do that we're going to use a different
method of expect called dot to contain and
brackets and we're going to give it the string that we want to check for which
is capital Q quantity colon 2 so the two contain method checks if
this value contains this string so they don't have to be an exact match like
with two equal as long as quantity colon 2 is
somewhere in this element then this expectation will pass and this is
exactly what we need when this El El has some extra text that we don't really
need to check so now let's click our test file
and save and open the test
page and scroll to the bottom and you'll notice that the test passed so for the
first product we're displaying the quantity of two
correctly let's also check the quantity of the second product we'll go back to
our tests and and just like before let's
create a variable to store this ID so we'll create a variable with const
product id2 equals and we'll select this
ID and right click copy and then here right click and
paste and then we'll remove this and use the variable product
id2 and then at the bottom we're going to get the quantity element for Product
2 so let's just copy this code because it's very similar we'll select it right
click copy and then down here right click and
paste so this time we're going to get the quantity element for product ID
2 and in our cart product two has a quantity of one so down here we're going
to check if the text contains quantity colon 1 and
save and let's open our test page and scroll to the
bottom and this test passed so we're displaying the quantity of both products
correctly on the page the second thing we can test in an
integration test is how the page behaves for for example on this page we can
click the delete link to remove a product from the page so let's create a
new test to make sure that the delete link behaves
correctly we'll open our test code and at the bottom we're going to
create a new test using the function it and
brackets we'll give it a name and let's describe what the behavior should be
which is removes a product comma and a function brackets
arrow and curler brackets now let's do the same setup as
the first test so we start with two products in the cart so we can select
from load from storage and we'll select all of this code up here and then
rightclick copy and at the bottom
we're going to right click and paste so this will set up the HTML
element that we need for the order summary as well as the
cart and after this let's render the order summary using the function render
order summary and brackets so once we've displayed this on
the page we're going to get the delete link and click it so first let's get the
delete link into our code so we'll go to the orders summary. JS file and inside
the HTML we're going to scroll down a bit till we see the delete quantity link
and let's test the delete link for the first product in the
cart so first we need to add a class to this element so we know which product
this is for so here we're going to add a class JF s- delete
dink Dash and insert the product ID which is the matching
product doid and I'll add a new line to make the
code a little bit cleaner and now we can save and then down here we're going to
get the delete link for the first product ID so at the bottom we use
document do query selector
brackets and we'll give it a template string because we're going to insert the
product ID and we'll select this class using js- delete
dlink D and then insert dollar curly brackets product
id1 and now we need to click this delete link to remove the first product from
the page and from the cart to click an element using Code we can just get it
using the Dom and then use the method dot click and
brackets so this will click delete on the first product and remove it so let's
save and take a look at our test page and unfortunately this test failed
so let's take a look at the details of the failure to figure out how to fix it
so it's telling us that we cannot set properties of null this means that a
value in our code is null and we're trying to give it a
property and here it will tell us which line we got this error from so this
error happened in our test file and the line that created this error was in Ord
summary. js on line 132 or whatever line that you see here
on your page so inside our code we're going to open
orders summary. JS and I'm going to scroll down to line
132 and you can scroll down to the line that you got on your
page so this line of code is actually part of the code that we run when we
click delete so remember that when we click delete we also update the payment
summary on the right side of the page and that's what this line does now the
reason this is not working is if we open the payment summary JS file and we look
at what this does at the bottom after we generate the HTML we try to put the HTML
in an element with a class js- payment D summary and this element does not exist
in our tests so one way to fix this is to add this element to our
test so let's open our test again we'll open the order summary
test.js and then we'll scroll up and then here when we create the
order summary element we're also going to create the payment summary
element so we'll create a less than div greater than less than SL div greater
than and here we'll give it a class equals double quotes and we'll give the
class that the payment summary needs which is
js- payment D summary and
save so now that the payment summary element is set up we can open our test
page and our test should no longer have a failure so you also notice that the
payment summary got rendered or displayed on the
page okay so in our tests we only clicked the delete link for the first
product but we didn't actually check if the page looks
correct and that's what it shows here with this yellow dot this test has no
expectations yet so let's go back to our test and add
some expectations at the bottom so we'll scroll down and down
here after we click delete for the first product we expect that there's only one
element left on the page for the cart so in our first test we actually
had a check for this so we can scroll up and here we check if we have two cart
item containers on the page so let's just reuse this check because it's very
similar we'll select it right click copy and then down
here we're going to right click and paste and this time we only expect one
cart item container to be left on the page so so we'll change this to one so
we'll save open the test page scroll down and
now this test passed let's also do a more detailed
check so we're going to check that the first product is no longer on the page
we'll go back to our tests and then down here we're going to
get the card item container for the first product we use
document. query selector brackets and to get the element for the
first product we're going to open orders summary. JS and then scroll up in the
HTML until we find the cart item container
element and we're going to look for this class right here which tells us which
product this element is for so in here we'll give it a template string because
we'll in insert the product ID and we'll look for this class using a js- cart D
item Das container Dash and insert the first product so product
id1 and because we removed this product from the page we expect this result to
be null so we'll use the function expect open bracket and a new line and then
down here a close bracket and we'll use the method
do2 equal brackets and we expect this to be null and
save let's also check that the second product is still on the page because we
didn't delete it so let's just make a copy of this
check we'll select it right click copy and then
here right click and paste and we'll get the element for
product ID 2 this time and we want to make sure that this exists so that it is
not equal to null in Jasmine to check if something is not equal
to expect gives us another property we can use called dot
not so if we use the notot property it will check the opposite of whatever is
next so this will check if this value is not equal to null so remember the code
for Jasmine is designed to read like English let's save and check the test
page and scroll down and this test passed so we're
displaying the correct products on the page after
deleting now there's one more thing that we need to check here which is after
deleting is the cart array itself updated so we'll go back to our code and
add that check so first we need to import the
cart so we can use it in this test we're going to scroll up to the
top and we're already importing from cart. JS so we'll add a comma and import
the cart and then at the
bottom we're going to check if the card is correct
so the cart started out with two products inside after removing the first
product the card should have a length of one and the remaining product should
have product id2 so let's add both of these checks at the bottom so we'll
scroll back down and we'll use expect
brackets and we'll check if cart. length do 2 equal brackets
1 and we'll also expect brackets and we'll check the first product in the
cart which is cart square bracket 0 and we'll check its product ID do2
equal and it should equal product ID 2 so product id2
and save so let's open our test
page and scroll to the bottom and this test still passed so once we click
delete the card array is also correct so that's how we create an
integration test it tests many units of code or pieces of code working together
and it lets us test how our page looks and how our page behaves
now there's one thing that I forgot to do when we created these tests if we
look at our code and I'm going to open orders
summary. JS when we click delete at the bottom
here it uses a function called remove from
cart and if I look at the code for this function which is right here remove from
cart this function actually saves the cart to local storage and and calls
local storage. set item however it's recommended not to
modify local storage in our test so inside the order summary test file we
should also mock local storage. set item in this test so we'll scroll to the
top and at the start of the test let's mock set item using spy on
brackets local storage comma the string set
item and save and we'll open the test page and
make sure that the test still passes and we might have messed up our local
storage because of that mistake so let's reset local storage again we'll right
click on this page inspect open the
console and we'll type the code local storage. CLE brackets and press
enter and refresh the page just to be safe now another thing that we might
want to add is that when we render the order summary on the page it's taking up
a lot of space and it pushes the test results to the bottom so what we can do
is after our test we can actually remove all of this
HTML so let's go back to our code in the order summary test file at the
end of the first test we'll create some new lines and remove the HTML that we
created to do that we can scroll up to this code so to remove the HTML we can
just set this element inner HTML to the empty string so we'll select this code
right click copy and then down here right click and
and paste so in our test all the HTML we
created was placed inside this test container and we're just going to remove
all that HTML by setting the inner HTML to the
empty string and we'll do the same thing for the second test so we'll select this
code rightclick copy and then down here at the
bottom we'll right click and paste so this is just some cleanup we
can do at the end of each test let's save and look at our test
page and now all the HTML that we generated is gone and we can see the
test results more clearly lastly we're going to learn a
shortcut we can use in Jasmine called hooks a hook lets us run some code for
each test for example if we go back to our code notice that
before each of our tests we do a bunch of setup here so we can actually share
all of this code between our two tests using a hook so to create a hook we're
going to scroll up to outside of both of these
tests and at the top of the test Suite we're going to use another function
provided by Jasmine called before capital E
each brackets and we'll give this a function brackets arrow and curler
brackets so this is called a before each hook and it will run this function
before each of our tests so inside this function we can put
our setup code so that we run the setup code before each of our
tests let's actually take the setup code for the second test because it's a
little more detailed so down here we're going to
select the code starting from render order summary all the way up to mocking
local storage. set item and we'll rightclick and cut this
code and remove these new lines and then at the top inside before
each we're going to rightclick and paste so now before each of our tests it's
going to run this function and it's going to run all of our setup code so
this is a great way to share code between our tests and remove
duplication so now that we're running this inside before each if we scroll
down to the first test we don't have to run this code again so we can actually
remove it and we'll remove this Mock and we'll
remove the render order summary as W and all we're left with are the
expectations for our test now before we save we need to fix
one thing with this code here so right now these two variables are inside this
function and because of scope these will be contained inside this function and we
can't use it down here in our tests so to fix this we can just move
these variables outside of this function up here so we're going to select these
lines and then right click cut and up
here we're going to right click and paste so now any code inside this outer
function can use these two variables including our
tests so now let's save and check the test
page and everything is still still passing so that's how we use a hook to
run some code before each test now before each is not the only hook that we
can use Jasmine provides several hooks that we can use in our
tests another common Hook is after each which lets us run a function after each
test so this is really useful for cleanup code like we have down here when
we remove the HTML Al leave using after each as an
exercise now let's go into git and save our changes and I can close these three
files at the top for now so we'll open the git
section and then inside orders summary. JS we added some classes that we're
going to use in our tests inside test.html we are loading
our order summary test file and we also created a test container where we're
going to put our HTML that we generate and then for the order summary
test file this contains the test that we created for the order
summary now let's create a message describing our
changes create automated tests for order summary and commit
now that we've created all these tests for our project when we make some
changes to our code we can just open the testing page and it will rerun all of
our tests so here's the process that we do
when we write code first we make changes to our code and then we rerun the tests
to make sure that everything still works and finally we save our changes into
git now before we end the lesson we're going to do one more cleanup we'll go
back to our code and we'll open our
files and here we usually organize all of our tests into a folder called tests
however in this lesson we named this folder test- Jasmin because we wanted to
compare this folder to tests that were created without a testing framework but
now that the lesson's over we're going to rename test- Jasmine to just test to
make it more standard first we need to rename this
folder up here so we'll right click
rename and let's rename it to test- simple because this folder contains
tests that were created without a framework let's press enter
and now we can rename test- Jasmine to test by right clicking
rename and rename it to tests and press enter another thing we can do is we're
going to drag test- simple into the test folder so that all of our tests are
contained in one folder so if it asks you to update the
Imports you can click yes and we also need to open money test.js
in the test- simple folder because it updated the Imports and then save this
file finally we're going to run all of our tests again to make sure everything
still works after we move things around so because test.html is inside a
different folder now we need to reopen this with live server
so we'll rightclick and click open with live
server and it'll show us that all the tests are still passing so our code is
still correct so now we can close some of
these extra tabs here and save our changes into git we'll
open the git section and all of these changes are
related to renaming the folders so we'll give a message at the
top rename test- Jasmine folder to
tests and commit and that's the end of this lesson
in this lesson we learned how to test our code using manual and automated
tests we learned how to organize our test using test cases and test Suites we
learned how to use a testing framework like Jasmine to help us write tests
easier we learned how to Mock and spy on methods we learned how to test web pages
using integration tests and we learned about hooks which lets us share code
between our tests here are some exercises to help
you practice what we learned in this lesson e
in the rest of this course if you get an error in your project but your code
looks correct you may have some bad data saved in local storage to fix this you
can try running local storage. CLE in your console to remove everything from
local storage and then refresh the
page if you see an error like this object object that means that you saved
something directly into local storage but you have to jason. stringify it
first so check your code to make sure that you're always stringifying before
saving to local storage and then clear your local storage and refresh the page
in this lesson we're going to learn objectoriented
programming objectoriented programming or oop is another style of programming
so it's another way that we write our code it's useful to know because many
programming languages use oop now how do we use objectoriented
programming object-oriented programming is basically organizing our code into
into objects let's look at an
example we're going to go to our code and we're going to scroll up and
open data/ cart. JS inside this file we have the code for
our cart and you'll notice that for the cart we have some data at the top and
then we have a bunch of functions at the bottom that modify the cart and these
are separate from each other the data and the functions so this style of
programming that we've been using throughout this course is called
procedural programming procedure means a set of step-by-step
instructions and this is basically a function so in procedural programming we
organize our code into separate functions like we did
here on the other hand in objectoriented programming we organize all of this code
into an object so we put everything together into an
object so let's do an example and convert this cart code into
objectoriented programming we're going to click cart.
JS and inside this folder we're going to create a new file by clicking
here and let's name this file C- oop or objectoriented
programming. JS and press enter and now we're going to copy all of
the code in cart into this new file so let's open this and we'll click in this
file and then we'll type control a or command a to select all the code and
then right click copy and inside C- oop we're going to
rightclick and paste and let's scroll back up to the
top and now to convert this code into objectoriented programming we're going
to group all the data and the functions together into an object first at the top
let's create an object that we can put all of these inside
of so we'll create a variable const let's call it cart equals and object
and now we're going to group our data and all of our functions into this
object so let's do it step by step and we'll start with this cart
variable as a reminder cart semicolon is actually a shortcut for cart equals
undefined to make things easier to understand let's actually write this out
in full instead of using the shortcut so we'll type cart equals undefined
and now we're going to move this into the object so we'll select this
line and then rightclick
cut and then inside the object we're going to rightclick and
paste now inside an object we can't use the word export or
let so to move a variable into an object we're going to convert it into a
property and a value so we'll remove these
words and then type cart and colon undefined and remove the semicolon and
replace it with a comma so this is the same thing as cart
equals undefined but we move that value into an
object now one problem here is that if we access this cart property we're going
to do cart. cart which can be a bit confusing so let's actually rename this
property to cart capital I items instead to make it a bit more clear that this
contains the items in the cart or the products that are in the
cart next we're going to group all of our functions into this object as well
so let's create some new lines and we're going to move this
function inside here so let's select this
function and then rightclick
cut and inside the object we're going to
rightclick and paste and again we can't use the word
export inside an object so we're going to convert this into a property and
value as well so let's remove these words
and let's make the property name load from storage and then we'll type a colon
and we'll make the value a function brackets and curly
brackets so that's how we move a function into this object now make sure
that you use a regular function syntax here and not an arrow function and I'll
explain why later in this lesson now as a reminder when we have a
function inside an object we call this a
method also JavaScript has a shortcut for methods called the shorthand method
syntax so instead of typing colon and function we can actually just remove
this code and just type brackets and curly
brackets after the function name and this is a shortcut for the code that we
had before now the code inside this function
doesn't actually work anymore because cart was actually renamed to cart items
so we have to rename this variable so instead of cart we're going to do cart
do cart items to access this value and same
thing here cart. cart items and here cart
doart items so so this code Works however we
have a small problem here if we change the name of the object up here this code
will no longer work to solve this problem JavaScript
has a feature called this this gives us the object that contains this function
so it gives us this outer object up here so to improve our code we're going to
change from using a variable named cart to this and here as well this. cart
items and this Dot card items so this will give us the outer
object and now this code will always work and it doesn't matter what the
variable name is the last thing we're going to change
in this function is we're currently loading from local storage
cart however our original cart was also loading from local storage cart so let's
actually change this to C- oop so that we don't affect our original
cart let's move on and we're going to move the other functions into this
object so let's go down to the next function which is save to storage we're
going to select this and then rightclick
cut and then inside this object at the end we're going to add a comma and some
new lines and we're going to rightclick and
paste and we can't use the word function at the front here so let's remove this
word and just use the shorthand method syntax so this is a shortcut for colon
function and here we're saving to local storage cart
so let's also change this to C- oop so we don't affect our original cart so we
change it to card- oop another thing we need to change is
that the cart was renamed to cart items so here we're going to change from
cart to this which gives us the outer object and then dot cart items
which is this property so it should do the same thing as before except this
function is now inside an object let's continue and move another
function into the object so we're going to do add to cart this time so let's
select this code and then
rightclick cut and inside the object we're going to
add a comma and some new lines and then rightclick and
paste so again instead of using export function we're just going to remove this
code and use the shorthand method syntax which is a shortcut for this
code and now let's update the code inside this function as well so instead
of the cart we rename this to this. cart items so we'll change it to this do cart
items and then down here we're going to change
from cart to this. cart items and also the function save to
storage was moved inside the object so now to access this function we're going
to get the outer object again using this and then dot save to storage so down
here we'll add this dot in front to access the function inside the
object and now let's move on and move the next function into the object so
we'll select this code and then
rightclick cut inside the object add a comma and
some new lines and right click and paste we'll remove export
function and use the shorthand method syntax and again we'll change from cart
to this. cart items we're going to change cart here to
this.c cart items and change save to storage to this
do save to storage so we access save to storage
inside this object next let's move this last
function into the object so we'll select the code and then right click
cut and inside the object we're going to type a comma and some new lines right
click and paste we'll remove export function and
use the shorthand method syntax and update the code in this
method so we'll change cart to this do cart
items and save to storage to this Dove to
storage now let's remove the extra lines and the last thing we need to
update is that load from Storage was moved inside the cart object so to
access this function at the front we're going to type
cart. load from storage and save this file and that's it this is the basic
idea behind objectoriented programming we organize our code into objects so we
group the data and the functions together into an object like
this now let's talk about why do we use objectoriented
programming objectoriented programming tries to represent the real
world in the real world a cart is a physical object object so in
objectoriented programming we represent this physical object as a digital object
or in this case a JavaScript object a physical cart can have products
inside so our JavaScript object can also have products
inside a physical cart also has actions we can take to modify the cart like we
can add a product or remove a product our JavaScript object also has actions
we can take to modify the cart like the add to cart function or the remove from
cart function so as you can see
objectoriented programming tries to represent the real world we take a
physical object like a cart and represent it as a digital object like a
JavaScript object and some people feel feel that
this makes the code more intuitive or easier to
understand now let's try out the code in this object to make sure it actually
works we're going to scroll down to the bottom and
here we're just going to type console.log the
cart and save this file and now let's load this code into
the project to do that we're going to open the scripts folder and open the
file checkout. JS and at the top below the Imports
we're going to import our new file so let's type
import and we're going to use a slightly different syntax we're just going to
type a string and give it the file that we want
to load so we need to load C- oop. Js so first we need to get out of the
scripts folder using do slash and then go into the data folder data SL and load
C- oop.
JS so this is another syntax we can use for imports this just runs all the code
inside this file without importing anything which is what we need in this
situation so let's save this file and then open this page in the browser
so if you don't have this page open you can scroll down to checkout. HTML and
then rightclick and open with live server I already have this page open so
I'm just going to open that Tab and if the page is too big we can
zoom out by pressing control minus or command minus a few
times and now let's check the console to see what the cart looks like on this
page we're going to rightclick and click
inspect and then open the console and in the console we'll see
this cart object so inside this object we have the data as well as all the
functions for our cart but it's grouped inside an object and you'll see that the
code still works the same as before cart items has a the two default
products if we look at our code and open card-
oop at the beginning we run cart. load from storage and then inside this
function if we scroll up it will give the cart items this default cart with
two products inside and that's what we see in the console
here so we know that the code inside this object still works works the same
way as before so now let's try another method
to make sure that it's working so let's try using the add to cart method to add
a product to the cart items up here so we'll scroll
down to the bottom and then above console.log cart we're going to call add
to cart now add to cart was saved inside this cart object so to access it we're
going to type cart. add to cart and
brackets now add to cart takes one parameter which is a string and this is
the product ID that we want to add so to find a product ID we can go to the data
folder and products. JS and then inside here we have this list of products so
let's actually scroll down to the third product which is right here so this
t-shirt product and we're going to add this product ID to the cart so let's
select this ID we're going to rightclick
copy and then inside C- oop inside the string we're going to
rightclick and paste that product ID and let's
save and let's check the console so I'll open the console
Here and Now inside the cart object if we expand it cart items now has three
products because we just added a new product to the cart so this shows that
all of the code is working the exact same way as before we just organized it
into an object and that's objectoriented programming now that we're done with
this example let's remove these two lines of
code and save next another reason we use
objectoriented programming is it's easy to create multiple objects for example
the real amazon.com has a feature called Amazon business where you can have a
separate cart for your business purchases so how do we create two
separate carts in our code with objectoriented programming this is easy
we can just make a copy of the cart object so we can scroll up in this
code and I'm just going to click this Arrow here beside the card variable to
collapse this code and to create a separate cart for business purchases
we're just going to select this code and then right click
copy and at the bottom right click and
paste and now we have two separate cards so let's scroll up to the top of the
second cart which is right here and we said that we wanted this card for
business purchases so let's rename this to
business Capital C cart and when we load from Storage let's
load it from cart Das business instead so that it doesn't conflict with the
cart up here and if we scroll down same thing in
save to storage let's save this cart to cart Das
business and finally let's scroll down to the
bottom and here instead of cart. load from Storage we're going to change this
to business cart. load from Storage and that's it we just created a
completely separate cart simply by copying this object so object-oriented
programming makes it easy to create multiple
objects so now let's console.log both of these cards to see what they look like
we're going to scroll to the bottom and here we're going to
console.log the cart and
console.log the business cart and save and if we open the console for the
checkout page it will show us that we have two
carts the regular cart has three products inside and the business cart
has two products inside and these are just the default products that we get
when we first load the cart so you can see that these two cards are
completely separate from each other in the real world we can have two
physical cards that are completely separate from each other and in
programming we can also have two cards that are completely separate from each
other by simply making a copy of the object so again object-oriented
programming tries to represent the real world
now currently there's an obvious problem with how we're creating multiple objects
which is we're copy pasting a lot of code and this can make our code messy
and hard to manage so now we're going to make our code cleaner by using a
function to create multiple objects so first let's delete this
business card that we copy pasted so we're going to select this
object and then up to here the business card we're going to remove
it and now instead of copy pasting this object we're going to use a function to
generate these objects so at the top of this file let's create a new
function and we'll name it capital c cart brackets and curly
brackets so by the way in objectoriented programming a naming convention is to
use Pascal case for things that create or generate objects in Pascal case we
start every word with a capital including the first word so that's why
we started cart with a Capital C now inside this function we're going
to create cart objects so let's actually move this
object into the function so we can create it using the function so we're
going to select this object to here and then we'll
rightclick and cut and then move it into the function by
clicking in the function and then rightclick and
paste so now every time we run this function it will generate a new cart
object and we don't have to copy paste this code over and over to create
multiple objects so at the bottom I'm going to
click this Arrow to collapse this object for now and at the bottom of this
function we're going to return this C object so we can use it outside the
function okay now let's give this a try and we'll use this function to generate
cart objects so first let's create the normal cart using const cart make it
equal and we'll run this function to generate an object Capital C cart and
brackets and let's generate another object using the function using const
and we'll name it business cart equals Capital C cart and
brackets and we'll still load from storage for both of these and then
console log both of these so basically instead of copy
pasting all the time we're going to use a function to generate
objects so now let's save and then open the
console and and now we have two cart objects
again however now both of these carts have three products
inside but before the regular card had three products and the business card had
two products so what
happened if we go back to our code and look inside this cart
object you'll notice that we're loading from the same key in local storage which
is C- oop that means every cart that we generate will be getting its data from
the same place in local storage so to fix this we're going to
replace C- oop with a parameter so different carts can use a different key
in local storage so at the top let's create a parameter called local storage
key and then instead of using the same string every time we're going to use the
parameter local storage key and the same thing for save to
storage instead of saving to the same key every time we're going to replace
this with the parameter local storage key and finally when we run this
function at the bottom here we need to give the function a
local storage key so for our regular cart let's use the string cart C-
oop and for the business cart we can use a different key like the string cart Das
business so now these two carts will load from different keys in local
storage and they can have different data so let's save and then check the
console and now our regular card has three products and our business card has
two products like before so let's go back to our code and
this is a better way to create multiple objects instead of copy pasting a bunch
of code every time we can create a function that generates
objects so now let's save this example into git we'll go into our git
section and then at the top here we created a function to generate these
objects and in checkout. JS we are loading that c - oop practice file so
we'll type a message to describe these changes create oop or objectoriented
programming version of cart and commit next we're going to learn an even
better way to generate objects object-oriented programming has a
feature called a Class A Class is specifically designed for generating
objects a class is basically an object generator So currently if we open our
code and then open C- oop we learn how to use a function to
generate objects in objectoriented programming so now we're going to switch
this to using a class to generate these objects instead because classes are
cleaner and have more features than using a function so first let's create a
new file for learning classes inside the data folder we're
going to click C- oop and then create a new
file and we'll name this file c-cl class. JS and press enter
so first let's copy over all the code so we can compare it we're going to open C-
oop click this file and then press contrl a or command a to select the code
and right click
copy and in C-Class we're going to right click and
paste and we'll scroll to the top and at the top we're going to create
our first class class using the word class and now we're going to give a name
to this class so let's name it the same as here Capital C cart and then curly
brackets as a reminder a naming convention is to use Pascal case for
things that generate objects so that's why we start this cart with a Capital
C so this is a class A Class is basically an object
generator so now inside the class we're going to put the properties and methods
that we want for each object that we generate so here we have our properties
and methods we're just going to move them into the
class so first let's select the card items
property we're going to right click cut and then move it into the class by
clicking in here and then right click and
paste and classes use a slightly different syntax than objects so to
create a property called cart items we're going to type the property name
and instead of a colon we're just going to make it equal to undefined and
instead of a comma at the end we're going to put a
semicolon so that's how we add a property to a class and now every object
that we generate will have this property just like we did
before next let's move the methods into the class so we'll delete these lines
for now and we'll move load from Storage so we'll select this method and then
rightclick and cut and inside the class we're going to
move it by right clicking and paste and classes use a slightly
different syntax to create methods as well so instead of having a comma at the
end we can just remove it and every object that we generate will now have
this method so now let's move the rest of the
methods into this class we're going to scroll down and we'll move save to
storage so we'll select the method and right click
cut and at the bottom of the class we're going to right click and paste
and remove the comma at the end same with add to cut we'll select
this method and then right
click cut and inside the bottom of the class
we're going to rightclick and paste and remove the comma at the
end as well as remove from cart so we'll select this
method right click cut and at the bottom of the class right
click and paste and remove the comma at the
end and finally we'll move the last method update delivery
option and right click cut inside this class we're going to
right click and paste so this method did not have a
comma at the end so this looks good so that's how we create a class we
basically give it some properties and methods and now when we generate objects
using this class every object that we generate will have these properties and
methods now one thing we need to fix here is that local storage key doesn't
exist anymore to fix this we're going to save this in a property instead so at
the top we're going to give a new property to
every object that we generate called local storage key and make it equal to
undefined to start and then inside the methods we're
going to switch this to this. local storage key so this is going to point to
the object that we generate just like before and then local storage key will
access this property and another place we need to fix this is
inside save to storage so instead of using a variable local storage key we're
going to use the property this. local storage
key and that's it so if we scroll down we basically converted this whole
function into a class so now we can remove it
and the final step here is now that we have this class let's use it to generate
these two objects again to do that instead of this code
we're going to type the word new and then type the class name which is
capital c cart and brackets so you see that a class uses a
similar syntax as a function except we use the word new in front of
it so this generates a new object using our
class and this new object will have all the properties and methods that we added
above so let's do the same thing for the business card we'll use the class to
generate it we'll remove this code and then we'll type new and the
class name Capital C cart and brackets to generate another object using this
class now there's one thing we need to fix here each of these objects has a
property called local storage key and they're currently undefined so we need
to set this property so at the bottom here we're
going to type cart. local storage key and we'll make
it equal and we'll use the same string as
before which is C- oop and we'll do the same thing for the
business cart we'll type the business
cart. local storage key and make it equal the same string
that we had before which is cart Das business and then we'll load the cart
from Storage as well as the business C from storage and we'll console.log
them so we have the same code as before except we converted it from a function
to a class so now let's
save and we're going to run this code So currently if we go into our code and
open checkout. JS we're still loading C-
oop so we're just going to update this and load
C-Class instead and save and we'll open cart Das class
again and now if we open the console you can see that we created two
cart objects just like we did before and the regular card has three
products inside and the business card has two products
inside and if we click this Arrow beside prototype we can see the methods that
each of these objects have so we're basically creating the same
objects that we had before except this time we used a
class by the way each object that we generate from a class is called an
instance of the class we can also check if an object is
an instance of a class using the code business cart and then instance of and
then the class name name Capital C cart so this will check if this object
was generated from this class so we can console.log this result
console.log and close bracket and save and then check the
console and it will tell us that this is true so business card was generated from
this class okay don't worry if class are a
bit confusing at first just remember that objectoriented programming means
organizing our code into objects because this tries to represent the real
world and then classes are a feature that help us generate these objects so
they make it easier to create these objects a class is basically an object
generator now that we learned how classes work
let's talk about the benefits of classes if we scroll
up when we generate an object it's going to have these properties and these
methods and you'll notice that a class actually looks like the object that we
generate and this is cleaner than using a function like we had before
another benefit of classes is that they have extra features for object-oriented
programming the first feature is called a Constructor which lets us run some
setup code after creating an object so if we scroll down in our
code you'll notice that after we create these objects we run some setup code a
Constructor lets us put the setup code inside the class and this makes our code
cleaner because we can group everything together inside the
class to create a Constructor we're going to scroll up in the
class and Below these properties we're going to create a new method called
Constructor brackets and curly brackets so the Constructor method works
like a normal method we can put code inside and it will run the
code but the special thing about the Constructor is that when we generate an
object it will run this Constructor automatically so this is a great place
to put our setup code so let's scroll down to the
bottom and here instead of running the setup code outside the class we're just
going to move this into the class and into the Constructor so we'll select
this code and then right click
cut and scroll to the top and inside the Constructor we're
going to rightclick and paste so now after we create an object
it will run the code in the Constructor and set up the
object so there's a few things that we need to fix here the first thing is each
object object that we create is going to run the Constructor so we only need one
of each of these lines so let's remove the setup for the business
card so now the setup code has two steps we set the local storage key and then we
load from Storage the next problem is that the object that we create is not
going to be called cart every time to solve this we can replace cart with
this and here as well this. load from Storage so as a reminder this points to
the object that we generate so whatever object that we generate we're going to
get its local storage key and set it and we're going to get its load from Storage
method and run that method now the second problem here is
that we don't want local storage key to be card- oop every
time to fix this the Constructor can also have parameters let's give the
Constructor a parameter and we'll name it
local storage key and instead of the same string every time we're going to
use local storage key now the last thing is how do we save
a value into this parameter so if we scroll down to the
bottom when we call the class between these brackets we can put the parameters
for the Constructor so for the cart we want the local storage key to be the
string C- oop and for the business cart we want the local storage key to be the
string cart Das business so the values inside here are
saved in the parameters in the Constructor so C- oop will be saved
inside local storage key and then we use it and then the same thing for cart D
business so now let's save this code and then open the
console and you'll see that the cart objects are correct so after we
generated each object we also ran this setup code so that's how the Constructor
works every time we generate an object it will run the code inside here so this
is a great place to put setup code and make our code
cleaner so here are a few more details about the
Constructor the method has to be named Constructor we can't just use any name
that we want we also should not return anything from a
Constructor so last ly a shortcut that we can use in a class is when we have a
property and it's equal undefined we can actually remove equal undefined and just
use a semicolon so this is the same thing as the code before and same thing
here we can remove equal undefined and just use a semicolon and
save so we finished converting our code from using a function to using a class
and as you can see a class is just a better way to generate objects in
objectoriented programming so now let's save our code
into git we'll open the git section inside cart Das class we created our
cart class and inside checkout. JS we're basically loading the cart Das class
file so we'll type a message to describe this change create
class version of cart and
commit next we're going to learn an important feature of classes called
private properties and methods so let's open our code again and
open C-Class and you'll see that this class
has a property called local storage key so this property is useful inside
the class but it's not really meant to be used outside the class for example at
the bottom here we could take this
object cart and then change the local storage key using do local storage key
equals something else now this is a problem because it
will mess up how this object works and it will start saving to a different
local storage key so this is a common problem in programming where if you're
working on a team somebody might accidentally change properties that
they're not supposed to to prevent this classes let us make a property or a
method private which means it can only be accessed inside the
class so let's remove this line and scroll
up and to make local storage key private we're just going to add a number sign in
front or a hash and also whenever we access this
property inside the class we're going to add the hash in front so we'll type
this. has local storage key this.h local storage key and inside save to storage
this.h local storage key so this is called a private property
this means it can only be used inside this class or inside these curly
brackets it cannot be used outside the class a property without a hash in front
is called a public property meaning it can be accessed
anywhere so now let's save and open the console
and the code still works so we made this property private
and we're able to access it inside the class so now let's try accessing this
property outside the class to see what happens we're going to scroll
down and we're going to try to access cart. hash local storage key
and change it to something else like test and
save and if we open our console you'll see that when we try to
access a private property here it will give us a syntax error saying this is a
private field and by the way a field is the same thing as a
property so that's how a private property works it prevents us from
accessing this property outside the object and messing it
up we can also have private methods so let's remove this
line and scroll up and the method load from Storage
should also only be used inside this class there's really no reason for code
outside to be calling load from Storage so to make our code safer we're going to
make this a private method to make a method private we're
going to do the same thing in front of the method we're going to add a number
sign or a hash and we're going to update the rest of our code so we're going to
do this dot hash load from storage and now we can
save and check the console to make sure that everything is still working so
everything still looks good because we're only using this private
method inside this class so a class Let's us create private
properties and methods and this is useful on a bigger project where people
might not be sure which properties and methods they're supposed to use outside
the class and which ones to avoid so now let's save our changes into
git we'll go into the git section and inside here we we made local storage key
and load from Storage private we'll create a message to
describe these changes make local storage key and load from Storage
private and commit now that we learned
objectoriented programming and and classes we're going to use it in our
project so one thing we could do is to take this card class and replace
everywhere we use cart in our project however we use cart in a lot of places
and this would take too much time so I'm going to leave replacing the cart as a
challenge exercise instead we're going to work on
the homepage so first let's go back to our
code and we're going to open checkout. JS and we're just going to comment out
this import because we're just using this file for practice so let's save
this and then let's open the checkout page so I already have it open if you
don't have it open you can rightclick checkout. HTML and open with live
server on the checkout page we're going to click this icon in the top left to go
to the homepage on this page we have a list of
products here and the code for these products is
if we go back to vs code and on the left side we're going to
open dataproducts
DJs so here is the code or the data for all the products on the homepage and
you'll notice that each product is an object we're going to learn a technique
called converting an object into a class so what this means is instead of
using regular objects in this array we're going to use a class to generate
these objects so Above This array let's create a new class using the word class
and let's call it capital P product and curly brackets
because this class is meant to generate products so now each of our products is
going to have some properties like the ID image and the name so let's add these
to the class We'll add the ID property and a semicolon so that it starts off as
undefined and then an image property and a name
property and each product will also have a rating and the price sets rating and
price set and you'll notice each object here
also has a property called keywords now we're not currently using this in our
project so we're going to leave it out of the class for now and if we need to
use it later we can always add it back in so now we have all the properties
that we want for each product so now let's test this by generating a product
using this class so that here let's create a variable const product
one equals and to generate an object we're going to use the word new and then
the class name capital P product and brackets and let's console.log this to
see if it worked console.log product one and
save so now we're going to open the web page and then open the console so right
click and inspect and open the
console and inside here you'll see that we created a product object using the
class so right now all of these properties are undefined so now let's
set the values of these properties we'll go back to our
code don't follow along here but one way to set set these prop properties is to
access them outside the class for example product
- equals something and then do product 1. image equals something and then
product one. name and so on so this is not a good way to set
these properties because we have to do this for each product that we create so
it makes our code repetitive and messy instead notice that when we create a
product this is kind of like the setup code we create a product and then set
all of its properties and remember classes have a
specific feature for setup code called The
Constructor and now you can follow along so inside this class we're going
to create a Constructor brackets and curly brackets
so whenever we generate an object it's going to automatically run this
Constructor so this Constructor is where we should put our setup
code so let's remove this code and then do all of that inside the
Constructor so first we want to set the ID property we're going to do this do ID
and make it equal and now what value do we set the ID to so the value of the ID
is inside each of these objects so when we create a product up
here we're going to put this object inside these
brackets and then that's going to go into the Constructor in here so in the
Constructor let's create a parameter to save this data so we'll name it product
details and now to save something inside ins this parameter we're going to put it
between these brackets so let's actually give this
entire object to the Constructor so we're going to right
click and copy and then between these brackets
we're going to rightclick and paste so whenever we create a new
product we're going to give it this object with all the details
it's going to get saved in here and now we can set the
properties so this. ID is going to be equal to the product details. ID
property so product details.
ID and for the image we're going to do this. image equals the product details
which is this object that we passed in do the image
property same thing for the name so this.name equals product
details. name which is this property here same thing for the rating this.
rating equals product details. rating and finally the price
sense this. price sense equals the product
details. Price sets so this is called converting an
object into a class what we're doing is we're basically taking a regular object
like this we put it inside a class and then we copy over the
properties you can also visualize it like this we have a regular object and
we're basically wrapping it inside a class and the reason we do this is that
classes have extra features we can use like we can add methods and we can also
have private properties and private methods so we basically have these same
object as before except we have an enhanced version of that object it has
some extra features from classes so for now let's save this code
and then down here we console.log product one so let's take a look at it
in our console so we'll open the console and now we can see that we
created a product object so it's the same object as before except now it's
enhanced it has some extra features from classes so next we're going to take this
technique and apply it to this entire array so instead of having an array of
regular objects we're going to convert each of these objects into the product
class now one way we could do this is that in front of the object we can just
type new product Open Bracket and then close bracket at the
bottom and this will essentially convert this regular object into the product
class however we're going to have to repeat this code for every object in the
array and it's going to be a lot of work and
repetition so instead let's just Loop through this array and then use code to
convert each of these objects so instead of typing this out manually we're going
to remove this and remove the round bracket at the end and then I'm going to
click this Arrow beside the array to collapse
it and at the end of the array we're going to use an array method called dot
map and brackets so map basically Loops through
an array and for each value it runs a function so we're going to give this a
function that we want to run for each value so arrow and curly
brackets and this inner function is going to get a
parameter so this parameter is basically each value in the
array so it's going to take the first value and then save it inside this
parameter run the function and then take the second value save it in here run the
function third value save it and run the function so let's name this parameter
the product details because each object in this
array contains product details so now it's going to take each object save it
in the parameter and run the function and here we're going to convert the
object into a class to do that we're going to use the code new capital P
product brackets and we're going to give it this
regular object which is the product details and now there's a second part to
how Map works so map creates a new array and whatever we return from this inner
function is going to go inside that new array so here we're going to return this
class so this result is going to be put inside a new array so you can think of
map as we take each value in an array we run this function on it and we transform
it and then put it inside a new array so here we're essentially
transforming each of these products or these regular objects into a
class so at the bottom let's console.log the products array to
confirm this so we'll save and open the
console and now you can see we have an array and each of the values is a
product class instead of just a regular object
so we converted all of our products from regular objects into this product class
and now let's open the web page to make sure that everything still
works so if we open the page you notice that everything is still
working correctly and that's because we have the
exact same objects as before except they're now just sort of enhanced
objects next let's use those extra features of classes to simplify our code
for this page we'll go back to our code and on the left side let's open
amazon. JS so this is the code that creates the
homepage so in here we're going to scroll down until we see the rating
section where we calculate the stars and the rating
account so notice that inside our HTML we're constru in this URL here for the
number of stars a product has and we're also creating the price
that we want to display on the page now instead of doing this all in
the HTML our code would be cleaner if we moved this logic into our class because
we want to group this related code together so let's use the features of
classes to make this code a little bit cleaner we'll open products. Js
and we'll scroll up to the product class and inside here let's add some methods
for calculating the stars and the price so we're going to add a method and
call it get Stars URL brackets and curly brackets and let's create another method
called get price brackets and curly brackets
and now we're going to move the code from our HTML into this class so we'll
open amazon. JS and then here we're creating the URL
of the Stars so let's actually select all this
code and rightclick
copy and inside products. JS inside get Stars URL we're going to
rightclick and paste and this is going to be a string so at
the front let's add a back tick so we're going to use a template string because
we're going to insert a value inside and at the end we'll add another back
tick so now that we created the string we're going to return it from this
method so return and semicolon at the
end and one thing we need to fix is that product is not defined anywhere so to
get the rating property of whatever object this is we're going to use this.
ratings. Stars so now each product is able to
construct its own Stars URL here so let's save this
file and then inside amazon. JS instead of doing this calculation
directly inside the HTML we're going to delete it and we're going
to insert the product. getet Stars URL method and
brackets so you'll notice that we have the same product object as before but
now it's sort of an enhanced product we can add methods to group related code
together and make our code cleaner let's do the same thing with the
price down here we're going to calculate this using the method instead of
directly in the HTML so we're going to select this code
and then right click copy inside products.
JS inside the get price method we're going to
rightclick and paste and again we want to return the
price as a string so at the front we'll create a template string because we're
inserting a value and at the back a template string
or a back tick and we're going to return this from the
method and another thing we need to fix is that product is undefined so to get
the price sets property we're going to use this Price
sets now one extra thing we need to do here is that we're using the format
currency function but we didn't import it so we're going to scroll to the
top and import format currency import curly brackets the
format currency function from a string and here we're going to locate
this function so we're inside the data folder we need to get out of the data
folder using do slash and then go into the scripts folder into the UTS folder
and load money. JS so scripts SL utils
money.jpg and instead of calculating the price
inside the HTML we're going to remove this and then insert the
product. getet price method and brackets so now let's
save and let's open the homepage to make sure that it's
working so now you see that everything is still working including the stars and
the prices so we'll go back to our
code and now that we have these methods let's use them in our other page which
is the checkout page so we'll open scripts
checkout. JS and this basically displays the
products on the checkout page if we scroll to the HTML and find
the delivery date the product image and the product name we're going to see that
here we're also calculating the product's price directly in the
HTML so instead of doing this let's use the method we just created so select
this code and remove it and insert the matching product this time so
matching product and remember we converted all of
our products into classes so this is not a regular object anymore it's more of an
enhanced object it's a product class and that means this will have the
method. get price and brackets and Save so now let's open the checkout page to
see if this works we'll open the web page and then at the top right we're
going to click the cart and now you can see that on the
checkout page the price is still displayed
correctly and that's it if we go back to our
code you'll see that by converting our objects into classes we're able to use
extra features of classes like methods to make our code
cleaner so now let's make sure that all of our tests are passing we'll go to the
left and scroll down and we're going to open test.html in the browser so if you
don't have it open you can right click and open with live server but for me I
already have it open so I'm going to open the test page and all of our tests
are still passing so our code is still correct and now now let's save our
changes into git we'll open the git section and in products. JS we created
the products class and at the bottom we converted all of our objects into the
products class so actually one thing I forgot to
do is to clean up these console. logs so let's do that right now we're going to
open our code and go into products. JS and we'll scroll down right after the
product class and let's remove this product one because it was just an
example and we'll also remove the console.log products at the
end and save so now if we go back into git and
open products. JS we just have the code where we convert our objects into a
class in amazon. JS we use the feature of classes called
Methods to make our code cleaner in checkout. JS we stop loading our cart
class practice file and in orders summary. JS we also use a method to make
our code cleaner so now let's create a message to
describe these changes
convert products into classes and commit next we're going to learn an important
feature of objectoriented programming called
inheritance inheritance lets us reuse code between
classes so first let's learn the concept of
inheritance to do that we're going to open our
project so we'll open this page here to our checkout page
and we're going to go to the homepage by clicking the top
left and on this page we have a bunch of products but you also notice that we
have different types of products for example we have clothing like this
t-shirt and we have appliances like this toaster so clothing and appliances are
still products they have a name a price and a rating but they are a more
specific type of product for example clothing can have all the properties of
a regular product but it can also have specific properties like a size
chart so how do we represent this kind of relationship in our code we have a
product and then we have a more specific type of
product one way to represent this is to create a new class called clothing and
this class will have all the properties of a regular product but also more
specific properties however there's a problem
with this which is we're duplicating a lot of
code instead objectoriented programming has a feature called inheritance that
allows one class to get all the properties and methods from another
class so we don't have to copy paste this
code for example we can make a clothing class and then use inheritance to get
all the properties and methods from the product
class this is similar to how a child inherits things from their parents like
their hair color or the shape of their eyes in fact we call the product class
the parent class and we call the clothing class the child
class so now let's learn how to use inheritance in our code we're going to
open VSS code and open our code on the left and
then open products. JS and we're going to scroll to the
product class and then below this class we're going to create a more specific
type of product called class and capital c
clothing and curly brackets so we said that clothing is is
just a specific type of product so that means clothing should have all the
properties and methods of a product so first let's inherit all these
properties and methods into the clothing class to use inheritance after the class
name we're going to use the word extends and then we're going to give it
the class that we want to inherit from which is the product class
Above So this means that clothing will get all the properties and methods of
this class or it will inherit all the properties and
methods to demonstrate this let's leave this empty and create a new clothing
object so down here let's create a variable first using
const and we'll name it a t-shirt make it equal
and we'll generate a new clothing object to do that we'll use the word New
Capital C clothing and brackets and next we're going to expand
the products array and we're going to give the product details to this class
so we're going to scroll down to the third product which is the
t-shirt and we're going to select this object
and then right click
copy and scroll up and now between these brackets we're
going to right click and paste so now we created a new closing
class we gave it all the data that it needs and let's console.log it to see
what it looks like so down here we're going to
console.log brackets and the variable name which is t-shirt so here
t-shirt and save and now let's open the console so
we'll open our web page and then on this page we're going to right
click inspect and open the
console and you'll see that we created a new clothing
object and if we open it you'll see that this has the same properties as the
product class so this inherited all the properties
from product so let's see if we inherited the
methods as well we'll go to our code and let's try the method get price
so we'll console.log
t-shirt. getet price and brackets and
save and now if we open the console again you'll see that get price also
works so clothing inherited the methods from product as well so even though this
is empty this class gets or inherits all the properties and methods of
product so we use inheritance when we have one class which is a more specific
type of another class for example clothing is a more specific type of
product we want all the properties and methods of the product still but we just
don't want to copy paste all this code down here so inheritance lets us reuse
code between classes so now that we have this
clothing class we can add properties and methods that are more specific to
clothing for example clothing can have a size
chart so for conv convenience inside this t-shirt object I've actually added
a size chart link so let's add this to our clothing class so up here we're
going to add a property size chart
link and now to set this value we're going to use the Constructor like we did
before so down here we're going to use a Constructor brackets and curly brackets
and we're going to give this a parameter called Product
details so when we create the clothing we save this object into product details
and then we can use it to set the properties up here so we're going to do
this do size chart link and make it equal to the product details
which is this object and we're going to get the size chart link
property dot size chart link now one problem we have here is
that clothing inherits all the properties from the product so we also
need to set the ID the image the name and so on so if we scroll down we could
do something like this . ID equals product details.
ID however instead of doing this one by one all over again inheritance gives us
a shortcut we can actually just use the Constructor in the parent class up
here so to call the parents Constructor we're going to use a special feature of
classes called super and brackets so super basically calls the Constructor
of the parent class which is the product so this will call the Constructor up
here and we also need to give this the product details so down here we're going
to call Super and give it the product details so this will call the
Constructor of the parent class which is product and that will set the ID the
name and the rating so now let's save
this and check our console again and open up the clothing object
and you'll see that now we have a size chart link
property so that's how inheritance Works a class can get or inherit all the
properties and methods of another class and reuse that code and this class can
also have more specific properties and methods like a size chart
link one last thing to know is that if we don't create a Constructor by default
it will run the parents Constructor so that's why when this class was empty the
code still worked now that we have this clothing
class we're going to use it in our project so right now if we scroll down
to our products array we can converted all of these into a product
class however we're going to convert some of them like the t-shirt into a
clothing class instead to make it more specific so how do we know which objects
to convert into a product and which ones to convert into clothing to help us do
that I included a property called type so type tells us which class we should
use when we're converting this into a class this is sometimes called a
discriminator property it tells us which class we should convert this
to so we're going to go down to the bottom of this code so I'm going to do a
trick here I'm going to scroll up to the products array and click this Arrow to
collapse it and then at the bottom we're going to use that type property to
decide which class to use so inside this function we're going to use an if
statement bracket ET and curler brackets and inside we're going to check
the type property product
details. type and we'll check if it is equal to
the string clothing if it is equal to clothing
we're going to convert this object into a clothing class instead so let's
return new Capital C clothing and brackets and we're going to give the
Constructor product details so now our array will contain a
mix of regular products and clothing next for each of our clothing
we're going to display the size chart link on the
page but first let's make sure that we have this image here the closing size
chart so if we go into our images folder you might see the image here
called clothing siiz chart.png but currently I don't have
this so I need to download this first to do that we're going to click this link
in the description which will open the size
chart and then on this image we're going to
right click save image as and then find the folder that
contains all our code so for me it's on the
desktop inside a JavaScript Amazon Project and inside the images
folder and we'll save it here and if we go back to our code we
should have the closing size chart image inside the images
folder now let's display the size chart on the
page so if I go to the homepage whenever we have a clothing
product like this t-shirt we're going to display a size chart
underneath let's go back to our code and open amazon. JS which creates
the homepage which is right
here and we're going to scroll down the HTML below the product price and the
quantity selector here and underneath this if we have a clothing product we're
going to display a size chart link under the quantity selector like
this so one way we can do this is to use something like an if statement or a
turnery like a this if it's a clothing then display some HTML if it's not a
clothing then just display nothing however we're going to learn a
different way to do this using inheritance so first we're going to
create a new method on the clothing class that's going to generate the HTML
that we need here so we're going to go to our code and scroll up and open
products. Js and we're going to scroll up to the
clothing class and at the bottom we're going to
create a new method and let's call it extra
info HTML brackets and Cur
brackets so this method will generate some HTML that contains some extra
information about this product like the size
chart so here we're going to return some HTML and we use a template string
because we're going to insert some values inside and inside here let's
create some HTML for a link to create a link we're going to use
the code less than a greater than less than SL a greater than so this HTML
element creates a link when we click this link it will open another page
page inside this link let's put the text size chart so this is what's going to
show up on the page and Link elements have two
attributes the first attribute is called hre Equals double
quotes So this tells the computer which page this should open when we click this
link inside here we're going to insert the size chart link so we're going to
insert this. size chart link so when we click this it will open
a page containing the size chart image we'll scroll back
up and Link elements can have another attribute called Target equals double
quotes and we're going to give it a value of underscore blank
and I'll add some new lines here to make it a little easier to
read so Target equals blank tells the link to open in a new
tab so now let's save this file and we'll go back to the homepage
so I'll scroll down here to amazon. JS and below the quantity
selector let's insert and we'll call the method that we
just created which is the product. extra info
HTML and brackets so this will ins some HTML
containing extra information about the product like the size
chart now before we run this code there's one thing that we need to fix
currently only the clothing class has this
method if it's just a regular product it's not going to have this method and
it's going to cause an error to fix this we're also going to
create this method on the product class so we'll go back to our
code and open products. JS and we're going to scroll up to the
products class here and at the bottom we're going to add the same
method extra info HTML brackets and curly
brackets and for regular products we don't have any extra info we want to
display so let's just return and empty string and
save so now if we call extra info HTML it doesn't matter if it's a product or a
clothing both of these will have this method
defined so we'll go back to amazon. JS and now this should always
work so let's click this file and save and then open the web page to see
the result so now you notice that products
that are clothing have a size chart underneath and regular products don't
have any extra information and if we click the size
chart link it will open a new tab to the size chart image
so that's how we create this size chart link for only the clothing
products let's go back to our code and we'll learn more about this new
technique that we just used so on the left we'll go back to
products.jpg ML and then clothing extends this
class that means clothing will automatically get the extra info HTML
method but then we Define this method again inside
clothing so this will actually override or replace the parents method and this
technique is called method overwriting one more thing to know about
method overwriting is that if we really need access to the parents method
there's a feature that we can use called super so super gives us access to the
parent class so if we want to call this method
up here we can do super and then extra info
HTML so it's the same super as we used up here except this calls the parents
Constructor and this calls one of the parents
methods so let's comment this out since it's just an
example and let's save and lastly let's go back to amazon.
JS and we'll take a look at this code and notice that when we call extra info
HTML we don't know what class this is this might be a clothing class or a
might just be a product class this technique is called
polymorphism which means we can use a method without needing to know exactly
what class this is polymorphism is sort of like an
alternative to doing if statements here instead of doing if it's clothing do
this if it's a regular product do something else we can just have both of
the classes use the same method and then the class itself will Det determine what
this method does if we add a new class like an
appliance class we don't need to change any of this code the appliance class
will determine what extra info HTML does and that's it we learned about
inheritance which lets us reuse code between classes and we learn some of the
techniques we can do with inheritance like method overwriting and polymorph
PRM which can make our code a little bit cleaner now let's check our test to make
sure that everything still works so we'll open the test page and make sure
that everything is still passing and then we'll go back to our code and we'll
save this into git open the git section and in products.
JS we created the clothing class which inherits from product
and one thing I forgot to do is to remove this practice
code so let's actually go back to our code in products.
JS and below the clothing let's remove this practice
code and save we'll go back to
G and just make sure that it's been removed and then we added the size chart
image and in amazon. JS we used polymorphism
to add some extra info below each product so let's create a message
describing our changes use
inheritance and polymorphism to add size chart and
commit in the rest of this lesson we're going
to learn more details about classes the first detail is how to test classes so
testing classes is the same as writing normal
tests so we generate an object using a class and then we test if its properties
and methods are correct I'll leave writing tests as an
exercise at the end of this lesson the second detail we're going to
learn is built in classes these are classes that are
provided by the language so let's go back to our
code and open products. JS again and we're going to practice using
a builtin class an example of a built-in class is
date this class generates an object that represents the current date
below the classes that we created we're going to create some new lines and we're
going to practice using the built-in date
class first we'll generate a new date object using the code new and then the
class capital D date and brackets and now let's save this object
in a variable so at the front we'll use const and we'll call it date and make it
equal to this object that we just generated and below this let's
console.log the date to see what it looks like so we'll
save and then open the page and we'll go back to our project
here and we're going to check the console so right click
inspect and the console and we can see that the date
object represents the current date and time so this is the current date and
time that I'm recording this video so this date object has properties
and methods that we can use that are related to the
date for example we'll go back to our code and every date object has a method
called two local time string this basically gives us the current
time so let's try it out we'll create create a new line and type the code date
dot to local time string and brackets so make sure that this is in cam case two
is lowercase and every other word starts with an
uppercase and we'll console.log this to see what it looks like
console. log and brackets so let's save this file
and open the console and that method gave us the time
so for you you should see your current time
here so that's the built-in date class it lets us create objects that represent
the current date and time an interesting thing to know is
that we used the external Library DJs earlier in the project DJs uses this
date class behind the scenes however DJs gives us a lot of
extra features so we usually use DJs instead of using the date class
directly so now let's comment out this code because it was just an example so
at the top we'll type slashstar and below it star
slash the last thing we're going to learn is more detail dets about
this as a reminder inside an object we can use the
value this and this will point to the outer
object so this feature lets an object access its own
properties now in JavaScript this can actually be used anywhere in our
code for example we're going to create some new lines
and here we can just directly console.log
this so here we're using this but we're using it outside of any object in this
situation there's no object for this to point to so this will be undefined which
actually makes sense if we
save and we check our console this will equal
undefined now originally this actually equaled the window
object however this Behavior caused confusion so when they release
JavaScript modules inside a module this is now undefined which makes more
sense let's go back to our code and another place we can use this is when
we're creating an object so let's go down here and we're going to create a
new object using const we'll call it object two and make it equal to curly
brackets and we're going to give this object a property let's just call it a
colon give it a value of two comma and add another property B
colon and we'll set the value of this property to this Dot
a now you might think that because we're inside this object this will point to
object 2 however at this point in the code object two has not been created yet
so this doesn't have anything to point to and this will be
undefined if we save and then open the
console it will give us an error because this is
undefined let's go back to our code so so far if we're inside a method
we can use this and it will point to the object if we're outside of a method
there's no object to point to and this will be
undefined and everything makes sense so far so let's comment this out using SL
star and and at the bottom start slash now the last important place we
can use this is inside a function so at the bottom here we're
going to create a function and let's call it log this
brackets and curly brackets and inside we're just going to
console. log this so again we're not inside of any object
so there's nothing for this to point2 and in this situation this will be
undefined as well below this if we run the function
log this and brackets and save and check the
console it will tell us that this is undefined when it's just inside a
regular function next this actually has a
special feature so inside a function we can
change this to whatever we want to do that functions have a method called
call So Below this line let's type the function name log this and use a method
do call and brackets so call runs this function so it does
the same thing as the line above except we can set the value of this to be
whatever we want so the first value that we give to do call is going to be the
value of this for example we can give it the string
hello and now this will run the function and this will be equal to hello if we
save and open the
console you can see that we set this to be equal to
hello so that's a special feature of this inside just a function we can
change this to whatever we want using a method like
call so call is the same as calling or running the function except we add an
extra parameter in front this first parameter is the value of
this the last important thing to know about this is that Arrow functions do
not change the value of this for example below this let's create
a method by using an arrow function this time so we'll create some new lines and
first we're going to create an object using
const we'll call it object three equals curly
brackets and inside will give it a method and colon and we're going to
create this method using an arrow function this time brackets arrow and
curly brackets and inside we'll just console. log
this so usually this will point to the object itself
however Arrow functions do not change the value of
this here this will have the same value as outside the arrow
function outside the arrow function let's type
this here this has no object to point to so this will be
undefined and then inside the arrow function it will also be undefined
basically this keeps the value that it had outside the arrow
function as a test below this we'll run object 3. method and
brackets if we save and check the
console it will show us that inside here this is also undefined
so in an arrow function this will be whatever the value is outside the arrow
function now you might be wondering why are Arrow functions designed this
way so JavaScript had a common problem in the past when we are inside a method
this points to the object but if we try to do a for each Loop inside the for
each Loop this does not point to the object anymore it points to undefined
and that's because we created a whole new function here and remember inside a
regular function this becomes undefined so this caused problems
because we no longer had access to the outer object up
here so that's why we created Arrow functions if we replace this with an
arrow function this would be equal to whatever it is outside the Arrow
function Arrow functions do not change the value of
this so outside for each this points to the object and inside for each this also
points to the object so that's why Arrow functions are
designed this way to avoid accidentally overwriting
this so let's summarize what we learned about this inside a method this points
to to the outer object inside a function this is undefined but we can change it
to whatever we want using something like call and arrow functions do not change
the value of this don't worry if these rules are a
bit confusing at first they are actually sort of
reasonable if there's an object to point to this will point to that object if
there's no object to point to this will be undefined and we have tools like call
and arrow functions to kind of manipulate the value of this to be what
we want the more that you work with it the more you just get used to
it so now let's comment out this practice code at the top we'll type
slashstar and at the bottom star slash and
save and we'll save to get we'll open the git
section inside products. JS we added some practice code to learn more details
about classes and this let's type a message describing our
changes learn more details about classes and this and commit
now that we learned object-oriented programming you might notice that it's a
very different style of programming than just writing out a bunch of functions
directly so you might be wondering which style of programming should we use
objectoriented programming or procedural programming which is the step-by-step
style that we used in the earlier lessons the answer is it's up to you I
personally prefer procedural programming in JavaScript because I think it's
simpler I only use objectoriented programming if I'm working on a team
that also uses it also object-oriented programming is much more popular in
other languages so it's still useful to know object-oriented programming in case
you work with other programming languages in the
future and that's the end of this lesson in this lesson we learned about
objectoriented programming which means we organize our code into objects we
learned how to use a function to generate objects and we improve that by
using a class to generate objects we learned that classes can have private
properties and methods we learned about inheritance which lets us reuse code
between classes and we learned about method overwriting and polymorphism
which lets us call a method without needing to know what the class is and
lastly we learned more details about this and how to control the value of
this thanks for watching this course so far if you want to support this channel
you can check out the premium version of my courses just like this one where you
can get a certificate of completion and a Better Learning platform if you're
interested in extra videos from me more in-depth videos and behind the scenes
content you can check out these links here you can also support the channel by
liking the video subscribing and sharing this video with others thanks again and
let's continue with the course here are some exercises to help
you practice what we learned in this lesson
in this lesson we're going to learn about backend and this will prepare you
for the next step after finishing this course first of all
what is backend a backend is just another computer that manages the data
of a website for example in our Amazon
Project we created this website where we can pick which products we want but how
does Amazon the company know which products that we
ordered in this situation there has to be a second computer somewhere that's
owned by Amazon and then our computer sends the
order information to this second computer and now Amazon will know what
we ordered so this second computer is
called the backend computer or just the backend it manages the data of a
website on the other hand our computer or the web page where we can see and
interact with the products this is called the front end
now that we know what a backend is how does our computer or the front end send
information to the back end when two computers are connected to the internet
they can actually send messages to each other using a feature called
HTTP or hypertext transfer protocol in an HTTP message we can
actually attach information like our Amazon order
when Amazon's backend receives this HTTP message now Amazon will know what we
ordered now that we know what HTTP is let's send our first HTTP message using
JavaScript so we'll go to our code and on the left we're going to create a new
file just for practicing backend so we'll scroll up to the data folder and
we'll click inside this folder and then create a new
file and let's name this file backend Das
practice. JS and press enter and now to send an HTTP message
we're going to use a class called XML HTTP request so this is a built in class
meaning it's provided by JavaScript first we gener at an object
using this class using the code new and the class name
XML all capital capital HTTP capital r request and
brackets so this creates a new HTTP message that we want to send to the back
end a message is also known as a request so now let's save this request
in a variable at the front we'll create a variable with const and name it
xhr equals this request next we need to set up this
request so we'll create a new line and to set it up we'll do xhr
doop and brackets and to set up this request
we're going to give open two parameters the first parameter is what
type of HTTP message to send so one type of message we can send
is the string get get means we want to get some
information from the back end there are several common types of
requests that we can give to the backend but we're going to start by learning get
next we're going to give open a second parameter and this parameter tells a
computer where to send this HTTP message so using HTTP we can send a message to
any computer that's connected to the internet now to locate another computer
on the internet we need to use a url url stands for uniform resource
locator and it's kind of like an address but for the internet a URL helps us
locate another computer on the internet so URLs look like this this is
the URL for Amazon YouTube and my website the https in front means we're
using HTTP to communicate with this computer the S after the http means
we're using a secure version of http the second part of a URL is called a
domain name this is like an address it points to another computer on the
internet so amazon.com points to one of Amazon's backend computers youtube.com
points to one of YouTube's backend computers and superimple dodev points to
one of my backend computers if you want to learn more
about domain names and how the internet works you can check out my video on how
to put a website on the internet now for this lesson I actually
set up a backend computer that we can practice with so my backend is located
at the URL https super simple backend
dodev so in the second parameter of open we're going to give it a
string and we're going to give it the URL of the back end end that we want to
send the message to so the URL for my backend is
https colon SL SL super simple backend.
death so that's how we set up an HTTP message we give it the type of message
we want to send and also the URL which is where to send this message to
the last step is to just send this message so we'll create a new line and
we'll type xhr doent brackets and
save so this creates a new HTTP message sets it up and then sends this message
across the internet to my backend computer located at superimple backend.
deev so now let's actually run this code and see the result we're going to go to
the left and we're going to open checkout.
JS and in here just like we did before we're going to load that practice file
that we just created so we'll create a new line and we're going to import a
file or a string and we'll locate that practice
file so first we need to go to the data folder using us dot SL dat slash and
load backend D
practice. JS and save so we'll go back to the practice
file and now when we open the website it will run this code and send the HTTP
message to see that let's open the website so we'll scroll down and if you
don't have the website open you can open it again by right clicking checkout.
HTML and then open with live server I already have the website open
so I'm going to open it and then I'm going to go to the
checkout page and now we're going to look at the
console so we'll right click and
inspect and this time instead of going to the console tab we're going to go to
a new tab called the network
tab if you don't see this tab you can make this window wider or you might find
it under these arrows so we'll open the network
Tab and in here this will show us all the HTTP messages that are coming in and
out of our computer now before we start looking at
the the HTTP messages there's one important thing to know about the
network Tab and that is messages will only appear here after we open the
console if we send some messages and then we open the console it's not going
to show up here so to make sure our HTTP messages
are recorded here we need to open the network tab first and then we're going
to refresh the page to resend those messages and now if we open the network
tab we should be able to see the HTTP messages at the
bottom okay so inside this list we should be able to see that we sent a
message to superimple backend. deev if you don't see it we can also search this
list by using the text box up here so in here we can type part of the
URL that we sent the message to for example super
simple and the message that we sent should appear here so now we can click
this message to get more details about it on the right side we have several
tabs here the headers tab gives us details about our message or about our
request so it tells us which type of requests that we sent which is get and
the URL that we sent it to which is super simple backend.
Dev this sends the request across the internet to my
backend and then when my backend receives this message or this request it
will send back a message which is called a
response to see the response from my backend we can open the the response
Tab and you can see that my backend responded with hello this is super
simple dev's back end and a documentation page that we can check
out so we have successfully sent an HTTP message or a request to my backend and
we got back a response another useful tab here is the
preview tab it basically takes a response and displays it in an easy to
read format so now let's learn some
terminology when we send a message to the backend this message is called a
request we are requesting something from the
backend when the backend receives our request it will send an HTTP message
back to us and this message is called the
response so each request that we make will get one response from the back
end and this is called a request response cycle it's always one request
one response next currently we're viewing
the response in the network tab but we can actually get this response in our
code and then do something with this response so let's go back to our
code and here after we send the requ Quest we can get the response using a
property called xhr do response however there's a slight
problem with doing this when we send a request to the backend it takes time for
the request to travel across the internet to the back end and for the
response to come back so the response is not available
right away and xr. response will be undefined at first so xr. send is known
as asynchronous code asynchronous code means it does not wait for this line of
code to finish it just sends the request and then immediately goes to the next
line the response might come back later in the future but we don't have access
to it here so in this situation in order to
get this response we need to wait for the response to come back first and then
we can access do response in order to wait for the
response to come back at the top after we create the
xhr we're going to use this code xhr do add capital E Event capital L
listener and brackets so this method listens or waits
for an event and then it can run a function so this method takes two
parameters the first parameter is the event that we want to listen for or to
wait for in this case we want to wait for the response to come back so we're
going to give it the string load load means the response has
loaded the second parameter is a function that we want to run
after this event happens so in this case after the
response has loaded we're going to run a function brackets arrow and curly
brackets so because this function runs after the response loaded inside here we
can access xhr do response and this will not be undefined
it will contain the response that we saw earlier in the network
tab so let's console.log this to see what it looks like
console.log and brackets and we'll remove this line at
the end and
save so now let's go back and check the console for the response so we'll open
the console and then open the console
Tab and here you can see that we have the response in our code and we console.
logged it so this
response is a string and now we can save this in a variable or do whatever we
want with it in our code now one thing you might be
wondering is why do we put the event listener up here at the top so first we
need to set up the event listener and then trigger the event or send the
request this is the same as setting up an event listener for clicking a button
we need to set up the event listener first and then we click the button
after so that's how we send a request to the back end wait for the response and
then save the response in our code next we can send different messages
or different requests to the backend using URL
paths a URL path is the part that comes after the domain name for example in
this URL the URL path is /hello in this URL the URL path is/ products
slir in this URL if there is no URL path the URL path is
slash we can send a request to these URL paths and each URL path will give us a
different response so let's try sending requests
to different URL paths and see what different responses that we
get so for this example let's send the request to super simple backend. deev
and then the URL path SL hello and save and now let's open our console to
see the response and here you can see that this URL path
gave us a different response than last time let's go back and try another URL
path to see what it looks like so we'll delete this and then send the request to
slash products slir and
save and we'll open the console to view the
response and here here this URL path give us a Json and this contains the
details of the first product in our Amazon
Project so we can send requests to different URL paths and we will get
different responses from the backend next a backend only supports a
certain set of URL paths for example when I created my backend super simple
backend .d I had to decide which URL paths are supported and how my backend
would respond to each URL path if we send a request to a URL path that is not
supported the back end will respond with an
error let's go back to our code and we'll try a URL path that is
not supported so let's remove this at the
end and we'll try sending the request to
not- supported and
save and now if we look at our console you'll see that the backend
responded with an error message saying this URL path is not
supported the browser will also console.log this red error
message this red message is displayed automatically when there's an error
so this message tells us the type of request that we sent which is get and
the URL that we sent it to and also this number which is called the status
code whenever we get a response from the backend the backend also gives us a
status code which tells us if a request succeeded or
failed a status code that starts with four or five means the response
failed starting with four means it was our problem we sent the request to a URL
path that was not supported starting with five means it
was the backends problem for example the backend
crashed a status code starting with a two means the response was
successful so we can also see the status code in the network
tab so we can search for our request and then when we click the request in the
headers tab it will show us the status code in this
row so this tells us if our request succeeded or
failed so now you might be wondering how do we know which URL paths are supported
and which are not so there's actually no way to figure
out all the URL paths that are supported and this is for security reasons
however some backends do provide a documentation page that lists the URL
paths that are supported and also what kind of response that they give for my
backend I created a documentation page and we're going to take a look at that
so we'll open the browser and at the top we're going to
create a new tab and to see the documentation for my
backend we're going to go to super simple back back end dodev SL
documentation and press enter so this is the documentation page
for my backend it gives us a list of which URL paths that are supported and
what each URL path does so when we make a request to slash it will give us this
message which we saw earlier if we make a request to /hello it will give us this
message which we also saw earlier so by the way the list of all
the URL paths that are supported is called the backend
API API means application programming interface interface means how we
interact with something so this list of URL paths are all the ways that we can
interact with the backend and that's why we call this the backend
API next the backend can respond with different types of data so one type of
data the back end can respond with is text for example when we sent the
request to get/ hello it gave us some text
back so in our code if we change this URL path to
/hello and
save and we open the console and click the console
tab it gives us back some text we can also see what type of
response that we got using the network tab so we'll open the network Tab and
then search for the request and then here when we click
it inside the headers tab if we scroll down to the response
section here it will give us the content type or the type of response that we got
back so in this example /hello gave us some text and the type is text
slpl another type of data the backend can respond with is
Json so if we go back to our code and change the url path to products
slir and save and then look at our
console in the network tab we'll open this request and inside the headers if
we scroll down it will tell us that the type of
the response is application SL Json so the backend sent us back some
Json if we open the console tab we can see the Json string here
so once we get this Json from the backend we can use json.parse to convert
this back into a JavaScript object basically this allows us to send
JavaScript objects across the internet to the back
end another type of data the back end can respond with is
HTML we'll go back to our code and we'll change the URL path to
documentation so this was the documentation page that we saw earlier
if we save and then open the
console you'll see that the back end responded with a bunch of
HTML if we look at the network Tab and search for the request and open the
request here and in the headers tab we scroll down
to the content type it will tell us that the type of the response was text/html
finally another type of data the backend can respond with is an
image for example we'll go back to our code and change the url path to
imagesapple jpg and say
save and we'll open the console and in the network tab we can
open this request and in the headers tab we can
scroll down and it will tell us that the type of response was an
image/jpeg as you can see the backend can respond with different types of data
not just text okay so we got this image back from
the back end but what does this look like in the console we'll open the
console and we'll see that we just get a bunch of random characters here and
that's because the console is trying to display the image as text but the image
is not really text this is the image's raw data so
that's why it shows all these random characters
here however it would be better to display this as an actual ual image
instead of raw data we can display this as an image by
using the browser so if we open the
browser when we type a URL at the top of the browser it actually sends a get
request to that URL so typing in here actually does the
same thing as our code it makes a get request the one big difference is that
that in the browser when it gets back the response it will display the
response on the page for example if we enter superimple
backend dodev and change the url path to just nothing or slash and press
enter this actually sends a get request to my back end the backend responds with
some text and it displays this response on the
page so using the browser is the same thing as making a get
request now the cool thing about this is that if the browser gets back an image
it will display it as an actual image instead of raw data that we saw in the
console so here if we change the url path
to/ images slapple jpg and press enter
it will get back the same image as before except the browser will display
it as an actual image on the page same thing happens with the backend
responds with HTML so at the Top If we change the url
path to slash documentation and press
enter if the response from the back end is HTML theow browser will display this
HTML as an actual web page instead of raw
HTML so again using the browser is the same thing as making a get
request and depending on the type of response the browser can display the
response in a more useful way on the page and that's it we learn the basics
of how a backend Works how to send requests to a backend and how to send
requests to different different URL paths so now let's go back into our
code and we'll remove this URL path and just dodev so that we don't keep console
logging and image and then save and let's save this practice code
into git we'll open the kit section in backend practice we learn how
to make requests to the backend and in checkout. J we loaded that backend
practice file so let's type a message describing
our changes add backend
practice file and commit now that we learned what a
backend is and how to communicate with a backend let's use a backend in our
project so first we're going to open our code
and we're actually going to open checkout.
JS and we're going to comment out this import statement because we're not going
to run the practice file anymore so we'll type double slash to comment that
out and save next super simple backend dodev has
a URL path called slash products this gives us a list of all the
products in the Amazon Project so first let's open our browser and visit this
URL path to see what the response looks like we'll open this tab to super simple
backend dodev and we're going to change the url path at the end to slash
products and press enter and you can see that this URL path
gives us a Json response so this contains all the details of the products
for our project now instead of using a file on
our computer to load the products let's use the backend to load the
products so let's go back into our code and on the left we're going to open
data/ products. JS and we're going to scroll down to the
array of prodct S at the end so now instead of loading the products from
this file we're going to load the products from the back end so first
let's comment out all this code if you need to you can click this arrow on the
left to collapse this array and we're going to comment this out using slash
star and at the end star slash and above this we're going to load
the products from the back end first let's create a variable to save
the products again so we use let products equal and empty array and let's
export this so we can use it outside of this file like before at the front we'll
type export next let's create a function to
load these products from the back end we'll create a
function and let's name it load products brackets and curly
brackets and inside here we're going to create an XML HTTP request again to make
a request to my backend so to create a request we're
going to use new in the class XML HTTP request and brackets so this will
generate a new request object and let's save this in a variable
so at the front we'll use const and we'll name it xhr equals this
object next we're going to set up the request using xhr doop and
brackets so open takes two parameters the first parameter is the type of
request that we want to send in this case the type of request will be the
string get and we're going to give open a second
parameter which is the URL that we want to send this request to so we'll give it
a string and the URL of my backend is https colon slash super simple backend
dodev and then we'll add the URL path which is slash
products finally we're going to send this request using the code xr. send and
brackets so this will create and set up a request and then send it to my backend
now remember that do send is asynchronous that means it will just
send the request but it will not wait for a response to come
back in order to wait for a response above this code we're going to create
some new lines and set up an event listener using
xr. add event listener and brackets and this takes two parameters
the first one is the event we want to listen for in this case it's the string
load which means the response has loaded next we're going to give it a
second parameter which is a function so brackets Arrow and curly
brackets and this is a function that we want to run after the response has
loaded so inside here after the response has loaded we can access it using xhr do
response for now let's console.log this to see what it looks like so we console.
log and brackets finally let's run this function so that
we run all this code at the bottom we're going to load products and
brackets and save so this will send a request to my
backend and then once we get the response it will display it in the
console so now let's go to our website we're going to open the project
tab and don't worry if the page is blank for
you we're going to fix this in a bit for now we're going to open the console by
right clicking
inspect and open the console and in here you'll see that xr.
response gave us this Json and this represents all the products in our
Amazon Project now that we have all this Json
we're going to convert this back into a JavaScript object and then use it in the
rest of our code let's go back to our code and here the response is a
Json we're going to convert it back into a JavaScript object or in this case a
JavaScript array using the code json. pars and
brackets so once we' converted this back to an array we're going to replace the
product up here with what we loaded from the back end to do that we'll do
products and make it equal to this result that we got from the back
end now one more thing we need to do is previously we converted the product
objects into a class so we're just going to do that again with this
array so we'll select the code from map all the way to the end
and then right click copy and
here after this products array that we got from the back
end rightclick paste we're also going to transform this
array from objects into these classes and at the end let's console.log
this products array to see what it looks like now so we'll console
. log products and
save and now if we open the console for our
project you'll see that products is now an array of product classes and clothing
classes so we converted the response from a Json into a JavaScript array and
then into these classes so that's how we load data from
the the back end and then convert it into a JavaScript object or array that
we can use in our code next let's go back to our code and
instead of console. loging the products every time which will display a lot of
stuff in the console let's just console.log a message to make sure that
this is working so we'll change this to the string load products
and now that we have this function let's use it in each of our
Pages first we're going to remove calling this function for now and we're
going to export this function so we can use it outside of this file so
export and save this file and we're going to start from the
homepage so we'll scroll down to the bottom to amazon.
JS and we're going to scroll to the top and first we're going to import load
products we're already importing from products. JS so we'll just add a comma
and load products and now before we run all of
this code at the top we're going to load the products first and brackets
so now let's save and open the project in our
browser and we'll click the top left icon to go to the
homepage and you'll see that the homepage is actually empty so what went
wrong here remember that HTTP requests are
asynchronous if we go back into our code load products will send a request
to my back but it takes time for the request to
travel across the internet to my backend and to travel
back so here it will just send the request and at the next line the
response has not loaded yet so the products array is still
empty and when we run this code with an empty array the page will be
empty to solve this problem we need to wait for this HTTP request to finish
first and for the response to come back and then we're going to run the rest of
this code so how do we do
that so we're going to go to the left and we're going to scroll up to data/
products. JS and I'm going to drag this file to
the top so we can see the code side by side and I'll scroll down to the HTTP
request which is right
here and remember that we used an event listener to wait for the response to
come back once the response is loaded we're going to run this
function so basically we want to run all of this code at the bottom of this event
listener so after we've loaded our products so one way to solve this
problem is maybe we can just copy all this code and then paste it at the
bottom here now obviously this doesn't make
sense because we're copy pasting a bunch of code and then we can't really reuse
this function a better solution is we're
going to put all this code in a function and then we can give this
function to load products let's do this step by step
so first at the top let's create a function to group all of this code
together we'll use the word function and let's name it render
products grid brackets and curly brackets and now we're going to move all
of this code into the function so we can do that by removing
this closing curly bracket and then at the bottom we we're
going to scroll down all the way to the bottom here we're going to add back the
closing curler bracket to put all this code inside the function and now let's
also select this code so we can fix the index so we'll select it all the way up
to here and then press tab to add an indet
so now we put all the code inside render products grid
next we're going to put this function inside load products using a parameter
so between these brackets we're going to give it this
function render products
grid so remember in JavaScript functions are values and we can use a function as
a parameter so now inside load products if
we go up here at the top this function will be saved in a parameter so let's
create a parameter at the top and we'll name it fun to say that this parameter
will contain a function so we basically saved this
function inside this parameter and now after we load the response we're going
to run the function so at the bottom here after
we've created the products array we're going to run font and
brackets so that's how we run all of this code after we've loaded the
products we group this code into a function and then we save the function
up here after we load the response we're going to run the
function so let's save these two files we'll save products. Js
and then down here we'll save amazon. JS and then open our
website and you'll see that the products loaded again because this time we're
waiting for the response to come back and then we run our
code so that's how we wait for an HTTP request to finish first and then we run
some code by the the way this function that
we provide to load products this is known as a call back because we're
giving it a function to run in the future or to call in the future so this
function will be called back in the future and we've actually used call
backs before when we wrote the code set timeout we provided set timeout a
function to run in the future or or to call in the future so this function is
also known as a call back don't worry if this technique is a
little complicated at first the more you work with callbacks the more you'll get
used to it let's get some more practice and use
the backend and callbacks on the checkout page so we're going to open
checkout. JS which is the checkout page and first we're going to in import load
products so at the top we'll create an import curly brackets load
products from a string and we'll locate products. JS so
inside here we're in the scripts folder we're going to get out of it using do do
slash and then we're going to go into the data
folder and then we'll add slash data slash and we'll load products.
JS and then down here we're also going to load products and
brackets and again we're going to give load products a call back or a function
that we want to run in the future this time instead of creating a
whole new function we're just going to create a function in inside these
brackets using brackets arrow and curly brackets so we don't need to create a
function name every time we can also just create an anonymous function or a
function without a name and then give this to load products
to run in the future now inside this Anonymous
function we're just going to move this code into here so we'll select this code
and then rightclick cut and then inside here we're going to
rightclick and paste and if you need to you can fix the
formatting so again this is going to save this function inside the parameter
fun and then we're going to call fun after we've loaded all the
products so let's save this file and open our
website and we'll click the cart in the top right to go to the checkout page and
now the checkout page is loading again so that's how we use a backend in
our project we need to send a request and then use a call back to wait for a
response and then run the rest of our code so now let's save our changes into
G we'll go to the git
section and in products. JS we created the load products
function in amazon. JS we used load products and gave it a
call back and in checkout. JS we also used
load products and we gave it a call back using an anonymous function or a
function without a name let's create a message describing
our changes load products from the backend
and commit next we're going to learn testing
with a backend now that we're using a back back
end in our code we need to update our tests first let's go to our code and
we're going to run our tests so we'll scroll to the bottom and if you don't
have the tests open we can run them by right clicking test.html and then click
open with live server now I already have the test open in my browser so I'm just
going to open that Tab and for the video I'll zoom in using
control equals or command equals and we have some failing tests
now so if you did the exercises from the previous few lessons you might have more
than two failing tests but we're going to focus on fixing these two tests here
for the video so first let's open the code for
our order summary tests we'll open vs code and then on the left we're going to
go into the test folder SL checkout SL Ord summary
test.js so now we're going to scroll down in this test and notice that here
we are rendering the order summary which creates the cart on the checkout
page however this card requires the products to be loaded from the back end
and currently we're not loading the products in our tests so that's why the
tests are failing we need to to load the products
first to do that let's import the load products function at the top so we'll
scroll up and we're going to add another
import curly brackets the load products function from a string and we'll locate
products. JS so we need to get out of checkout and out of tests using do do
slash do do slash and and then we'll go into the data folder data/ and load
products. JS and now we could call load products
inside before each but this will load the products before each of our tests so
it will load it multiple times and we don't really need to do this we only
need to load the products once for all of our
tests to do that we're going to use another hook provided by Jasmine called
before all so above before
each we're going to use the function before all and
brackets so this is the before all hook it will run a function before all of our
tests inside these brackets we're going to give it a function to run so brackets
arrow and curly brackets and now before all of our tests we're
going to load the products so let's load products and
brackets and save and now let's open our tests in the
browser and unfortunately the tests are still
failing let's go back to our code and see what the problem is we'll open vs
code and here remember that load products is
asynchronous that means it just sends a request to my back end but it doesn't
wait for the response to come back so it would just send a request and then
continue with the rest of the test code and unfortunately at this point the
response has not come back yet products is still an empty
array to fix this issue we need to wait for a load products to finish first and
then continue with the rest of the test to do that Jasmine has a feature
for waiting for some code to finish called a done
function so in before all we can give this inner Function One parameter called
done so done is a function and it's provided by Jasmine when we we add this
done parameter before all will not automatically go to the next step now
it's just going to wait and it will only go to the next step when we call this
done function so when we do done and brackets then it will go to the next
step if we don't call done then before all we'll just keep waiting forever so
this done function allows us to control exactly when before all finishes and
goes to the next step and this is what we need to fix the
test we need to wait for load products to finish first and then we're going to
call done and then go to the next step to wait for load products to finish
remember we're going to give it a function so between these brackets we'll
create a function using brackets Arrow and curly
brackets now once the products have finished loading it will run the
function inside here we're going to call done and
brackets so this makes sure that the products load first and then we call
done and then it goes to the next step which is the before each hook and then
eventually it runs the tests at the bottom
so now let's save and take a look at our test page
and you'll see that those order summary tests are now passing if you have any
other fail tests I'll leave that as an exercise let's go back to our
code and that's how we test with a backend we wait until the backend code
is finished and then we use the done function to control exactly when to go
to the next step by the way we can also use done inside before each and inside
it as well to wait for backend code to finish now let's save our changes into
git we'll open the get section and inside order summary test we imported
load products and then we called load products and use the done function to
make sure that the products are loaded first and then we go to The Next
Step let's create a message describing our
changes load products in before all hook and
commit next we're going to learn promises which are a better way to
handle asynchronous code promises are similar to Jasmine done function that we
just learned they let us wait for some asynchronous code to finish before going
to the next step so now let's create our first
promise we're going to open our code and on the left we're going to go to
checkout. JS and in here at the top we're going to
practice promises promise is a class so we're going to
type the code new capital P promise and brackets to create a new promise
object now inside these brackets we're going to give it a function so brackets
arrow and curly brackets so that's just how promises are
designed it's a built-in class and when we create a promise we need to give it a
function so when we create This Promise it's
going to run this function immediately so inside here let's
console.log the string promise to show that it runs
immediately so we'll save this file and then go to the
website and we'll open the tab for our project
and I'm going to zoom out a bit by pressing control or command
minus and then open the console right click
inspect and the console and you'll see a logged
promise so when we create a promise it runs this inner function
immediately now this inner function gets a parameter called called
resolve and resolve is a function and it works very similar to Jasmine's done
function so resolve lets us control when to go to the next
step for example let's add some asynchronous code into this
promise we'll remove the console.log and we're going to run load
products which is asynchronous so here we'll type load products and
brackets and now we're going to give load products a callback function like
we did down here brackets arrow and curly
brackets so it will run this function after load products is
finished once this is finished we want to go to the next step so here we're
going to call resolve so resolve and brackets so you can see that the syntax
here is very similar to jasmin's done function we run some asynchronous code
and then we wait for it to finish and then we call resolve to go to the next
step now what is the next step to This Promise so you might think that this
code down here is the next step however a promise actually creates
a separate line of code or a separate thread of
code so here these two groups of code are sort of running at the same time
feel free to pause the video to get a longer look at this
diagram the reason promises are designed this way is it allows JavaScript to do
multiple things at the same time so when the promise finishes it can
do a Next Step but this next step is going to be separate from the rest of
the code it sort of does the next step on the
side so right now this promise creates a separate thread of code but this
separate thread doesn't actually have a next step so we're going to add
one to add a next step to a promise at the end and we're going to use a method
called dot then and brackets and we need to give then a
function so we're going to type brackets arrow and curly
brackets and inside here let's just console.log the string Next
Step so first we run this asynchronous code and then we wait for it to finish
and then we run resolve and resolve makes it go to the next
step to make this easier to see in the console let's actually add some console.
logs to track the progress of this code so at the top let's
console.log the string start promise and then in here let's
console.log the string finished
loading and we'll also comment out the code that we had
before so we'll type slashstar and at the bottom star slash
and now let's save and check our
console so let's go through this step by step first we start the promise which we
see here and then we call load products which we
see here once the products are finished loading it's going to run this function
and then we'll display finish loading and then we're going to call resolve
which goes to the next step which runs this function and we display Next
Step so resolve lets us control when to go to the next
step in this case we waited until load product prodct was finished and then we
called resolve to go to the next step so that's how promises work they
let us split our code into separate steps and then we can wait for one step
to finish before going to the next step now that we understand promises
let's convert the code that we had before from a call back to using a
promise so first let's remove these console. logs to make our code a little
easier to read now in our previous code we
actually had two steps the first step is to call load products and then once this
is finished the second step is to call render order summary and render payment
summary and in our promise we have the same thing our first step is load
product once this is finished we're going to
call resolve and then go to the Second Step so we're just going to copy this
second step into the second step up here so we'll select this code and then right
click copy and in do then we're going to right
click and paste and now let's save
and let's check the web page so we'll open the project and you can see that
everything is loading correctly So This Promise does the same
thing as a call back that we had before both of them have two steps the first
step is to load the products and then we wait for the products to finish loading
and then we do the Second Step which is to render the page
so now you might be wondering why do we use promises it looks like it's more
work and more code than just using a callback so callbacks have a big problem
which is multiple callbacks cause a lot of
nesting nesting means having code inside code like
this to see why this is a problem let's say that we want to load the cart from
the back end as well I actually set up a URL path that we can use to practice
called SLC cart so first let's go into products.
JS and we're going to copy load products and change it to load the
cart so we'll select this function and then
rightclick copy and let's open cart. Js
since we're going to load the cart from the back end and let's scroll down to
the bottom and here we'll right click and
paste that code and now instead of loading the
products let's load the cart from the backend so first let's rename this
function to load Capital C cart and the first thing we need to change is
the URL path so instead of loading SL products we're going to load slash cart
from my backend so normally when we load SL cart
the backend will give us a cart array however since we're just
practicing my backend will just give us some text when we load SL
cart next we don't need this products code anymore so we can select it and
then delete it and instead let's just console. log
brackets and we just display the response that we get back xhr do
response and we can remove this other console.log and
save so now let's use load cart in our previous
example on the left we'll scroll down and open checkout.
JS and at the top let's import load cart so here we'll import curly brackets load
cart from a string and we'll go to the data folder which is do
dotdata slash and we'll load C.J and now we're going to use this in our
callback code to show the problem with callbacks first let's comment out this
promise so we can focus on the Callback code at the top we'll type
slashstar and here star slash and we'll remove the comments for
the Callback and after we load the products
we're also going to load the cart so inside this function we're going
to type load cart brackets and we're going to give it a
function so this function is going to run after the cart has
loaded so now let's say that we want to wait for the products and the cart to
load before we render the page to do that we need to move this
code inside this inner function so we'll select this and then
right click cut inside load cart we're going to
right click and paste and remove this extra
line so now this code is going to load the products wait for it to finish and
then it's going to load the cart and then wait for the cart to finish
and then it will render the page or display the page so let's
save and check the console and now you can see that we
loaded the products and then we loaded the cart and if we open the
page everything was displayed properly so now let's go back to our
code and notice that when we added another call back we we created another
layer of nesting so we have code inside code
inside code the problem with this is that each
layer of nesting adds some indents at the front or spaces at the
front this means if we have lots of callbacks our code will become more and
more nested like this this is a big problem with
callbacks multi multiple callbacks cause a lot of nesting and all these indents
make our code hard to work with the promises solve this problem by
letting us flatten our code for example let's load the products
and the carts again but this time using our promise
instead first let's comment out the Callback using
slashstar and and at the bottom star slash and we're going to uncomment the
promise so here we'll remove the comments and then in the next
step instead of rendering the page we're going to load the cart like
we did down here so we'll type load cart and
brackets now we have a problem here we want to wait for load card to finish and
then go to the next step however we usually do this using resolve but we
don't have resolve inside this function to solve this problem inside.
then we can actually return a new promise so at the top we're going to
return a new promise and brackets so we're going to give this
promise a function just like we did up here so we'll type brackets arrow and
curly brackets and this function gets one
parameter called resolve so inside do then if we want to
use resolve to wait for some code to finish we can return a new promise
so now let's move our code into this new promise so we can use resolve so we'll
select this code and then right click cut and inside here we're going to right
click and paste and remove these new
lines and we can give load card a function to run when it's finished so
we'll type brackets arrow and and curly brackets once load card is finished it
runs this function and then inside here we're going to call resolve so that we
move to the next step so here we'll call resolve and
brackets so now this will go to the next step and we currently don't have a next
step to This Promise so let's add The Next Step at the end to add another step
we're going to use dot then brackets and we'll give this a function
brackets arrow and curler brackets so the third step is to render
the page so we're going to do the same thing inside
here so let's select this code and we'll rightclick copy
inside the third step we're going to right click and
paste and adjust the formatting if you need
to so that's how we do these three steps in the Callback using a
promise we do the first step wait for it to finish call resolve and then it goes
to the second step we do the Second Step wait for it to finish call resolve and
and then we go to the third step so we promise let us have as many
steps as we want and we can use resolve to wait for each step to finish before
going to the next step so let's save this and check the
console to make sure it worked so we'll open the
console and inside here we have the same messages as last time first we load the
products we wait for it to finish and then go to the next step then we load
the cart wait for it to finish and then go
to the next step and then we render or display the page if we open the page
you'll see that everything displayed properly so now let's go back and
compare promises and callbacks so even though promises
require a bunch of set up code you can see that it keeps our code relatively
flat the third step doesn't get more and more nested like in
callbacks so if we have lots of steps in our promise this is what the code will
look like you can see that even when we add more steps the code does not become
more and more nested so promises help keep our code
flat and avoid too much
nesting so that's why it's recommended to use promises instead of callbacks
promises will keep our code more flat so let's actually add some new
lines here as well as here to better separate these steps so
it's a little easier to read lastly we're going to learn two more
features of promises the first feature is we can
give resolve a value so inside here let's give it a value like the string
value one so whatever we give to resolve is
going to be saved in a parameter inside doth so inside this function we can add
a parameter called value and now whatever we give to resolve is
going to be saved inside here and now we can use
it so this lets us share a value between two steps of a
promise so in here let's check if this worked using
console.log value and
save and if we look inside our console you'll see that it displayed
value one so whatever we give to resolve will
be saved in this parameter the second feature is we can
run multiple Promises at the same time currently we wait for things to load one
at a time for example we wait for the products to load and then we wait for
the cart to load and then we go to the next step to make this more efficient we
can actually load the products and the cart at the same
time to do that we can use a feature called
promise.all promise.all lets us run multiple Promises at the same time and
wait for all of them to finish so let's scroll to the top and
we'll do an example so here we'll type the code
capital P promise.all and
brackets inside these brackets we're going to give this an
array inside this array we can give it multiple promises to wait
for so let's just copy paste the two promises that we have here into this
array so we'll start from here at the end of the first promise and we'll
select this code right click copy and in this array we're going to
right click and paste and remove this line so we have
our first promise and at the end we're going to add a comma and we're going to
give it a second promise so we'll scroll down to our second promise here and
we're going to select this code starting from here
and select the promise right click copy and at the top we're going to right
click and paste so we basically created an array
of promises and then we're going to give this array to
promise.all and it's going to wait for all of the promises to finish before
going to the next step so now let's add a next
Step at the end to add a Next Step we're going to use dot then and brackets and
we'll add a new line to make it a little easier to
read so as usual dot then adds a next step to a
promise it will give it a function to run so brackets arrow and curling
brackets after we load the products and load the cart we're going to render the
page so let's copy paste that code inside this next step so we'll scroll
down to the render code and we'll select it right click
copy and at the top inside then we'll right click and
paste so now let's comment out our old promise and try out promise do
all above our old promise we're going to type
slashstar and below it we're going to type star
slash and let's save we'll go to our
console and you can see that it did the same thing it loaded the products and it
loaded the cart and it's going to wait for both of them to call resolve before
going to the next step which is to render or display the page if we open
the page you'll see that everything displayed
properly so that's promise.all we can give it an array of
promises and it will run both of them at the same time instead of waiting for
each promise one by one also the values that we give to
resolve are saved in a parameter so inside do then we can add a parameter
called values and then these values that we
give to resolve are going to be saved inside here so if we
console.log values and
save and check the console and it gives us an array of
values the first value is from the first promise and the second value is from the
the second promise so here we didn't give anything to resolve so the second
value is undefined so that's an overview of
promises and promise.all promises are a better way to
wait for asynchronous code to finish versus
callbacks because they help us avoid nesting and keep our code relatively
flat promises also have more features like promise all which lets us run
multiple Promises at the same time now let's save our changes into git
we're going to open the git section inside cart.
JS we added a function to practice loading the cart from the back
end and then in checkout. JS we learn a promises and converted our
code from a callback to a promise let's type a message describing our
changes learn promises and convert code to promises
and commit now that we learned promises
we're going to learn another feature called
fetch fetch is a better way to make htd PP
requests let's go back to our code and we're going to open products.
JS and we're going to scroll down to the load products
function currently we're using XML HTTP request to make requests to the back end
and this uses a call back fetch also lets us make requests to
the backend but fetch uses a promise so let's do an example and we'll
make the same request except using fetch this
time we'll scroll up and above load products let's create another function
using function and we'll name it load products
Fetch and brackets and curly brackets and to use fetch we're going to
use the built-in function Fetch and brackets so this makes an HTTP request
just like we did down here so let's make the same request as we did in this
function at the bottom we made a get request to this
URL so by default fetch will make a get request so we just need to give it the
the URL that we want to make the request to so at the bottom let's select this
URL and we're just going to rightclick
copy and at the top inside fetch we're going to right click and
paste so this will make the exact same request as we did
below so you can see that fetch is a lot more simple than XML HTTP request we
don't have to create a new object or do any setup we can just call Fetch and
tell it where we want the request to go so this will send a request to the
back end and now how do we get the response so instead of using a call back
to get the response fetch uses a promise when we call fetch this is going
to create a promise and we can add a next step to This Promise using dot then
and brackets so we give dot then a function
brackets arrow and curly brackets so the way this works is that
fetch is going to send a request to the backend when we get a response it's
going to go to the next step it's also going to save the
response inside inside a parameter in here so we'll add a parameter called
response and this will contain the response from the back
end so instead of using a call back to wait for the response fetch uses a
promise to wait for the response so here let's
console.log the response to see what it looks
like and now let's run this code at the
bottom we'll run this function using load products Fetch and
brackets so now let's save and take a look at the
console so here's the response that we get from Fetch if we open it you can see
it gives us a bunch of information about the response like the status or whether
it succeeded or failed as well as the URL that we made
the request to so how do we get the data for the
products from this response to do that we'll go back to our
code and to get data that's attached to this
response we're going to use response. Json and
brackets so this gives us the Json or the data attached to the response in
this case it's our products data next response. Jon is actually
asynchronous it returns a promise so we need to wait for this
promise to finish before we continue to the next
step to do that inside. then we can actually return another promise so here
we're going to return this promise when we return a promise it will
wait for this promise to finish before going to the next
step so now let's add another step to This Promise using dot then brackets and
we'll give this a function again so brackets arrow and curly
brackets when response. Json finishes it's going to give us the data that's
attached to the response and it's going to save it inside this
parameter so this response should contain our products data so let's name
this parameter products data and let's
console.log this to see what it looks like so here we
console. log the products
data and and save and let's open the
console and you see here that the product data is the array of products
that we're going to use in our Amazon Project you'll also notice that instead
of giving us just a big Json string like before it actually converted the Json
into an array so basically it did json. pars on the response for us so this this
saved us a little bit of code finally now that we have the
products array let's do the same thing that we did down here so we'll scroll
down and select all of this code and we'll right
click copy and then up
here we'll remove this and rightclick and
paste so we'll do the same steps as before
except using a promise this time first instead of doing json. pars
on the response we already have the array of products so we can remove this
and replace it with products data and then we're still going to
convert this from objects to classes like before we'll keep this console.log
so we can track the progress this last line of code let us do
something after we finish loading the products however instead of using a call
back like before we're going to remove this
line and to do something after this step we can actually return this entire
promise so to make it easier to read let's save this entire promise into a
variable using const let's call it promise equals
fetch so let's add some new lines here as well as here to make the code a
little easier to read so we're basically calling fetch
which creates a promise and then we're going to save this promise inside this
variable and then at the end of this function we can just
return the promise so we're just going to return this whole promise out of the
function and then we can add even more steps after this
promise so down here this is going to give us the promise and then we can
attach another step using dot then brackets and inside here we can give it
a function brackets arrow and curly
brackets so this attaches another step to the end
of This Promise so basically attaches another step
here so after we load all the products let's just
console.log next step and
save so we'll check the console and we'll see that we loaded the
products and then after we did The Next Step so we can actually return a promise
out of a function and then keep attaching more steps to that
promise so that's how we use fetch it's a better way to make HTTP requests
because it uses promises directly so now let's use fetch in our
project instead of using XML HTTP request so first let's comment out this
code because we were just practicing we'll type
slashstar and at the bottom star slash and let's scroll up to load
products Fetch and we're going to export this
function so we can use it outside this file let's
save we'll go to the left and open checkout.
JS and here instead of using load products which uses callbacks let's
switch to load products fetch which uses promises we'll scroll
up and we're going to import load products fetch so here we're already
importing from products. JS we'll type a comma load products
Fetch and now will replace load products so remember that we need to give this a
promise and also remember that fetch returns a promise so all we need to do
is to remove this code and just call load products Fetch and
brackets this will return a promise and we can use it with
promise.all so now let's save we'll check our
website and you'll see that everything is still
working so fetch helps us make our code a lot cleaner because it can return a
promise directly and we don't have to type out all of this extra
code finally let's use fetch inside our tests on the left we'll open order
summary test.js and remember that inside here we
used load products so let's switch this to using load products fetch instead
first we'll import it at the top we're importing from products. JS so we'll
type comma and import load products Fetch and instead of load products we're
going to call load products Fetch and brackets
so remember that this returns a promise and we can attach more steps to This
Promise using the method dot then and brackets and we'll give then a function
to run so brackets arrow and curly brackets once the products are finished
loading it's going to run then and inside here we're going to call done to
go to the next step of the test so here we'll just call done and
brackets and we'll remove the old code so now let's save to make sure this
is working and we'll open the tests go to
the browser and open the test and the order summary test should
be passing so now let's save our changes
into git we'll open the git set section inside products. JS we learned
how to use fetch which returns a promise directly inside checkout. JS we used
load products fetch inside our project and in order summary
test.js we use load products fetch inside our tests let's create a message
describing these changes convert load products
from xhr or XML HTTP request to fetch and
commit next we're going to learn async await which is an even better way to
handle asynchronous code let's go back to our
code and we'll open checkout. Js currently we're using promises to handle
asynchronous code but the problem with promises is that it creates a lot of
extra code for example we need to create a new promise we need to use resolve and
we need to use do that async await is a shortcut for
promises and it removes all this extra code so let's do our first example of
asyn a weit we're going to scroll up and at the top we're going to create
a function using function and let's name it load page
brackets and curly brackets and inside we're going to
console.log the string load page and now we'll learn the first part
of async await which is async in front of the word function
we're going to add the word async and space so async makes a function return a
promise so this code is a shortcut for this code it basically wraps the code in
a promise so now let's run this function
to show that it actually returns a promise
So Below this we'll call load page and brackets and because this returns a
promise we can add a next step to This Promise using dot then
brackets and we'll give then a function brackets arrow and curly
brackets and inside here let's just console.log the string Next Step
now let's save and we'll check the console so
we'll open the console and you'll see that we loaded
the page and then in the next step we displayed Next Step so when we put a
sync in front of function it makes this function return a
promise this code is a shortcut for this code
next if we return something from this function for example we're going to
return a value like the string value two this gets converted into resolve
value two so this value is going to be saved
in a parameter in The Next Step so here we'll add a parameter value and value
two is going to be saved inside here if we
console.log the value and save and then check the
console we'll see that value is equal to this
string and that's it for async it just makes a function return a
promise now you might be wondering what's the point of this feature
so the reason we use async is because it lets us use the second feature called
await await lets us wait for a promise to finish before going to the next
line so let's do an example inside here let's run some code that creates a
promise let's run load products fetch so we'll type load products Fetch and
brackets so this loads the products from the back end and usually this returns a
promise so one way to wait for this to finish is to use do then and then give
it a function so this runs this function
after load products has finished now await gives us another way to wait
for this promise to finish instead of using
then at the front we can just type await so await lets us write
asynchronous code like normal code so now it will wait for this line to finish
and get the response from the back end before going to the next next line so we
don't have to do any more dot then we just write it like normal code line by
line this code is a shortcut for this code and this makes our code a lot
easier to read than what we have down here so now let's see what this looks
like in the console before we save let's comment out this promise at the bottom
so we don't get confused so we'll type
slashstar and at the bottom star slash and now we're going to save this
code and check the console to see what it
did so you see that we loaded the page and then notice that it finish loading
the products before going to the next step so this actually Waits for this
line to finish before going to the next line in the code and this makes our code
a lot cleaner now one very important thing to
know is that we can only use a weight when we're inside an async
function that's actually the main reason we use async so that we can use a weight
to make our code cleaner now that we learned async wait
let's use it in our project so previously we loaded the
products and then we loaded the cart and then we rendered the page so let's
recreate this using async await first we want to load the products
which we did here and we're going to wait for this to finish and then we're
going to load the cart so to load the cart let's use this
promise down here asyn await can only be used with promises it doesn't do
anything with a call back so we'll select this promise and
right click copy and then up here we're going to
load the cart with a promise by right clicking and
paste so now we want to wait for this promise to finish before going to the
next line to do that at the front we can simply type
await finally after we load the products and we load the cart we're going to
render the page so we'll scroll down and we'll select this
code and we're going to right click copy and at the top
we're going to rightclick and paste and that's it you can see that our
asynchronous code is a lot cleaner now we load the products and then we just
wait for it to finish then we load the cart and we also wait for it to finish
and then we run the rest of our code so we can write asynchronous code like
normal code so now let's remove the console.log at
the top and also remove this return value
because we don't need it and we'll remove do then at the
end and let's save so now if we open our
website and open the project you can see that everything
loaded properly inside the
console you can see that we loaded the products first wait for it to finish
then load the cart wait for it to finish and then we displayed the page so that's
how we use a syn8 to make our code a lot cleaner than what we had
before so now we'll learn some more details about Ayn a weit
as I mentioned we can only use a weight inside an async
function also the closest function has to be
async for example here we have an async function at the top and inside we have a
normal function so we can't use a weight inside the normal function we have to
make this one async another another detail is if a
promise resolves with a value for example here we give resolve a value
like the string value three normally this value will be saved
in The Next Step so if we did dot then and gave it a
function this value would be saved in this
parameter however if we use await this value just gets returned and we can save
it in a variable so instead of using then we can Simply Save whatever is
resolved inside a variable using const value
equals and this makes our code a lot easier to read instead of having to use
then we can simply save this inside a variable like normal code
and finally we can use await with promise.all as well but I'll leave that
as an exercise so that's async await it's a
shortcut for promises and it lets us write asynchronous code like normal
code so when working with asynchronous code a best practice is to use asyn
await over promises and callbacks because they are much
cleaner so now let's save our changes into git we'll open the git section in
checkout. JS we created the load page function where we learned async and
await let's create a message describing these
changes convert from promises to async await and
commit now we're going to learn about error handling when we're sending HTTP
requests across the internet we could get unexpected errors for example the
internet connection might stop working so we're going to learn how to handle
these kinds of unexpected errors let's go back to our code and
we're going to open data/ products. JS and we're going to
scroll to the load products function so this uses a call back to
send a request and get a response now what if there's an error
along the way for callbacks we usually set up a separate callback just for
errors for example below this we're going to add another event listener
using xhr do add event listener brackets and the first parameter is the
event this time we're going to listen for the error
event and then we're going to give it a function so now if we get an unexpected
error it's going to run this function so if we get an error let's just console
log a message console.log a string
unexpected error and usually when we get an error
we give some instructions on what to do here let's just type please try again
later and
save so this is called error handling if we get an error during the request we
can handle it with this function so we just display a
message so now let's try out this code to simulate an error we're going to
change the url of the request to
error. superimple backend. deev so this will create an error because this URL
doesn't exist so now down here let's call this
function so that we run this code and get the error so we'll type load
products and brackets and
save let's check the console and you'll see that we displayed
this error message so we got an error and it ran
this error function and it did not run the load function
above also usually this callback gets a parameter called error and this contains
some information about the error so that's how we handle errors
when using callbacks we usually set up a separate callback just for errors
so now let's remove this line since it was just for
practice and we'll remove error from the URL and change it back to super simple
backend dodev and save next we'll learn how to handle
errors in promises so we'll scroll up to the load
products fetch function and this makes the same request
as below but it uses
promises to handle an error in promises promises give us two methods dot then
and another method called dot catch brackets and we're going to give catch a
function brackets arrow and curly brackets so now if this request has an
error it's going to go to this catch method and it's going to run this error
function so inside here let's also display a message so let's just copy the
message that we had below we're going to select this message
and then rightclick
copy and then inside catch we're going to right click and
paste and again to simulate an error we're going to scroll up and change the
url so we're going to add error at the front
do superimple backend dodev so now let's call this function
and test out this error code at the bottom we'll type load products Fetch
and brackets and
save so now let's open the console and you'll see in here that we
displayed the error message so we're successfully creating an error it's
going inside catch and it displays this message so just like callbacks catch
gets a parameter called error and this contains information about the error if
we need it so that's how we handle errors with
promises we have another method called catch that will run this function if
there's an error so now let's remove this practice
code and switch back the URL so remove error and Dot and
save lastly we'll learn how to handle errors in async
await so let's go to the left and we're going to open the checkout file so we'll
scroll down and open checkout. JS and inside here we're using async
await so the catch errors when using async await we're going to use some new
syntax called try catch above this we're going to type the
word try and curly brackets and now we're going to put the
code that could cause an error into try so here we're making a request to the
back endend and here we're also making a request to the back end so this code
could cause an error so we're going to move it inside try so we'll select it
right click cut and then inside here we'll right
click and paste and now if any of this code inside
a try gets an error we can catch it using this code at at the bottom we'll
type catch brackets and curly
brackets Now Catch is going to get one parameter in these brackets called error
and this contains information about the error if we need
it so catch Works similarly to catch for promises if there's an error inside here
it's going to catch the error or it's going to hand handle the error and run
the code inside catch so in here we can put our error message so let's go back
to products. JS and let's copy the error message so
we'll select this and right click copy and back to
checkout inside catch we'll right click and paste
so now I'll remove this new line and add a new line here to make it a little
easier to read and let's test out this
code to do that we'll go inside products. JS again and we're going to
modify the URL again so at the front here we're going to add error do super
simple backend and also we're going to comment out the dot catch because right
now the error is going to be handled here and it's not going to be handled
outside in the try catch so we're going to comment this out using
slashstar and at the end star slash and
save so we'll go back to checkout. JS and here we'll also
save and now let's open the console and you'll see that we had an error here
we caught the error and it ran this code and displayed the error
message so that's how we handle errors with async await we put our code that
can cause an error inside try and if there is an error it's going to run the
code inside catch so now let's go back to products
and remove error from the URL and the dot and we'll also uncomment
catch and save next we're going to learn some more
details about try catch so we'll open checkout.
JS and one thing to know about TR catch is that we don't have to use it with
async await we can actually use TR catch with synchronous code or normal code for
example here we try to run a function that does not exist and this will cause
an error try catch will catch this error and display a message so notice that
we're not using async O8 here this is just normal code so we can use try catch
to catch errors in normal code as well another detail is whenever we get an
error it will skip the rest of the code so here it will not console.log next
line it will skip the rest of this code and go directly into
catch now one thing you might be wondering is why don't we just use TR
catch everywhere and prevent all of our errors so try catch and any error
handling is meant to handle unexpected errors that means our code is correct
but something outside our control caused the error so we can give some
instructions on what to do so that's why we don't use try catch
everywhere we only use it for unexpected errors or errors outside of our
control so the last thing to know about error handling is that we can man
manually create errors to manually create an error in TR
catch at the top we're going to use the word
throw so throw creates a new error or it throws an error that we're going to
catch later and now we need to give this error
a value so we can use any type of value
for an error like a string number or an object for an example we're just going
to use a string error one so this will manually create an
error when we get an error it's going to skip the rest of the code inside these
curly brackets and it's going to go straight into catch so this error value
is going to be saved inside this parameter and it's going to run the code
inside catch so if we
save and then check the console throw creates an error and it's
going to display this error message up here so now let's comment out this
example and save next if we're using promises there
are two ways to manually create an error so inside this promise if we want
want to manually create an error we can also just throw an error like the string
error 2 and this will throw an error and go
inside dot catch by the way if we await a promise instead of going into catch
it's going to go inside catch here so await makes it behave sort of
like synchronous code or normal code if we save
and check the console it will get an error it will not
load the cart and it will display this error
message so now let's comment out this example and we'll learn the second way
to create an error in a promise inside a promise if we need to
create an error in the future then we need to use different code for example
here we load the cart and then once it's finished loading we're going to run this
function so this function runs in the future inside this function throw does
not work because throw does not work in the
future instead promises give us another way to create an error when we create a
new promise it gives us a second parameter
called reject reject is a function and it lets
us create an error in the future so here after we load the cart in
the future let's create an error using reject brackets and a string error
three so let's comment out resolve as an example
so now let's save and check the
console and you'll see that reject created an error in the
future and then it goes down here and runs the code inside catch and creates
the error message so the manually create an error
in a promise we have two ways we can use throw if we're creating the error
synchronously or right away or we can use reject if we're creating the error
asynchronously or in the future so now let's comment out
reject and uncomment resolve and save so that's error handling it lets us
handle unexpected errors and it also lets us create our own
errors so now let's save these changes into git we'll open git inside products.
JS we added. catch for promises and an error function for
callbacks and then in checkout. JS we added try catch for async await and we
also learned how to manually create our own
errors so we'll type a message describing our
changes learn and error handling and
commit now that we learned backend promises and async await let's use them
in our project we'll open our
project and open the tab for the project and we're going to go to the checkout
page so the feature we're going to work on is in the checkout page we're going
to make this place order button interactive when we click this button
it's going to take our cart and turn it into an
order this time instead of writing this code ourselves we're going to use the
back end to create an order so first let's set up an event
listener for this button we'll go back to our
code and open our files and that button is in a section called
the payment summary so we're going to open scripts
SL checkout payment summary.jpg your order and now we have the code for
the button right here so we're going to set up an event listener so we can do
something when we click it first we'll add a class to the button
so we can get it in our JavaScript at the end of the class let's
create a new line and add a class js- Place Das
order and now after we put this HTML on the page we're going to set up an event
listener to do that we're going to get this button into our JavaScript using
document. query selector
brackets and a string and to select this class we're going to start with a
js- place- order and now that we have this button
we're going to add an event listener to to it so we'll create a new line and use
the method do add event listener
brackets and we'll give this two parameters the first parameter is the
event we want to listen for which is click and the second parameter is a
function we want to run when we click this button so we'll type brackets arrow
and curler brackets and now when we click this button we're
going to make a request to the back end to create the
order so for this example I set up a URL path in my backend for creating orders
called slash orders so inside here we're going to
make a request to the back end using fetch
brackets and then we're going to give it the URL of the request which is H ttps
colon double slash super simple
backend. Dev and the URL path slash orders however this time we need to send
some data to the back end so we need to send our cart to the backend in order to
create an order to send data in a request we need
to use a different type of requests so there are four common types of request
get post put and delete get means we want to get something from the back end
post means we want the back end to create something put means we want it to
update something and delete means we want to delete something so far we only
use get request which let us get data from from the back
end however get requests don't really let us send data to the back
end so in this situation we want to create an order so we're going to use
post to create something post lets us send data to the
backend so to create a post request instead of a get request we're going to
give fetch a second parameter which is an
object and inside this object we're going to give it a property called
method colon and this is the type of the
request in this case we'll use the string
post and after this we're going to give another property called
headers colon and this is going to be an object
headers gives the backend more information about our request and this
is needed when we're sending data to the back
end inside this object we'll add the property string Capital C content Das
capital T type
colon and the value will be the string application slash Json
this tells the back endend what type of data we're sending in our request here
we're going to send some Jon which is basically a JavaScript
object next we're going to add another property called body
colon and this is the actual data we're going to send to the back
end according to the documentation we need to send an object with a property
called cart and this contains our cart array so in the body let's send an
object with a property called cart colon and give it the cart
array so we should have the cart array in this file and it should be called
cart and finally we can't send an object directly in our request we need to
convert it into a Json string to do that at the front we'll use
json. stringify Open Bracket and close bracket
so this will convert this data into a Json string and now we can send it to
the back end okay so after we send this request
we need to wait for the response to come back to do that fetch returns a
promise however instead of using dot then to add a Next Step let's use async
a weit because it's cleaner so first we need to make this function a sync
remember we can only use await inside an async
function so at the front of this function we'll type the word
async and now in front of fetch we can use
await this is going to wait for fetch to finish or for fetch to get a response
from the back end and then go to the next
line now because we used await we can save the response in a variable so at
the front we'll create a variable const and call it response and make it equal
to this result next remember that to get the data
that's attached to the response we need to use response.
Json so down here we're going to use response. Json and
brackets now remember that response. Json is also a promise so at the front
we can use await to wait for this promise to finish before going to the
next line so this will give us the data that's
attached to the response which should be the order that was created by the
backet so let's save this in a variable using const order
equals and finally let's console.log the order to see what it
looks like so now let's save and then we'll open the
project and make sure you have some products in your
cart and then we'll click place order and now we can check our console
to see what the order looks like and you'll see that we got an order
object from the back end it has an order ID an order time and the products in our
order including a delivery time and the quantity that we
want so we successfully use the back end to create a new
order let's also check the network tab up here and open
network so I'll resize this to make it a little easier to read and we'll search
for the super simple URL and then we'll find this request
orders with a status 200 and we'll click it so inside the details you'll see that
it was a post request sent to/ orders and the status code was 200 so it was
successful inside the payload tab this is what we sent to the back end which is
our cart in the preview tab this is what the
backend sent back an order object and the response tab is the same thing
we got the order object back so that's how a real world website
works instead of creating the order on the web page or on our computer we send
an HTTP request to the backend to create the
order okay now that we created an order let's save it
somewhere we'll go back to our code and on the left inside the data
folder let's create a file for our orders so we'll click inside this folder
and then click here to create a file and let's name it
orders. JS and press enter at the top let's create an array
to contain rain all of our orders we use const orders equals and empty array and
let's export this so we can use it in other files
export next let's create a function for adding an order to this array so we'll
create a function add
order brackets and curly brackets and we'll give this function an order object
and we're just going to add it to the array now for orders we usually want the
most recent order at the top so we're going to add this order to the front of
the array to do that we'll type the array name orders and use the method do
unshift brackets and we'll give it the
order so this will add the order to the front of the array instead of the
back finally let's save our orders into local storage so we'll create a function
to save to local storage function save to
storage brackets and curly brackets and we'll run local
storage. set item brackets and a string we use a local storage key orders
comma and remember local storage only supports strings so we'll use
json. stringify
brackets orders and now when we modify this array
we're going to save to storage and brackets finally at the top let's load
the orders from Storage so
here we use local storage. getet item brackets the string
orders and remember that this will be a string so we need to convert it back
into an array using the code json. pars and
brackets now in the beginning we're not going to have any orders saved in local
storage so we can give this a default value using or and an empty array so if
there's nothing in local storage it's going to use this empty array as a
default and save so now let's use add order in the
payment summary so first we'll export this
function and and save and then open the payment summary
again and at the top we're going to import that function so here we'll
import curly brackets add order from a
string and we'll go into the data folder which is do do slash
dotdata SL orders. JS and and we'll scroll back
down and now after we create an order from the back end we're going to add it
to the array and save it in local storage using the function add order
brackets the order object and
save now if we go to our web page and click place
order this should create an order order from the back end and save it in local
storage so now we can open our console and go to the console Tab and
let's check if it's inside local storage using local
storage. getet item brackets and the string
orders and press enter and you'll see that we saved an
order in local store storage if you ever want to remove the
orders from local storage you can use this
code local storage. remove item brackets and the
string orders press enter and then refresh the
page let's go back to our code and let's get some practice and add some
error handling to this code so at the top for asyn of weight we're going to
use try catch so we'll type try curly bracket and catch brackets and curly
brackets and catch gets a parameter called
error so now we're going to move our code inside a try we'll select this code
and then right click cut inside try right click and
paste and I'll create a new line and now if we make a request and there's some
sort of network error that error will go down here and we'll run the code inside
catch so in here let's display a message
console. log the string unexpected
error try again later the last step is after we create
an order we should go to the orders page to do that at the bottom
here we're going to use an object called window.location window.location is a
special object object provided by JavaScript and it lets us control the
URL at the top of the browser if we change the location object
it will change the url at the top so let's give this a try we'll go into our
code and we'll type window.location Now location has a
property called href
this gives us the URL at the top of the browser and if we change the href
property it will change the url at the top of the browser so we'll try that in
our code we're going to change. href and make it equal to the string orders.
HTML so this will replace everything after the slash here with orders.
HTML and this will open the orders. HTML file which is at the bottom
here and this will open the orders Page by the way orders. HTML is a file
path the current file is checkout. HTML because this code is running on the
checkout page so it starts from checkout. HTML and then looks for a file
called orders. HTML beside it which is this file here and it loads this file in
the browser so now let's
save we'll open the project and then click place
order so it should create a new order using the backend and it will take us to
the orders page so right now we have a list of
order objects and that's all the data that we need to create this page I'll
leave generating the HTML and making this page interactive as
exercises so now let's check our tests to make sure that everything is still
working we'll open the tab for our tests and I'll refresh just in case and it
looks good and we'll save our changes into git we'll go to the git section
inside orders. JS we created some functions for saving our orders and in
payment summary. JS we made the place order button
interactive and we use the back end to create an order let's create a message
describing these changes create order using the back end
and commit so we're going to learn one more
thing in this lesson and this is needed to create the tracking page we're going
to learn how to use URL parameters so first let's open our
project and we'll go back to the orders page and on this page we have these
track package links beside the products if we click this link it will take us to
the tracking page at tracking. HTML however right now this page is just
plain HTML there's no JavaScript so if we go back to our
orders and then track a different product you'll notice that all of the
tracking pag pages are the same so we need to make each tracking
page different depending on the order and the product so how do we know which
product to track on this page to create this we can use a feature
called URL parameters URL parameters let us save
data directly in the URL to create a URL parameter at the top
after this URL we're going to type question mark and then order capital i d
equals 1 2 3 for example and press enter so the question mark means we're
adding a URL parameter to this URL so a parameter is a property value
pair the left side is a property and the right side is a value
this is sort of like an object like this so using URL parameters we can save
some data in the URL like this and then we can use JavaScript to
get this data out of the URL to do that we'll go back to our
code and we'll open our files here and we'll scroll down to the bottom to the
tracking page and let's scroll all the way down
to the bottom and at the bottom of the body
let's add a script tag to run some JavaScript so we'll type less than
script greater than and to get the parameters out of
the URL we can use a built-in class called
URL first let's generate an object using this class we'll type
New Capital URL and brackets and we'll give it the URL that
we want to get the parameters from so in here we'll type
window.location.href remember that
window.location.href gets the URL at the top of the
browser and now let's save this object in a variable
at the front we'll create const URL equals this
object so this URL class analyzes the URL that we give it and breaks it down
into different parts one of the parts are the URL
parameters to get the parameters we're going to use a property
url. search capital p perams by the way URL parameters are also
called search parameters because they're used for
features like YouTube search so search params will let us get
the URL parameters up here so let's say that we wanted the
order ID parameter inside our
code search params has a method called Dot
get brackets and this lets us get individual parameters so inside here
we'll give it a string and we'll get the order capital i d parameter out of the
URL so let's console.log this console.log and
brackets if we save and then open our project and go to
the tracking page and then open the console right click
inspect the console you'll see that it gave us the
order ID that we saved up here so using that code we can get URL
parameters out of the URL at the top and then use them to create this
page we can also say save multiple parameters in the URL to save another
parameter at the end we can just type and and now we can give it another
property value pair like product Capital ID equal
456 and press enter and now inside our code we can get
this second parameter so inside here we're going to make a
copy of this line select it right click copy and then down here right click
paste and this time we're going to get the
parameter product Capital ID and save if we open the page and open the
console we got the order ID as well as the
product ID out of the URL so URL parameters lets us save
different data in each URL and we can actually go back and
forth between them so if we click the back button it will go to this URL and
this URL has different data or parameters saved inside if we click
forward this URL has different parameters or data saved
inside and this is how YouTube search works if we search for something our
search is saved as a URL parameter if we search for something else our search is
also saved as a URL parameter and we can go back and forth between the
two so this is actually all the data that we need to create the tracking page
we need to know which order it is and which product it
is now there's one more thing to know to create this page we'll go back to our
code and we're going to open the orders page at orders.
HTML and we're going to find the track package button using control F or
command F and we'll type the text in that button track
package so notice that these buttons are just a link to the tracking page or
tracking. HTML so when you're generating this
HTML make sure that you add URL parameters after this tracking page
URL using question mark the order Capital ID equals and then you
substitute the order ID like 1 2 3 and then and also attach the product ID
product Capital ID equals 456 so when generating this HTML make
sure you substitute the order ID and product ID into this URL so that when it
opens the tracking page you know which order and which product to track
I'll leave generating the HTML and making the tracking page interactive as
exercises so now let's save this file and let's check our tests so we'll
open the browser and open the test Tab and everything is still working and
we'll save these changes into git open the git
section in orders. HTML we added an example of adding URL
parameters to the tracking page Link in tracking. HTML we added an
example of getting the parameters out of the URL at the
top let's create a message describing these
changes add URL parameters
example and commit and that's the end of this lesson in
this lesson we learned what a backend is and how to make HTTP requests to the
back end we learned how to use XML HTTP request and
fetch we learned how to handle asynchronous code using callbacks
promises and async await we learned how to test asynchronous code we learned
about error handling for unexpected errors we use the backend in our project
and we learn URL parameters before we look at the
exercises you might be wondering what's the next step after this course instead
of just using a backend the next step is to learn how to create our own backend
to do that you need to learn the command line and after that you'll learn a
technology called nodejs which lets us create our own
backend also after this course you can learn how to put a website on the
internet using this video right here here are some exercises that'll
help you practice what we learned in this
lesson thanks for watching here are some other
videos and courses that you might be interested in if you want to support
this channel you can click like subscribe and share this video with
others thanks again and I'll see you in the next one