37 / 37 / 22
Регистрация: 18.01.2014
Сообщений: 150
1

Как выделить активный пункт меню на JQuery

06.03.2018, 17:45. Показов 2355. Ответов 13

Студворк — интернет-сервис помощи студентам
Добрый день!

Не работает скрипт, изменяющий цвет активного пункта меню.

Есть меню (стандартный цвет черный).
При клике по одному из пунктов подгружается информация в блок, при этом цвет пункта меню меняется (оранжевый), при переключении на другой пункт меню, второй пункт становится активный (оранжевый), а первый принимает первоначальный цвет (черный).

Пункты меню - это ссылки. Для них выделено два цвета: link/visited - #49423d; hover/acrive - #ff8c00

CSS
1
2
3
4
5
6
7
#menu {relative; top:0.5cm; padding-top:1cm; padding-left:13.5cm; font-size:18pt; word-spacing:1cm; font-family:Tahoma; font-style:italic; font-weight:lighter; color:#49423d;} 
      #menu a:link {color:#49423d;}
      #menu a:visited {font-weight:lighter; color:#49423d;}
      #menu a:hover {color:#ff8c00}
      #menu a:active {color:#ff8c00}
      #menu a{text-decoration:none; cursor:pointer;}
      .change {color: #ff8c00} <!--служит для изменения цвета активного пункта меню-->
HTML5
1
2
3
4
5
6
7
8
9
10
11
12
13
14
<body>
 
    <div id="menu">
      <a data_target="main.html" href="main.html">Главная</a>
      <a data_target="directions.html" href="directions.html">Направления</a>
      <a data_target="product.html" href="product.html">Продукция</a>
      <a data_target="about.html" href="about.html" style="word-spacing:0cm">О&nbsp;Предприятии</a>
    </div>
  
    <img id="logo" src="/pictures/logo.jpg" alt="logo"/> 
 
    <div id="content"></div>
 
</body>
ajax.js
Javascript
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
$(function() {
  $("#content").load("/main.html"); // загрузка основного контента
  
  $('#menu a').click(function() { // подгрузка контента в блок div при клике по пунктам меню
    $.ajax({
      url:$(this).attr('data_target'),
      cache: false,
      success: function(html) {
        $("#content").html(html);
        $('#menu a').addClass('active');
      }
    });
    return false;
  });
});
 
// смены цвета активного пункта меню
$(function() {
  var location = window.location.href;
  var cur_url = '/' + location.split('/').pop();
 
  $('#menu').each(function () {
     var link = $(this).find('a').attr('href');
 
     if (cur_url == link)
         $(this).addClass('change');
  });
});
F12 выдает следующие ошибки:
Миниатюры
Как выделить активный пункт меню на JQuery  
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
06.03.2018, 17:45
Ответы с готовыми решениями:

Выделить активный пункт меню
Доброго времени суток! Я видела, что похожие темы были, но я в ступоре(( Надо закончить меню для...

Активный пункт меню
сделал табличку, в каждую яцейку поместил пункт меню придал им стил. задача при клике по пукту он...

Как выделить цветом активный пункт меню?
Друзья, есть страница...

Выделить активный пункт меню
Доброго дня. Дано: - 3 кнопки меню &quot;1&quot;,&quot;2&quot;,&quot;3&quot; (оранжевого цвета, тег &lt;a&gt; снаружи...

13
90 / 90 / 48
Регистрация: 07.12.2011
Сообщений: 215
06.03.2018, 21:30 2
Скрипт может и рабочий, а ошибка говорит что сам jQuery не может загрузится. Как подключаете его?
0
40 / 36 / 15
Регистрация: 22.03.2013
Сообщений: 293
07.03.2018, 08:52 3
В скрипте у себя проверяйте путь. Либо скачиваете себе jquery и указывайте относительный путь, который указывается относительно php файла. Например, если файлы лежат в одной директории
Javascript
1
<script src="jquery.min.js"></script>
Либо же указывайте путь с гугла.
Javascript
1
<script src="http://ajax.googleapis.com/ajax/libs/jquery/1/jquery.min.js"></script>
Добавлено через 20 минут
Javascript
1
2
3
4
5
6
$('#menu').each(function () {
     var link = $(this).find('a').attr('href');
 
     if (cur_url == link)
         $(this).addClass('change');
});
each используется для перебора элементов. В данном случае перебираются элементы с идентификатором menu. Что не правильно ибо у вас он один. Так же вы пытаетесь получить атрибут href у ссылок, данного атрибута у вас нету. Код должен выглядеть так:
Javascript
1
2
3
4
5
6
$('#menu > a').each(function (ind, e) {
     var link = $(this).attr('data_target')
 
     if (cur_url == link)
         $(this).addClass('change');
});
0
37 / 37 / 22
Регистрация: 18.01.2014
Сообщений: 150
07.03.2018, 12:03  [ТС] 4
Запускаю все через openserver.

Все файлы находятся в одной директории, файлы со скриптами находятся в папке js (всего два файла:ajax.js - скрипты; jquery-3.3.1.min.js - сама библиотека). На неё и дается ссылка в основном html файле. Все остальные скрипты запускаются.

HTML5
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
<!DOCTYPE html>
 
<html lang="ru-RU">
  <head>
    <meta charset="UTF-8">
    <title>Название сайта</title>
 
    <link href="/css/style.css" rel="stylesheet" type="text/css">
    
    <link rel="icon" href="http://hexamech.ru/favicon.ico" type="image/x-icon" />
 
    <link rel="shortcut icon" href="http://hexamech.ru/favicon.ico" type="image/x-icon" />
 
    <script type="text/javascript" src="/js/jquery-3.3.1.min.js"></script>
    <script type="text/javascript" src='/js/ajax.js'></script>
 
  </head>
 
  <body>
  
   <p id="header"><i>Разработка, производство, поставка специальных машин и устройств</i></p>
 
 
    <div id="menu">
      <a data_target="main.html" href="main.html">Главная</a>
      <a data_target="directions.html" href="directions.html">Направления</a>
      <a data_target="product.html" href="product.html">Продукция</a>
      <a data_target="about.html" href="about.html" style="word-spacing:0cm">О&nbsp;Предприятии</a>
    </div>
  
    <img id="logo" src="/pictures/logo.jpg" alt="logo"/> 
 
    <div id="content"></div>
 
  </body>
</html>
Прилагаю полностью содержимое файла ajax.js с исправленным кодом
Javascript
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
$(function() {
  $("#content").load("/main.html");
  $('#menu a').click(function() {
    $.ajax({
      url:$(this).attr('data_target'),
      cache: false,
      success: function(html) {
        $("#content").html(html);
        $('#menu a').addClass('active');
      }
    });
    return false;
  });
});
 
$(function() { 
  var location = window.location.href;
  var cur_url = '/' + location.split('/').pop();
 
  $('#menu > a').each(function (ind, e) {
     var link = $(this).attr('data_target')
 
     if (cur_url == link)
         $(this).addClass('change');
  });
});
Миниатюры
Как выделить активный пункт меню на JQuery   Как выделить активный пункт меню на JQuery  
0
40 / 36 / 15
Регистрация: 22.03.2013
Сообщений: 293
07.03.2018, 12:11 5
В коде вроде бы все правильно. По крайней мере ошибок не вижу.
Вижу у вас при старте идет загрузка файла /main.html, который вставляется в $('#content')
Видимо вы в том файле с путями и намудрили. Проверяйте его.
0
37 / 37 / 22
Регистрация: 18.01.2014
Сообщений: 150
07.03.2018, 12:23  [ТС] 6
Вы правы. Действительно в main.html был указан другой путь. Исправил. Ошибка в консоли исчезла. Но эффекта добиться не удалось. После клика пункт меню обратно принимает свой базовый цвет (не меняется).

Файл main.html Код ниже привожу просто в качестве примера. Это скрипт для смены изображения (слайды).
HTML5
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
!DOCTYPE html>
 
<html lang="ru-RU">
  <head>
    <meta charset="UTF-8">
    <title>Прикладная механика</title>
    <link href="/css/style.css" rel="stylesheet" type="text/css">
 
   <script type="text/javascript" src="/js/jquery-3.3.1.min.js"></script>
 
   <script>
      function theRotator() {
        $('div#rotator ul li').css({opacity:0.0});
        $('div#rotator ul li:first').css({opacity:1.0});
        setInterval('rotate()', 5000);
      }
 
      function rotate() {
        var current = ($('div#rotator ul li.show')? $('div#rotator ul li.show') : $('div#rotator ul li:first'));
        var next = ((current.next().length) ? ((current.next().hasClass('show')) ? $('div#rotator ul li:first') : current.next()) : $('div#rotator ul li:first'));
        var sibs = current.siblings();
        var rndNum = Math.floor(Math.random() * sibs.length);
        var next = $(sibs[rndNum]);
        next.css({opacity: 0.0})
        .addClass('show')
        .animate({opacity: 1.0}, 1000);
        current.animate({opacity: 0.0}, 1000)
        .removeClass('show');
      };
 
      $(document).ready(function() {
        theRotator();
      });
    </script>
 
  </head>
0
40 / 36 / 15
Регистрация: 22.03.2013
Сообщений: 293
07.03.2018, 12:31 7
Вы в корне неверный велосипед сделали лучше так реализовать в index.html
Javascript
1
2
3
4
5
6
7
8
9
10
11
12
$('#menu a').click(function() {
    $('#menu > a').removeClass('change'); //при нажатии удаляем класс change, на всех ссылках где он есть
    $(this).addClass("change"); // присваиваем класс change тому куда тыкнули
    $.ajax({
        url: $(this).attr('data_target'),
        cache: false,
        success: function(html){
            $('#content').html(html);               
        }
    });
        return false;
});
На ссылке главная, выставите класс change
HTML5
1
<a data_target="main.html" class="change" href="main.html">Главная</a>
1
37 / 37 / 22
Регистрация: 18.01.2014
Сообщений: 150
07.03.2018, 13:35  [ТС] 8
Пока ничего не выходит.

Скрипт перенес в index.html
HTML5
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
<!DOCTYPE html>
 
<html lang="ru-RU">
  <head>
    <meta charset="UTF-8">
    <title>Прикладная механика</title>
 
    <link href="/css/style.css" rel="stylesheet" type="text/css">
    
    <link rel="icon" href="http://hexamech.ru/favicon.ico" type="image/x-icon" />
 
    <link rel="shortcut icon" href="http://hexamech.ru/favicon.ico" type="image/x-icon" />
 
    <script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1/jquery.min.js"></script>
 
    <script type="text/javascript" src='/js/ajax.js'></script>
 
    <style>    
      hr {margin:0; border:none; height: 3px;} 
    </style>
[JS]
    <script>
     $(function(){
      $('#menu a').click(function() {
        $('#menu > a').removeClass('change')
        $(this).addClass("change");
        $.ajax({
          url:$(this).attr('data_target'),
          cache: false,
          success: function(html){
            $('#content').html(html);
          }
        });
        return false;
      });
     });
    </script>
[/JS]
  </head>
 
  <body>
  
   <p id="header"><i>Разработка, производство, поставка специальных машин и устройств</i></p>
 
 
    <div id="menu">
      <a data_target="main.html" class="change" href="main.html">Главная</a>
      <a data_target="directions.html" class="change" href="directions.html">Направления</a>
      <a data_target="product.html" class="change" href="product.html">Продукция</a>
      <a data_target="about.html" class="change" href="about.html" style="word-spacing:0cm">О&nbsp;Предприятии</a>
    </div>
  
    <img id="logo" src="/pictures/logo.jpg" alt="logo"/> 
 
    <div id="content"></div>
 
  <footer>
    <div id="footer">
      <hr style="background-color:#8e8e8e; color: #8e8e8e; align:center"/>
      <hr style="background-color:#ff4500; color: #ff4500; align:center; margin-top:2px; height:5px; " />
      
      <p id="contacts">Телефон<br/>
         Адрес</p>
 
      <p id="author">©2018 Фирма<br/>
         [email]email@email.com[/email]</p>      
    </div>
  </footer>
 
  </body>
</html>
class="change" добавил к ссылкам, привязанным к пунктам меню (которые должны менять цвет)

ссылку на jQuery установил гугловкую на всех страницах со скриптом (index.html, main.html), т.к. консоль последний раз выдала ошибку :

jquery.min.js:4 Not allowed to load local resource: file:///C:/Users/Dmitry/Downloads/jquery-3.3.1.min.js?_=1520418187339

Исправить её так и не удалось. Почему указан этот адрес не понятно, ни в одном файле он уже не присутствует, везде был заменен. На работу других сценариев это никак не повлияло, они работают, а новый - без изменений.
0
2157 / 1218 / 592
Регистрация: 23.08.2015
Сообщений: 3,098
07.03.2018, 14:49 9
19dmitry, Скиньте архив так будет быстрее.
0
37 / 37 / 22
Регистрация: 18.01.2014
Сообщений: 150
07.03.2018, 14:52  [ТС] 10
Выкладываю архив test2.ru.rar
Вложения
Тип файла: rar test2.ru.rar (2.20 Мб, 5 просмотров)
0
2157 / 1218 / 592
Регистрация: 23.08.2015
Сообщений: 3,098
07.03.2018, 15:16 11
Лучший ответ Сообщение было отмечено 19dmitry как решение

Решение

19dmitry, Ваш стиль .change перекрывается. Все дело в специфичности селектора, т.е. в его приоритете.
Можно найти множество статей по этому поводу, вот первая попавшееся. http://www.quizful.net/post/sp... -selectors

Добавлено через 1 минуту
CSS
1
#menu a.change {color: #ff8c00}
1
37 / 37 / 22
Регистрация: 18.01.2014
Сообщений: 150
07.03.2018, 15:24  [ТС] 12
Спасибо. Я совсем забыл про приоритетность.

Всё заработало. Только при перезагрузке страницы все пункты становятся change.
0
2157 / 1218 / 592
Регистрация: 23.08.2015
Сообщений: 3,098
07.03.2018, 15:33 13
Лучший ответ Сообщение было отмечено 19dmitry как решение

Решение

Цитата Сообщение от 19dmitry Посмотреть сообщение
Только при перезагрузке страницы все пункты становятся change.
index.html Поправьте, у вас там стоит
HTML5
1
2
3
4
5
6
<div id="menu">
      <a data_target="main.html" class="change" href="main.html">Главная</a>
      <a data_target="directions.html" class="change" href="directions.html">Направления</a>
      <a data_target="product.html" class="change" href="product.html">Продукция</a>
      <a data_target="about.html" class="change" href="about.html" style="word-spacing:0cm">О&nbsp;Предприятии</a>
    </div>
Добавлено через 1 минуту
Уберите лишние классы.
1
37 / 37 / 22
Регистрация: 18.01.2014
Сообщений: 150
07.03.2018, 15:35  [ТС] 14
Да, все понял. Спасибо. Работает.

В первой ссылке class="change" указывает на первоначальный элемент.

Спасибо большое. Уяснил.
0
07.03.2018, 15:35
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
07.03.2018, 15:35
Помогаю со студенческими работами здесь

Выделить активный пункт меню при динамическом получении страниц
В общем помогите, пожалуйста. Нужно выделить активный пункт меню (т.е. тот, на котором я нахожусь...

Как выделить активный пункт меню
Добрый вечер, форумчане! Помогите пожалуйста новечку! Сделала меню: &lt;?php $uri = $_SERVER;;?&gt;...

Как выделить цветом активный пункт меню?
Друзья, есть страница...

Активный пункт меню выделить жирным
Есть меню на сайте: &lt;div class=&quot;menuItem&quot;&gt; Главная &lt;/div&gt; &lt;div...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
14
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2023, CyberForum.ru