What do querySelectorAll, getElementsByClassName and other getElementsBy* methods return?









up vote
94
down vote

favorite
33












Do getElementsByClassName (and similar functions like getElementsByTagName and querySelectorAll) work the same as getElementById or do they return an array of elements?



The reason I ask is because I am trying to change the style of all elements using getElementsByClassName. See below.



//doesn't work
document.getElementsByClassName('myElement').style.size = '100px';

//works
document.getElementById('myIdElement').style.size = '100px';









share|improve this question



















  • 30




    The clue is, very much, in the name: getElementsByClassName() implies a plural, whereas getElementById() implies a singular element item.
    – David Thomas
    May 21 '12 at 23:20






  • 1




    I get that, it just didn't make sense to me that you can't change all the elements with that class name using the code above instead of having to loop through an array. jquery way is much better, i was just curious about the js way
    – dmo
    May 22 '12 at 4:34






  • 1




    Might be useful too: stackoverflow.com/questions/3871547/…
    – kapa
    Jul 31 '14 at 9:19















up vote
94
down vote

favorite
33












Do getElementsByClassName (and similar functions like getElementsByTagName and querySelectorAll) work the same as getElementById or do they return an array of elements?



The reason I ask is because I am trying to change the style of all elements using getElementsByClassName. See below.



//doesn't work
document.getElementsByClassName('myElement').style.size = '100px';

//works
document.getElementById('myIdElement').style.size = '100px';









share|improve this question



















  • 30




    The clue is, very much, in the name: getElementsByClassName() implies a plural, whereas getElementById() implies a singular element item.
    – David Thomas
    May 21 '12 at 23:20






  • 1




    I get that, it just didn't make sense to me that you can't change all the elements with that class name using the code above instead of having to loop through an array. jquery way is much better, i was just curious about the js way
    – dmo
    May 22 '12 at 4:34






  • 1




    Might be useful too: stackoverflow.com/questions/3871547/…
    – kapa
    Jul 31 '14 at 9:19













up vote
94
down vote

favorite
33









up vote
94
down vote

favorite
33






33





Do getElementsByClassName (and similar functions like getElementsByTagName and querySelectorAll) work the same as getElementById or do they return an array of elements?



The reason I ask is because I am trying to change the style of all elements using getElementsByClassName. See below.



//doesn't work
document.getElementsByClassName('myElement').style.size = '100px';

//works
document.getElementById('myIdElement').style.size = '100px';









share|improve this question















Do getElementsByClassName (and similar functions like getElementsByTagName and querySelectorAll) work the same as getElementById or do they return an array of elements?



The reason I ask is because I am trying to change the style of all elements using getElementsByClassName. See below.



//doesn't work
document.getElementsByClassName('myElement').style.size = '100px';

//works
document.getElementById('myIdElement').style.size = '100px';






javascript getelementsbyclassname dom-traversal






share|improve this question















share|improve this question













share|improve this question




share|improve this question








edited Mar 22 '17 at 16:26









Taryn

188k45286351




188k45286351










asked May 21 '12 at 23:17









dmo

1,98421320




1,98421320







  • 30




    The clue is, very much, in the name: getElementsByClassName() implies a plural, whereas getElementById() implies a singular element item.
    – David Thomas
    May 21 '12 at 23:20






  • 1




    I get that, it just didn't make sense to me that you can't change all the elements with that class name using the code above instead of having to loop through an array. jquery way is much better, i was just curious about the js way
    – dmo
    May 22 '12 at 4:34






  • 1




    Might be useful too: stackoverflow.com/questions/3871547/…
    – kapa
    Jul 31 '14 at 9:19













  • 30




    The clue is, very much, in the name: getElementsByClassName() implies a plural, whereas getElementById() implies a singular element item.
    – David Thomas
    May 21 '12 at 23:20






  • 1




    I get that, it just didn't make sense to me that you can't change all the elements with that class name using the code above instead of having to loop through an array. jquery way is much better, i was just curious about the js way
    – dmo
    May 22 '12 at 4:34






  • 1




    Might be useful too: stackoverflow.com/questions/3871547/…
    – kapa
    Jul 31 '14 at 9:19








30




30




The clue is, very much, in the name: getElementsByClassName() implies a plural, whereas getElementById() implies a singular element item.
– David Thomas
May 21 '12 at 23:20




The clue is, very much, in the name: getElementsByClassName() implies a plural, whereas getElementById() implies a singular element item.
– David Thomas
May 21 '12 at 23:20




1




1




I get that, it just didn't make sense to me that you can't change all the elements with that class name using the code above instead of having to loop through an array. jquery way is much better, i was just curious about the js way
– dmo
May 22 '12 at 4:34




I get that, it just didn't make sense to me that you can't change all the elements with that class name using the code above instead of having to loop through an array. jquery way is much better, i was just curious about the js way
– dmo
May 22 '12 at 4:34




1




1




Might be useful too: stackoverflow.com/questions/3871547/…
– kapa
Jul 31 '14 at 9:19





Might be useful too: stackoverflow.com/questions/3871547/…
– kapa
Jul 31 '14 at 9:19













9 Answers
9






active

oldest

votes

















up vote
116
down vote



accepted










Your getElementById() code works since IDs have to be unique and thus the function always returns exactly one element (or null if none was found).



However, getElementsByClassName(), querySelectorAll(), and other getElementsBy* methods return an array-like collection of elements. Iterate over it like you would with a real array:



var elems = document.getElementsByClassName('myElement');
for(var i = 0; i < elems.length; i++)
elems[i].style.size = '100px';



If you prefer something shorter, consider using jQuery:



$('.myElement').css('size', '100px');





share|improve this answer


















  • 1




    Does that also apply to <iframe> which is also part of your domain
    – JMASTER B
    Sep 1 '16 at 1:25











  • It's 2018... Just create a wrapper function for querySelectorAll() and you can have nice short code without a large, old-school dependency. qSA(".myElement").forEach(el => el.style.size = "100px") Maybe have the wrapper receive a callback. qSA(".myElement", el => el.style.size = "100px")
    – user2437417
    Apr 26 at 20:40


















up vote
8
down vote













You are using a array as an object, the difference between getElementbyId and
getElementsByClassName is that:




  • getElementbyId will return you an object.


  • getElementsByClassName will return you an array.

getElementsByClassName




The getElementsByClassName(classNames) method takes a string that
contains an unordered set of unique space-separated tokens
representing classes. When called, the method must return a live
NodeList object containing all the elements in the document that
have all the classes specified in that argument, having obtained the
classes by splitting a string on spaces. If there are no tokens
specified in the argument, then the method must return an empty
NodeList.




https://www.w3.org/TR/2008/WD-html5-20080610/dom.html#getelementsbyclassname



getElementById




The getElementById() method accesses the first element with the specified id.




http://www.w3schools.com/jsref/met_doc_getelementbyid.asp



in your code the lines:




1- document.getElementsByClassName('myElement').style.size = '100px';




will NOT work as expected, cos the getElementByClassName will return an array, and the array will NOT have the style property, you gonna access each element by iterating them.



That's why the function getElementById was working for you, this function will return you the direct object , and so you will be able to access the style property.






share|improve this answer



























    up vote
    7
    down vote













    The following description is taken from this page:




    The getElementsByClassName() method returns a collection of all elements in the document with the specified class name, as a NodeList object.



    The NodeList object represents a collection of nodes. The nodes can be
    accessed by index numbers. The index starts at 0.



    Tip: You can use the length property of the NodeList object to determine the number of elements with a specified class name, then you can loop through all elements and extract the info you want.




    So, as a parameter getElementsByClassName would accept a class name.



    If this is your HTML body:



    <div id="first" class="menuItem"></div>
    <div id="second" class="menuItem"></div>
    <div id="third" class="menuItem"></div>
    <div id="footer"></div>


    then var menuItems = document.getElementsByClassName('menuItem') would return a collection (not an array) of the 3 upper <div>s, as they match the given class name.



    You can then iterate over this nodes (<div>s in this case) collection with:



    for (var menuItemIndex = 0 ; menuItems.length ; menuItemIndex ++) 
    var currentMenuItem = menuItems[menuItemIndex];
    // do stuff with currentMenuItem as a node.



    Please refer to this post for more on differences between elements and nodes.






    share|improve this answer





























      up vote
      4
      down vote













      ES6 provides Array.from() method, which creates a new Array instance from an array-like or iterable object.






      let boxes = document.getElementsByClassName('box');

      Array.from(boxes).forEach(v => v.style.background = 'green');
      console.log(Array.from(boxes));

      .box 
      width: 50px;
      height: 50px;
      margin: 5px;
      background: blue;
      display: inline-block;

      <div class='box'></div>
      <div class='box'></div>
      <div class='box'></div>
      <div class='box'></div>





      As you can see inside the code snippet, after using Array.from() function you are then able to manipulate over each element.





      The same solution using jQuery.






      $('.box').css('background':'green');

      .box 
      width: 50px;
      height: 50px;
      margin: 5px;
      background: blue;
      display: inline-block;

      <script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
      <div class='box'></div>
      <div class='box'></div>
      <div class='box'></div>
      <div class='box'></div>








      share|improve this answer





























        up vote
        3
        down vote













        In Other Words



        • document.querySelector() selects only the first one element of the specified selector. So it doesn't spit out an array, it's a single value. Similar to document.getElementById() which fetches ID-elements only, since IDs have to be unique.


        • document.querySelectorAll() selects all elements with the specified selector and returns them in an array. Similar to document.getElementsByClassName() for classes and document.getElementsByTagName() tags only.





        Why use querySelector?



        It's used merely for the sole purpose of ease and brevity.






        Why use getElement/sBy?*



        Faster performance.






        Why this performance difference?



        Both ways of selection has the purpose of creating a NodeList for further use.
        querySelectors generates a static NodeList with the selectors thus it must be first created from scratch.
        getElement/sBy* immediately adapts the existing live NodeList of the current DOM.



        So, when to use which method it's up to you/your project/your device.






        Infos



        Demo of all methods
        NodeList Documentation
        Performance Test






        share|improve this answer





























          up vote
          2
          down vote













          It returns Array-like list.



          You make that an Array as example



          var el = getElementsByClassName("elem");
          el = Array.prototype.slice.call(el); //this line
          el[0].appendChild(otherElem);





          share|improve this answer



























            up vote
            2
            down vote













            You could get a single element by running



            document.querySelector('.myElement').style.size = '100px';


            but it's going to work for the first element with class .myElement.



            If you would like apply this for all elements with the class I suggest you to use



            document.querySelectorAll('.myElement').forEach(function(element) 
            element.style.size = '100px';
            );





            share|improve this answer





























              up vote
              2
              down vote













              /*
              * To hide all elements with the same class,
              * use looping to reach each element with that class.
              * In this case, looping is done recursively
              */

              const hideAll = (className, i=0) =>
              if(!document.getElementsByClassName(className)[i]) //exits the loop when element of that id does not exist
              return;


              document.getElementsByClassName(className)[i].style.visibility = 'hidden'; //hide element
              return hideAll(className, i+1) //loop for the next element


              hideAll('appBanner') //the function call requires the class name





              share|improve this answer



























                up vote
                -1
                down vote













                With ES5+ (any browsed nowadays - 2017) you should be able to do






                .forEach.call(document.getElementsByClassName('answer'), function(el) 
                el.style.color= 'red';
                );








                share|improve this answer






















                  Your Answer






                  StackExchange.ifUsing("editor", function ()
                  StackExchange.using("externalEditor", function ()
                  StackExchange.using("snippets", function ()
                  StackExchange.snippets.init();
                  );
                  );
                  , "code-snippets");

                  StackExchange.ready(function()
                  var channelOptions =
                  tags: "".split(" "),
                  id: "1"
                  ;
                  initTagRenderer("".split(" "), "".split(" "), channelOptions);

                  StackExchange.using("externalEditor", function()
                  // Have to fire editor after snippets, if snippets enabled
                  if (StackExchange.settings.snippets.snippetsEnabled)
                  StackExchange.using("snippets", function()
                  createEditor();
                  );

                  else
                  createEditor();

                  );

                  function createEditor()
                  StackExchange.prepareEditor(
                  heartbeatType: 'answer',
                  autoActivateHeartbeat: false,
                  convertImagesToLinks: true,
                  noModals: true,
                  showLowRepImageUploadWarning: true,
                  reputationToPostImages: 10,
                  bindNavPrevention: true,
                  postfix: "",
                  imageUploader:
                  brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
                  contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/3.0/"u003ecc by-sa 3.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
                  allowUrls: true
                  ,
                  onDemand: true,
                  discardSelector: ".discard-answer"
                  ,immediatelyShowMarkdownHelp:true
                  );



                  );













                  draft saved

                  draft discarded


















                  StackExchange.ready(
                  function ()
                  StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f10693845%2fwhat-do-queryselectorall-getelementsbyclassname-and-other-getelementsby-method%23new-answer', 'question_page');

                  );

                  Post as a guest















                  Required, but never shown

























                  9 Answers
                  9






                  active

                  oldest

                  votes








                  9 Answers
                  9






                  active

                  oldest

                  votes









                  active

                  oldest

                  votes






                  active

                  oldest

                  votes








                  up vote
                  116
                  down vote



                  accepted










                  Your getElementById() code works since IDs have to be unique and thus the function always returns exactly one element (or null if none was found).



                  However, getElementsByClassName(), querySelectorAll(), and other getElementsBy* methods return an array-like collection of elements. Iterate over it like you would with a real array:



                  var elems = document.getElementsByClassName('myElement');
                  for(var i = 0; i < elems.length; i++)
                  elems[i].style.size = '100px';



                  If you prefer something shorter, consider using jQuery:



                  $('.myElement').css('size', '100px');





                  share|improve this answer


















                  • 1




                    Does that also apply to <iframe> which is also part of your domain
                    – JMASTER B
                    Sep 1 '16 at 1:25











                  • It's 2018... Just create a wrapper function for querySelectorAll() and you can have nice short code without a large, old-school dependency. qSA(".myElement").forEach(el => el.style.size = "100px") Maybe have the wrapper receive a callback. qSA(".myElement", el => el.style.size = "100px")
                    – user2437417
                    Apr 26 at 20:40















                  up vote
                  116
                  down vote



                  accepted










                  Your getElementById() code works since IDs have to be unique and thus the function always returns exactly one element (or null if none was found).



                  However, getElementsByClassName(), querySelectorAll(), and other getElementsBy* methods return an array-like collection of elements. Iterate over it like you would with a real array:



                  var elems = document.getElementsByClassName('myElement');
                  for(var i = 0; i < elems.length; i++)
                  elems[i].style.size = '100px';



                  If you prefer something shorter, consider using jQuery:



                  $('.myElement').css('size', '100px');





                  share|improve this answer


















                  • 1




                    Does that also apply to <iframe> which is also part of your domain
                    – JMASTER B
                    Sep 1 '16 at 1:25











                  • It's 2018... Just create a wrapper function for querySelectorAll() and you can have nice short code without a large, old-school dependency. qSA(".myElement").forEach(el => el.style.size = "100px") Maybe have the wrapper receive a callback. qSA(".myElement", el => el.style.size = "100px")
                    – user2437417
                    Apr 26 at 20:40













                  up vote
                  116
                  down vote



                  accepted







                  up vote
                  116
                  down vote



                  accepted






                  Your getElementById() code works since IDs have to be unique and thus the function always returns exactly one element (or null if none was found).



                  However, getElementsByClassName(), querySelectorAll(), and other getElementsBy* methods return an array-like collection of elements. Iterate over it like you would with a real array:



                  var elems = document.getElementsByClassName('myElement');
                  for(var i = 0; i < elems.length; i++)
                  elems[i].style.size = '100px';



                  If you prefer something shorter, consider using jQuery:



                  $('.myElement').css('size', '100px');





                  share|improve this answer














                  Your getElementById() code works since IDs have to be unique and thus the function always returns exactly one element (or null if none was found).



                  However, getElementsByClassName(), querySelectorAll(), and other getElementsBy* methods return an array-like collection of elements. Iterate over it like you would with a real array:



                  var elems = document.getElementsByClassName('myElement');
                  for(var i = 0; i < elems.length; i++)
                  elems[i].style.size = '100px';



                  If you prefer something shorter, consider using jQuery:



                  $('.myElement').css('size', '100px');






                  share|improve this answer














                  share|improve this answer



                  share|improve this answer








                  edited Aug 5 '17 at 8:59









                  Makyen

                  20.2k83767




                  20.2k83767










                  answered May 21 '12 at 23:18









                  ThiefMaster

                  236k61461555




                  236k61461555







                  • 1




                    Does that also apply to <iframe> which is also part of your domain
                    – JMASTER B
                    Sep 1 '16 at 1:25











                  • It's 2018... Just create a wrapper function for querySelectorAll() and you can have nice short code without a large, old-school dependency. qSA(".myElement").forEach(el => el.style.size = "100px") Maybe have the wrapper receive a callback. qSA(".myElement", el => el.style.size = "100px")
                    – user2437417
                    Apr 26 at 20:40













                  • 1




                    Does that also apply to <iframe> which is also part of your domain
                    – JMASTER B
                    Sep 1 '16 at 1:25











                  • It's 2018... Just create a wrapper function for querySelectorAll() and you can have nice short code without a large, old-school dependency. qSA(".myElement").forEach(el => el.style.size = "100px") Maybe have the wrapper receive a callback. qSA(".myElement", el => el.style.size = "100px")
                    – user2437417
                    Apr 26 at 20:40








                  1




                  1




                  Does that also apply to <iframe> which is also part of your domain
                  – JMASTER B
                  Sep 1 '16 at 1:25





                  Does that also apply to <iframe> which is also part of your domain
                  – JMASTER B
                  Sep 1 '16 at 1:25













                  It's 2018... Just create a wrapper function for querySelectorAll() and you can have nice short code without a large, old-school dependency. qSA(".myElement").forEach(el => el.style.size = "100px") Maybe have the wrapper receive a callback. qSA(".myElement", el => el.style.size = "100px")
                  – user2437417
                  Apr 26 at 20:40





                  It's 2018... Just create a wrapper function for querySelectorAll() and you can have nice short code without a large, old-school dependency. qSA(".myElement").forEach(el => el.style.size = "100px") Maybe have the wrapper receive a callback. qSA(".myElement", el => el.style.size = "100px")
                  – user2437417
                  Apr 26 at 20:40













                  up vote
                  8
                  down vote













                  You are using a array as an object, the difference between getElementbyId and
                  getElementsByClassName is that:




                  • getElementbyId will return you an object.


                  • getElementsByClassName will return you an array.

                  getElementsByClassName




                  The getElementsByClassName(classNames) method takes a string that
                  contains an unordered set of unique space-separated tokens
                  representing classes. When called, the method must return a live
                  NodeList object containing all the elements in the document that
                  have all the classes specified in that argument, having obtained the
                  classes by splitting a string on spaces. If there are no tokens
                  specified in the argument, then the method must return an empty
                  NodeList.




                  https://www.w3.org/TR/2008/WD-html5-20080610/dom.html#getelementsbyclassname



                  getElementById




                  The getElementById() method accesses the first element with the specified id.




                  http://www.w3schools.com/jsref/met_doc_getelementbyid.asp



                  in your code the lines:




                  1- document.getElementsByClassName('myElement').style.size = '100px';




                  will NOT work as expected, cos the getElementByClassName will return an array, and the array will NOT have the style property, you gonna access each element by iterating them.



                  That's why the function getElementById was working for you, this function will return you the direct object , and so you will be able to access the style property.






                  share|improve this answer
























                    up vote
                    8
                    down vote













                    You are using a array as an object, the difference between getElementbyId and
                    getElementsByClassName is that:




                    • getElementbyId will return you an object.


                    • getElementsByClassName will return you an array.

                    getElementsByClassName




                    The getElementsByClassName(classNames) method takes a string that
                    contains an unordered set of unique space-separated tokens
                    representing classes. When called, the method must return a live
                    NodeList object containing all the elements in the document that
                    have all the classes specified in that argument, having obtained the
                    classes by splitting a string on spaces. If there are no tokens
                    specified in the argument, then the method must return an empty
                    NodeList.




                    https://www.w3.org/TR/2008/WD-html5-20080610/dom.html#getelementsbyclassname



                    getElementById




                    The getElementById() method accesses the first element with the specified id.




                    http://www.w3schools.com/jsref/met_doc_getelementbyid.asp



                    in your code the lines:




                    1- document.getElementsByClassName('myElement').style.size = '100px';




                    will NOT work as expected, cos the getElementByClassName will return an array, and the array will NOT have the style property, you gonna access each element by iterating them.



                    That's why the function getElementById was working for you, this function will return you the direct object , and so you will be able to access the style property.






                    share|improve this answer






















                      up vote
                      8
                      down vote










                      up vote
                      8
                      down vote









                      You are using a array as an object, the difference between getElementbyId and
                      getElementsByClassName is that:




                      • getElementbyId will return you an object.


                      • getElementsByClassName will return you an array.

                      getElementsByClassName




                      The getElementsByClassName(classNames) method takes a string that
                      contains an unordered set of unique space-separated tokens
                      representing classes. When called, the method must return a live
                      NodeList object containing all the elements in the document that
                      have all the classes specified in that argument, having obtained the
                      classes by splitting a string on spaces. If there are no tokens
                      specified in the argument, then the method must return an empty
                      NodeList.




                      https://www.w3.org/TR/2008/WD-html5-20080610/dom.html#getelementsbyclassname



                      getElementById




                      The getElementById() method accesses the first element with the specified id.




                      http://www.w3schools.com/jsref/met_doc_getelementbyid.asp



                      in your code the lines:




                      1- document.getElementsByClassName('myElement').style.size = '100px';




                      will NOT work as expected, cos the getElementByClassName will return an array, and the array will NOT have the style property, you gonna access each element by iterating them.



                      That's why the function getElementById was working for you, this function will return you the direct object , and so you will be able to access the style property.






                      share|improve this answer












                      You are using a array as an object, the difference between getElementbyId and
                      getElementsByClassName is that:




                      • getElementbyId will return you an object.


                      • getElementsByClassName will return you an array.

                      getElementsByClassName




                      The getElementsByClassName(classNames) method takes a string that
                      contains an unordered set of unique space-separated tokens
                      representing classes. When called, the method must return a live
                      NodeList object containing all the elements in the document that
                      have all the classes specified in that argument, having obtained the
                      classes by splitting a string on spaces. If there are no tokens
                      specified in the argument, then the method must return an empty
                      NodeList.




                      https://www.w3.org/TR/2008/WD-html5-20080610/dom.html#getelementsbyclassname



                      getElementById




                      The getElementById() method accesses the first element with the specified id.




                      http://www.w3schools.com/jsref/met_doc_getelementbyid.asp



                      in your code the lines:




                      1- document.getElementsByClassName('myElement').style.size = '100px';




                      will NOT work as expected, cos the getElementByClassName will return an array, and the array will NOT have the style property, you gonna access each element by iterating them.



                      That's why the function getElementById was working for you, this function will return you the direct object , and so you will be able to access the style property.







                      share|improve this answer












                      share|improve this answer



                      share|improve this answer










                      answered Feb 15 '16 at 2:53









                      Alvaro Joao

                      4,69452351




                      4,69452351




















                          up vote
                          7
                          down vote













                          The following description is taken from this page:




                          The getElementsByClassName() method returns a collection of all elements in the document with the specified class name, as a NodeList object.



                          The NodeList object represents a collection of nodes. The nodes can be
                          accessed by index numbers. The index starts at 0.



                          Tip: You can use the length property of the NodeList object to determine the number of elements with a specified class name, then you can loop through all elements and extract the info you want.




                          So, as a parameter getElementsByClassName would accept a class name.



                          If this is your HTML body:



                          <div id="first" class="menuItem"></div>
                          <div id="second" class="menuItem"></div>
                          <div id="third" class="menuItem"></div>
                          <div id="footer"></div>


                          then var menuItems = document.getElementsByClassName('menuItem') would return a collection (not an array) of the 3 upper <div>s, as they match the given class name.



                          You can then iterate over this nodes (<div>s in this case) collection with:



                          for (var menuItemIndex = 0 ; menuItems.length ; menuItemIndex ++) 
                          var currentMenuItem = menuItems[menuItemIndex];
                          // do stuff with currentMenuItem as a node.



                          Please refer to this post for more on differences between elements and nodes.






                          share|improve this answer


























                            up vote
                            7
                            down vote













                            The following description is taken from this page:




                            The getElementsByClassName() method returns a collection of all elements in the document with the specified class name, as a NodeList object.



                            The NodeList object represents a collection of nodes. The nodes can be
                            accessed by index numbers. The index starts at 0.



                            Tip: You can use the length property of the NodeList object to determine the number of elements with a specified class name, then you can loop through all elements and extract the info you want.




                            So, as a parameter getElementsByClassName would accept a class name.



                            If this is your HTML body:



                            <div id="first" class="menuItem"></div>
                            <div id="second" class="menuItem"></div>
                            <div id="third" class="menuItem"></div>
                            <div id="footer"></div>


                            then var menuItems = document.getElementsByClassName('menuItem') would return a collection (not an array) of the 3 upper <div>s, as they match the given class name.



                            You can then iterate over this nodes (<div>s in this case) collection with:



                            for (var menuItemIndex = 0 ; menuItems.length ; menuItemIndex ++) 
                            var currentMenuItem = menuItems[menuItemIndex];
                            // do stuff with currentMenuItem as a node.



                            Please refer to this post for more on differences between elements and nodes.






                            share|improve this answer
























                              up vote
                              7
                              down vote










                              up vote
                              7
                              down vote









                              The following description is taken from this page:




                              The getElementsByClassName() method returns a collection of all elements in the document with the specified class name, as a NodeList object.



                              The NodeList object represents a collection of nodes. The nodes can be
                              accessed by index numbers. The index starts at 0.



                              Tip: You can use the length property of the NodeList object to determine the number of elements with a specified class name, then you can loop through all elements and extract the info you want.




                              So, as a parameter getElementsByClassName would accept a class name.



                              If this is your HTML body:



                              <div id="first" class="menuItem"></div>
                              <div id="second" class="menuItem"></div>
                              <div id="third" class="menuItem"></div>
                              <div id="footer"></div>


                              then var menuItems = document.getElementsByClassName('menuItem') would return a collection (not an array) of the 3 upper <div>s, as they match the given class name.



                              You can then iterate over this nodes (<div>s in this case) collection with:



                              for (var menuItemIndex = 0 ; menuItems.length ; menuItemIndex ++) 
                              var currentMenuItem = menuItems[menuItemIndex];
                              // do stuff with currentMenuItem as a node.



                              Please refer to this post for more on differences between elements and nodes.






                              share|improve this answer














                              The following description is taken from this page:




                              The getElementsByClassName() method returns a collection of all elements in the document with the specified class name, as a NodeList object.



                              The NodeList object represents a collection of nodes. The nodes can be
                              accessed by index numbers. The index starts at 0.



                              Tip: You can use the length property of the NodeList object to determine the number of elements with a specified class name, then you can loop through all elements and extract the info you want.




                              So, as a parameter getElementsByClassName would accept a class name.



                              If this is your HTML body:



                              <div id="first" class="menuItem"></div>
                              <div id="second" class="menuItem"></div>
                              <div id="third" class="menuItem"></div>
                              <div id="footer"></div>


                              then var menuItems = document.getElementsByClassName('menuItem') would return a collection (not an array) of the 3 upper <div>s, as they match the given class name.



                              You can then iterate over this nodes (<div>s in this case) collection with:



                              for (var menuItemIndex = 0 ; menuItems.length ; menuItemIndex ++) 
                              var currentMenuItem = menuItems[menuItemIndex];
                              // do stuff with currentMenuItem as a node.



                              Please refer to this post for more on differences between elements and nodes.







                              share|improve this answer














                              share|improve this answer



                              share|improve this answer








                              edited May 23 '17 at 11:47









                              Community

                              11




                              11










                              answered Jan 7 '16 at 9:14









                              remdevtec

                              2,28811020




                              2,28811020




















                                  up vote
                                  4
                                  down vote













                                  ES6 provides Array.from() method, which creates a new Array instance from an array-like or iterable object.






                                  let boxes = document.getElementsByClassName('box');

                                  Array.from(boxes).forEach(v => v.style.background = 'green');
                                  console.log(Array.from(boxes));

                                  .box 
                                  width: 50px;
                                  height: 50px;
                                  margin: 5px;
                                  background: blue;
                                  display: inline-block;

                                  <div class='box'></div>
                                  <div class='box'></div>
                                  <div class='box'></div>
                                  <div class='box'></div>





                                  As you can see inside the code snippet, after using Array.from() function you are then able to manipulate over each element.





                                  The same solution using jQuery.






                                  $('.box').css('background':'green');

                                  .box 
                                  width: 50px;
                                  height: 50px;
                                  margin: 5px;
                                  background: blue;
                                  display: inline-block;

                                  <script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
                                  <div class='box'></div>
                                  <div class='box'></div>
                                  <div class='box'></div>
                                  <div class='box'></div>








                                  share|improve this answer


























                                    up vote
                                    4
                                    down vote













                                    ES6 provides Array.from() method, which creates a new Array instance from an array-like or iterable object.






                                    let boxes = document.getElementsByClassName('box');

                                    Array.from(boxes).forEach(v => v.style.background = 'green');
                                    console.log(Array.from(boxes));

                                    .box 
                                    width: 50px;
                                    height: 50px;
                                    margin: 5px;
                                    background: blue;
                                    display: inline-block;

                                    <div class='box'></div>
                                    <div class='box'></div>
                                    <div class='box'></div>
                                    <div class='box'></div>





                                    As you can see inside the code snippet, after using Array.from() function you are then able to manipulate over each element.





                                    The same solution using jQuery.






                                    $('.box').css('background':'green');

                                    .box 
                                    width: 50px;
                                    height: 50px;
                                    margin: 5px;
                                    background: blue;
                                    display: inline-block;

                                    <script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
                                    <div class='box'></div>
                                    <div class='box'></div>
                                    <div class='box'></div>
                                    <div class='box'></div>








                                    share|improve this answer
























                                      up vote
                                      4
                                      down vote










                                      up vote
                                      4
                                      down vote









                                      ES6 provides Array.from() method, which creates a new Array instance from an array-like or iterable object.






                                      let boxes = document.getElementsByClassName('box');

                                      Array.from(boxes).forEach(v => v.style.background = 'green');
                                      console.log(Array.from(boxes));

                                      .box 
                                      width: 50px;
                                      height: 50px;
                                      margin: 5px;
                                      background: blue;
                                      display: inline-block;

                                      <div class='box'></div>
                                      <div class='box'></div>
                                      <div class='box'></div>
                                      <div class='box'></div>





                                      As you can see inside the code snippet, after using Array.from() function you are then able to manipulate over each element.





                                      The same solution using jQuery.






                                      $('.box').css('background':'green');

                                      .box 
                                      width: 50px;
                                      height: 50px;
                                      margin: 5px;
                                      background: blue;
                                      display: inline-block;

                                      <script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
                                      <div class='box'></div>
                                      <div class='box'></div>
                                      <div class='box'></div>
                                      <div class='box'></div>








                                      share|improve this answer














                                      ES6 provides Array.from() method, which creates a new Array instance from an array-like or iterable object.






                                      let boxes = document.getElementsByClassName('box');

                                      Array.from(boxes).forEach(v => v.style.background = 'green');
                                      console.log(Array.from(boxes));

                                      .box 
                                      width: 50px;
                                      height: 50px;
                                      margin: 5px;
                                      background: blue;
                                      display: inline-block;

                                      <div class='box'></div>
                                      <div class='box'></div>
                                      <div class='box'></div>
                                      <div class='box'></div>





                                      As you can see inside the code snippet, after using Array.from() function you are then able to manipulate over each element.





                                      The same solution using jQuery.






                                      $('.box').css('background':'green');

                                      .box 
                                      width: 50px;
                                      height: 50px;
                                      margin: 5px;
                                      background: blue;
                                      display: inline-block;

                                      <script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
                                      <div class='box'></div>
                                      <div class='box'></div>
                                      <div class='box'></div>
                                      <div class='box'></div>








                                      let boxes = document.getElementsByClassName('box');

                                      Array.from(boxes).forEach(v => v.style.background = 'green');
                                      console.log(Array.from(boxes));

                                      .box 
                                      width: 50px;
                                      height: 50px;
                                      margin: 5px;
                                      background: blue;
                                      display: inline-block;

                                      <div class='box'></div>
                                      <div class='box'></div>
                                      <div class='box'></div>
                                      <div class='box'></div>





                                      let boxes = document.getElementsByClassName('box');

                                      Array.from(boxes).forEach(v => v.style.background = 'green');
                                      console.log(Array.from(boxes));

                                      .box 
                                      width: 50px;
                                      height: 50px;
                                      margin: 5px;
                                      background: blue;
                                      display: inline-block;

                                      <div class='box'></div>
                                      <div class='box'></div>
                                      <div class='box'></div>
                                      <div class='box'></div>





                                      $('.box').css('background':'green');

                                      .box 
                                      width: 50px;
                                      height: 50px;
                                      margin: 5px;
                                      background: blue;
                                      display: inline-block;

                                      <script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
                                      <div class='box'></div>
                                      <div class='box'></div>
                                      <div class='box'></div>
                                      <div class='box'></div>





                                      $('.box').css('background':'green');

                                      .box 
                                      width: 50px;
                                      height: 50px;
                                      margin: 5px;
                                      background: blue;
                                      display: inline-block;

                                      <script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
                                      <div class='box'></div>
                                      <div class='box'></div>
                                      <div class='box'></div>
                                      <div class='box'></div>






                                      share|improve this answer














                                      share|improve this answer



                                      share|improve this answer








                                      edited Apr 4 '17 at 9:21

























                                      answered Feb 21 '17 at 23:07









                                      kind user

                                      20.1k51942




                                      20.1k51942




















                                          up vote
                                          3
                                          down vote













                                          In Other Words



                                          • document.querySelector() selects only the first one element of the specified selector. So it doesn't spit out an array, it's a single value. Similar to document.getElementById() which fetches ID-elements only, since IDs have to be unique.


                                          • document.querySelectorAll() selects all elements with the specified selector and returns them in an array. Similar to document.getElementsByClassName() for classes and document.getElementsByTagName() tags only.





                                          Why use querySelector?



                                          It's used merely for the sole purpose of ease and brevity.






                                          Why use getElement/sBy?*



                                          Faster performance.






                                          Why this performance difference?



                                          Both ways of selection has the purpose of creating a NodeList for further use.
                                          querySelectors generates a static NodeList with the selectors thus it must be first created from scratch.
                                          getElement/sBy* immediately adapts the existing live NodeList of the current DOM.



                                          So, when to use which method it's up to you/your project/your device.






                                          Infos



                                          Demo of all methods
                                          NodeList Documentation
                                          Performance Test






                                          share|improve this answer


























                                            up vote
                                            3
                                            down vote













                                            In Other Words



                                            • document.querySelector() selects only the first one element of the specified selector. So it doesn't spit out an array, it's a single value. Similar to document.getElementById() which fetches ID-elements only, since IDs have to be unique.


                                            • document.querySelectorAll() selects all elements with the specified selector and returns them in an array. Similar to document.getElementsByClassName() for classes and document.getElementsByTagName() tags only.





                                            Why use querySelector?



                                            It's used merely for the sole purpose of ease and brevity.






                                            Why use getElement/sBy?*



                                            Faster performance.






                                            Why this performance difference?



                                            Both ways of selection has the purpose of creating a NodeList for further use.
                                            querySelectors generates a static NodeList with the selectors thus it must be first created from scratch.
                                            getElement/sBy* immediately adapts the existing live NodeList of the current DOM.



                                            So, when to use which method it's up to you/your project/your device.






                                            Infos



                                            Demo of all methods
                                            NodeList Documentation
                                            Performance Test






                                            share|improve this answer
























                                              up vote
                                              3
                                              down vote










                                              up vote
                                              3
                                              down vote









                                              In Other Words



                                              • document.querySelector() selects only the first one element of the specified selector. So it doesn't spit out an array, it's a single value. Similar to document.getElementById() which fetches ID-elements only, since IDs have to be unique.


                                              • document.querySelectorAll() selects all elements with the specified selector and returns them in an array. Similar to document.getElementsByClassName() for classes and document.getElementsByTagName() tags only.





                                              Why use querySelector?



                                              It's used merely for the sole purpose of ease and brevity.






                                              Why use getElement/sBy?*



                                              Faster performance.






                                              Why this performance difference?



                                              Both ways of selection has the purpose of creating a NodeList for further use.
                                              querySelectors generates a static NodeList with the selectors thus it must be first created from scratch.
                                              getElement/sBy* immediately adapts the existing live NodeList of the current DOM.



                                              So, when to use which method it's up to you/your project/your device.






                                              Infos



                                              Demo of all methods
                                              NodeList Documentation
                                              Performance Test






                                              share|improve this answer














                                              In Other Words



                                              • document.querySelector() selects only the first one element of the specified selector. So it doesn't spit out an array, it's a single value. Similar to document.getElementById() which fetches ID-elements only, since IDs have to be unique.


                                              • document.querySelectorAll() selects all elements with the specified selector and returns them in an array. Similar to document.getElementsByClassName() for classes and document.getElementsByTagName() tags only.





                                              Why use querySelector?



                                              It's used merely for the sole purpose of ease and brevity.






                                              Why use getElement/sBy?*



                                              Faster performance.






                                              Why this performance difference?



                                              Both ways of selection has the purpose of creating a NodeList for further use.
                                              querySelectors generates a static NodeList with the selectors thus it must be first created from scratch.
                                              getElement/sBy* immediately adapts the existing live NodeList of the current DOM.



                                              So, when to use which method it's up to you/your project/your device.






                                              Infos



                                              Demo of all methods
                                              NodeList Documentation
                                              Performance Test







                                              share|improve this answer














                                              share|improve this answer



                                              share|improve this answer








                                              edited Mar 19 at 15:01

























                                              answered Oct 23 '17 at 11:41









                                              Thielicious

                                              1,9431119




                                              1,9431119




















                                                  up vote
                                                  2
                                                  down vote













                                                  It returns Array-like list.



                                                  You make that an Array as example



                                                  var el = getElementsByClassName("elem");
                                                  el = Array.prototype.slice.call(el); //this line
                                                  el[0].appendChild(otherElem);





                                                  share|improve this answer
























                                                    up vote
                                                    2
                                                    down vote













                                                    It returns Array-like list.



                                                    You make that an Array as example



                                                    var el = getElementsByClassName("elem");
                                                    el = Array.prototype.slice.call(el); //this line
                                                    el[0].appendChild(otherElem);





                                                    share|improve this answer






















                                                      up vote
                                                      2
                                                      down vote










                                                      up vote
                                                      2
                                                      down vote









                                                      It returns Array-like list.



                                                      You make that an Array as example



                                                      var el = getElementsByClassName("elem");
                                                      el = Array.prototype.slice.call(el); //this line
                                                      el[0].appendChild(otherElem);





                                                      share|improve this answer












                                                      It returns Array-like list.



                                                      You make that an Array as example



                                                      var el = getElementsByClassName("elem");
                                                      el = Array.prototype.slice.call(el); //this line
                                                      el[0].appendChild(otherElem);






                                                      share|improve this answer












                                                      share|improve this answer



                                                      share|improve this answer










                                                      answered Jun 17 '16 at 3:21









                                                      atilkan

                                                      2,1331830




                                                      2,1331830




















                                                          up vote
                                                          2
                                                          down vote













                                                          You could get a single element by running



                                                          document.querySelector('.myElement').style.size = '100px';


                                                          but it's going to work for the first element with class .myElement.



                                                          If you would like apply this for all elements with the class I suggest you to use



                                                          document.querySelectorAll('.myElement').forEach(function(element) 
                                                          element.style.size = '100px';
                                                          );





                                                          share|improve this answer


























                                                            up vote
                                                            2
                                                            down vote













                                                            You could get a single element by running



                                                            document.querySelector('.myElement').style.size = '100px';


                                                            but it's going to work for the first element with class .myElement.



                                                            If you would like apply this for all elements with the class I suggest you to use



                                                            document.querySelectorAll('.myElement').forEach(function(element) 
                                                            element.style.size = '100px';
                                                            );





                                                            share|improve this answer
























                                                              up vote
                                                              2
                                                              down vote










                                                              up vote
                                                              2
                                                              down vote









                                                              You could get a single element by running



                                                              document.querySelector('.myElement').style.size = '100px';


                                                              but it's going to work for the first element with class .myElement.



                                                              If you would like apply this for all elements with the class I suggest you to use



                                                              document.querySelectorAll('.myElement').forEach(function(element) 
                                                              element.style.size = '100px';
                                                              );





                                                              share|improve this answer














                                                              You could get a single element by running



                                                              document.querySelector('.myElement').style.size = '100px';


                                                              but it's going to work for the first element with class .myElement.



                                                              If you would like apply this for all elements with the class I suggest you to use



                                                              document.querySelectorAll('.myElement').forEach(function(element) 
                                                              element.style.size = '100px';
                                                              );






                                                              share|improve this answer














                                                              share|improve this answer



                                                              share|improve this answer








                                                              edited Jul 2 '17 at 21:06









                                                              JJJ

                                                              29k147591




                                                              29k147591










                                                              answered Jul 2 '17 at 19:29









                                                              Sergey

                                                              984




                                                              984




















                                                                  up vote
                                                                  2
                                                                  down vote













                                                                  /*
                                                                  * To hide all elements with the same class,
                                                                  * use looping to reach each element with that class.
                                                                  * In this case, looping is done recursively
                                                                  */

                                                                  const hideAll = (className, i=0) =>
                                                                  if(!document.getElementsByClassName(className)[i]) //exits the loop when element of that id does not exist
                                                                  return;


                                                                  document.getElementsByClassName(className)[i].style.visibility = 'hidden'; //hide element
                                                                  return hideAll(className, i+1) //loop for the next element


                                                                  hideAll('appBanner') //the function call requires the class name





                                                                  share|improve this answer
























                                                                    up vote
                                                                    2
                                                                    down vote













                                                                    /*
                                                                    * To hide all elements with the same class,
                                                                    * use looping to reach each element with that class.
                                                                    * In this case, looping is done recursively
                                                                    */

                                                                    const hideAll = (className, i=0) =>
                                                                    if(!document.getElementsByClassName(className)[i]) //exits the loop when element of that id does not exist
                                                                    return;


                                                                    document.getElementsByClassName(className)[i].style.visibility = 'hidden'; //hide element
                                                                    return hideAll(className, i+1) //loop for the next element


                                                                    hideAll('appBanner') //the function call requires the class name





                                                                    share|improve this answer






















                                                                      up vote
                                                                      2
                                                                      down vote










                                                                      up vote
                                                                      2
                                                                      down vote









                                                                      /*
                                                                      * To hide all elements with the same class,
                                                                      * use looping to reach each element with that class.
                                                                      * In this case, looping is done recursively
                                                                      */

                                                                      const hideAll = (className, i=0) =>
                                                                      if(!document.getElementsByClassName(className)[i]) //exits the loop when element of that id does not exist
                                                                      return;


                                                                      document.getElementsByClassName(className)[i].style.visibility = 'hidden'; //hide element
                                                                      return hideAll(className, i+1) //loop for the next element


                                                                      hideAll('appBanner') //the function call requires the class name





                                                                      share|improve this answer












                                                                      /*
                                                                      * To hide all elements with the same class,
                                                                      * use looping to reach each element with that class.
                                                                      * In this case, looping is done recursively
                                                                      */

                                                                      const hideAll = (className, i=0) =>
                                                                      if(!document.getElementsByClassName(className)[i]) //exits the loop when element of that id does not exist
                                                                      return;


                                                                      document.getElementsByClassName(className)[i].style.visibility = 'hidden'; //hide element
                                                                      return hideAll(className, i+1) //loop for the next element


                                                                      hideAll('appBanner') //the function call requires the class name






                                                                      share|improve this answer












                                                                      share|improve this answer



                                                                      share|improve this answer










                                                                      answered Nov 25 at 4:06









                                                                      Irina Mityugova

                                                                      211




                                                                      211




















                                                                          up vote
                                                                          -1
                                                                          down vote













                                                                          With ES5+ (any browsed nowadays - 2017) you should be able to do






                                                                          .forEach.call(document.getElementsByClassName('answer'), function(el) 
                                                                          el.style.color= 'red';
                                                                          );








                                                                          share|improve this answer


























                                                                            up vote
                                                                            -1
                                                                            down vote













                                                                            With ES5+ (any browsed nowadays - 2017) you should be able to do






                                                                            .forEach.call(document.getElementsByClassName('answer'), function(el) 
                                                                            el.style.color= 'red';
                                                                            );








                                                                            share|improve this answer
























                                                                              up vote
                                                                              -1
                                                                              down vote










                                                                              up vote
                                                                              -1
                                                                              down vote









                                                                              With ES5+ (any browsed nowadays - 2017) you should be able to do






                                                                              .forEach.call(document.getElementsByClassName('answer'), function(el) 
                                                                              el.style.color= 'red';
                                                                              );








                                                                              share|improve this answer














                                                                              With ES5+ (any browsed nowadays - 2017) you should be able to do






                                                                              .forEach.call(document.getElementsByClassName('answer'), function(el) 
                                                                              el.style.color= 'red';
                                                                              );








                                                                              .forEach.call(document.getElementsByClassName('answer'), function(el) 
                                                                              el.style.color= 'red';
                                                                              );





                                                                              .forEach.call(document.getElementsByClassName('answer'), function(el) 
                                                                              el.style.color= 'red';
                                                                              );






                                                                              share|improve this answer














                                                                              share|improve this answer



                                                                              share|improve this answer








                                                                              edited Dec 2 '16 at 8:39

























                                                                              answered Apr 20 '15 at 16:03









                                                                              Matas Vaitkevicius

                                                                              32.3k15161171




                                                                              32.3k15161171



























                                                                                  draft saved

                                                                                  draft discarded
















































                                                                                  Thanks for contributing an answer to Stack Overflow!


                                                                                  • Please be sure to answer the question. Provide details and share your research!

                                                                                  But avoid


                                                                                  • Asking for help, clarification, or responding to other answers.

                                                                                  • Making statements based on opinion; back them up with references or personal experience.

                                                                                  To learn more, see our tips on writing great answers.





                                                                                  Some of your past answers have not been well-received, and you're in danger of being blocked from answering.


                                                                                  Please pay close attention to the following guidance:


                                                                                  • Please be sure to answer the question. Provide details and share your research!

                                                                                  But avoid


                                                                                  • Asking for help, clarification, or responding to other answers.

                                                                                  • Making statements based on opinion; back them up with references or personal experience.

                                                                                  To learn more, see our tips on writing great answers.




                                                                                  draft saved


                                                                                  draft discarded














                                                                                  StackExchange.ready(
                                                                                  function ()
                                                                                  StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f10693845%2fwhat-do-queryselectorall-getelementsbyclassname-and-other-getelementsby-method%23new-answer', 'question_page');

                                                                                  );

                                                                                  Post as a guest















                                                                                  Required, but never shown





















































                                                                                  Required, but never shown














                                                                                  Required, but never shown












                                                                                  Required, but never shown







                                                                                  Required, but never shown

































                                                                                  Required, but never shown














                                                                                  Required, but never shown












                                                                                  Required, but never shown







                                                                                  Required, but never shown







                                                                                  這個網誌中的熱門文章

                                                                                  Barbados

                                                                                  How to read a connectionString WITH PROVIDER in .NET Core?

                                                                                  Node.js Script on GitHub Pages or Amazon S3