16

I am kind of confused why my code doesn't work correctly, I hope You will tell me what I've done wrong. I want to highlight navigation tab while clicked.

HTML:

<header class="mainheader">
  <!-- Obrazek tutaj-->
  <nav>
    <ul>
      <li><a id="a-home" onclick="dodajAktywne(this)" href="index.html">Home</a></li>
      <li><a id="a-omnie" onclick="dodajAktywne(this)" href="omnie.html">O mnie</a></li>
      <li><a id="a-kurs" onclick="dodajAktywne(this)" href="kurs.html">Kurs</a></li>
      <li><a id="a-kontakt" onclick="dodajAktywne(this)" href="kontakt.html">Kontakt</a></li>
    </ul>
  </nav>
</header>

JavaScript:

   function dodajAktywne(elem) {
    var a = document.getElementsByTagName('a')
    for (i = 0; i < a.length; i++) {
        a[i].classList.remove('active');
    }
    elem.classList.add('active');
}

CSS:

.active {
    color: blue;
    background-color: #cf5c3f;
}
7
  • You should pass this to pass the element itself to the function. Commented Nov 16, 2014 at 16:30
  • OP code is working fiddle. I think he means when he clicks the link doesn't keep the style.. Commented Nov 16, 2014 at 16:32
  • Without the actual code it is difficult to tell, I assume that you plan to include your <header> tag in every page you have exactly as you have it posted. If this is so, then you problem is that as a link is clicked the page is reloaded and your changes (add class) are discarded. For the future it is best if you would provide a repro using jsfiddle or plunker Commented Nov 16, 2014 at 16:33
  • @AlexChar which leads to a conclusion that i.e: omnie.html is being followed. Commented Nov 16, 2014 at 16:36
  • fiddle add return false; if you dont want to redirect the page Commented Nov 16, 2014 at 16:37

3 Answers 3

24

You can simplify your JavaScript to:

Fiddle

function dodajAktywne(elem) {
    // get all 'a' elements
    var a = document.getElementsByTagName('a');
    // loop through all 'a' elements
    for (i = 0; i < a.length; i++) {
        // Remove the class 'active' if it exists
        a[i].classList.remove('active')
    }
    // add 'active' classs to the element that was clicked
    elem.classList.add('active');
}

If you pass the parameter this in your HTML to:

<header class="mainheader">
    <!-- Obrazek tutaj-->
    <nav>
        <ul>
            <li><a id="a-home" onclick="dodajAktywne(this)" href="#">Home</a>
            </li>
            <li><a id="a-omnie" onclick="dodajAktywne(this)" href="#">O mnie</a>
            </li>
            <li><a id="a-kurs" onclick="dodajAktywne(this)" href="#">Kurs</a>
            </li>
            <li><a id="a-kontakt" onclick="dodajAktywne(this)" href="#">Kontakt</a>
            </li>
        </ul>
    </nav>
</header>

Note: I've changed href attribute to #, you will have to change it back to your .html pages


Alternatively, you can do this without JavaScript, using CSS's :focus:

Fiddle

a:focus {
    color: blue;
    background-color: #cf5c3f;
}
Sign up to request clarification or add additional context in comments.

6 Comments

I have tried both options, none of them are working as intended. Nav buttons just lose their focus.
@user3703750 - You want the previous button to be active, even if another button is clicked?
None is active. When I click on another link i.e. home, I want Home button from navigation to be active and highlighted.
The problem is that my page is redirecting when I click on any tab from navigation. When I've stopped redirecting Your code works perfectly.
jsfiddle.net/pb95kv32/2 This is how I made this. Works correctly now. Thx for help, I'll vote You up :)
|
3

This code will highlight the navigation tab without needing to include onclick in the HTML, though it doesn't remove the background color if another tab is clicked.

    document.onclick = function(event) {
         var target = event.target || event.srcElement;
         target.style.background = '#cf5c3f';
        };

https://codepen.io/mdmcginn/pen/BwrNaj/

Comments

0

var list = document.querySelector('ul');
list.addEventListener('click', function(ev) {
  if (ev.target.tagName === 'LI') {
    ev.target.classList.toggle('checked');
  }
}, false);

1 Comment

Please add explanation to your answer.

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.