Форум программистов, компьютерный форум, киберфорум
jQuery
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.85/13: Рейтинг темы: голосов - 13, средняя оценка - 4.85
 Аватар для 19dmitry
37 / 37 / 22
Регистрация: 18.01.2014
Сообщений: 150

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

06.03.2018, 17:45. Показов 2692. Ответов 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
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
06.03.2018, 17:45
Ответы с готовыми решениями:

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

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

Как выделить цветом активный пункт меню?
Друзья, есть страница http://539687.fdcorp.web.hosting-test.net/index.php/kran-sharovoy-vv-ruchka.html Слева меню (в левом сайдбаре)....

13
90 / 90 / 48
Регистрация: 07.12.2011
Сообщений: 215
06.03.2018, 21:30
Скрипт может и рабочий, а ошибка говорит что сам jQuery не может загрузится. Как подключаете его?
0
41 / 37 / 15
Регистрация: 22.03.2013
Сообщений: 293
07.03.2018, 08:52
В скрипте у себя проверяйте путь. Либо скачиваете себе 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
 Аватар для 19dmitry
37 / 37 / 22
Регистрация: 18.01.2014
Сообщений: 150
07.03.2018, 12:03  [ТС]
Запускаю все через 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
41 / 37 / 15
Регистрация: 22.03.2013
Сообщений: 293
07.03.2018, 12:11
В коде вроде бы все правильно. По крайней мере ошибок не вижу.
Вижу у вас при старте идет загрузка файла /main.html, который вставляется в $('#content')
Видимо вы в том файле с путями и намудрили. Проверяйте его.
0
 Аватар для 19dmitry
37 / 37 / 22
Регистрация: 18.01.2014
Сообщений: 150
07.03.2018, 12:23  [ТС]
Вы правы. Действительно в 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
41 / 37 / 15
Регистрация: 22.03.2013
Сообщений: 293
07.03.2018, 12:31
Вы в корне неверный велосипед сделали лучше так реализовать в 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
 Аватар для 19dmitry
37 / 37 / 22
Регистрация: 18.01.2014
Сообщений: 150
07.03.2018, 13:35  [ТС]
Пока ничего не выходит.

Скрипт перенес в 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
 Аватар для sad67man
2600 / 1504 / 689
Регистрация: 23.08.2015
Сообщений: 3,804
07.03.2018, 14:49
19dmitry, Скиньте архив так будет быстрее.
0
 Аватар для 19dmitry
37 / 37 / 22
Регистрация: 18.01.2014
Сообщений: 150
07.03.2018, 14:52  [ТС]
Выкладываю архив test2.ru.rar
Вложения
Тип файла: rar test2.ru.rar (2.20 Мб, 5 просмотров)
0
 Аватар для sad67man
2600 / 1504 / 689
Регистрация: 23.08.2015
Сообщений: 3,804
07.03.2018, 15:16
Лучший ответ Сообщение было отмечено 19dmitry как решение

Решение

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

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

Всё заработало. Только при перезагрузке страницы все пункты становятся change.
0
 Аватар для sad67man
2600 / 1504 / 689
Регистрация: 23.08.2015
Сообщений: 3,804
07.03.2018, 15:33
Лучший ответ Сообщение было отмечено 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
 Аватар для 19dmitry
37 / 37 / 22
Регистрация: 18.01.2014
Сообщений: 150
07.03.2018, 15:35  [ТС]
Да, все понял. Спасибо. Работает.

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

Спасибо большое. Уяснил.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
07.03.2018, 15:35
Помогаю со студенческими работами здесь

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

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

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

Как выделить цветом активный пункт меню?
Друзья, есть страница http://539687.fdcorp.web.hosting-test.net/index.php/kran-sharovoy-vv-ruchka.html Слева меню (в левом сайдбаре)....

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


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

Или воспользуйтесь поиском по форуму:
14
Ответ Создать тему
Новые блоги и статьи
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Access
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru