Главная » Статьи » Статьи о/про uCoz » JS и JQ скрипты для uCoz

Как подсветить (выделить) активную (текущую) ссылку. JavaScript + CSS

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

Звучал он примерно так:

Quote (Komoff)

Привет! Вопрос такой возник, как сделать так, чтобы в меню, ссылка, на ту страницу где в данный момент находится пользователь, была как бы неактивной? Наподобие того, что в меню созданном в конструкторе

Только мне кажется я ни тем занимаюсь. Может есть скрипт распространяющийся на все ссылки на странице, т.е. если на странице присутствует ссылка на неё саму, то она становится неактивной? Или например, чтобы сравнение происходило только у ссылок с определенным class'ом, и при совпадении, class подменялся на другой. Неактивной имею в виду, или задать другой стиль через CSS или преобразующий такую ссылку в обычный текст. В принципе, если трудно такое реализовать, то попробую адаптировать указанный мной выше скрипт до конца.
Надеюсь изложил все более-менее внятно.:)


Задача изложена вполне внятно и доходчиво. Приступим.


Решение для подсветки (выделения) активной ссылки на чистом JavaScript


Без вступления - вот код ... пояснения ниже ...

Code
<script type="text/javascript">
try{
var el=document.getElementById('msgText').getElementsByTagName('a');
var url=document.location.href;
for(var i=0;i<el.length; i++){
if (url==el[i].href){
el[i].className += ' act';
};
};
}catch(e){}
</script>

Где:

el=document.getElementById('msgText') - ID блока (таблицы и т.п.) в котором будем искать ссылки. Почему именно так - ниже.

.getElementsByTagName('a') - находим все элементы «а» в блоке с ID «msgText» (id="msgText").

var url=document.location.href; - объявляем переменную, равную текущему URL страницы.

for(var i=0;i<el.length; i++) - походимся по каждой ссылке из найденных. «el.length» - количество найденных ссылок. (элементов «а»).

el[i].className += ' act'; - добавляем текущему элементу класс «act». Вот этот пробел - необходим «'_act'» чтобы не получить вот такой класс «class="redact"» - если ссылка уже имеет свой класс «class="red"». То есть мы добавляем к текущеме классу класс «act» и получаем «class="red act"». Если у ссылки изначально нет класса, будет вот так «class=" act"», что не считается ошибкой и будет работать.


Можно сократить скрипт, если не нужно обрабатывать ошибки и будем писать скрипт в исходнике....
Мне не очень нравятся подобные действия, особенно когда можно избежать этого, то есть вынести скрипт во внешний файл.

Для этого, нужно написать небольшую функцию.
Вот её код.

Code
function shineLinks(id){
try{
var el=document.getElementById(id).getElementsByTagName('a');
var url=document.location.href;
for(var i=0;i<el.length; i++){
if (url==el[i].href){
el[i].className += ' act';
};
};
}catch(e){}
};

Где:

function shineLinks(id) - сама функция. ID блока, для поиска ссылок, передаём из вызова.


Как и написано выше, класс для поиска передаем из вызова. Вызывать функцию нужно после загрузки документа или, хотя бы блока, в котором осуществляется поиск.
То есть скрипт вызова писать в самом низу документа. Например, перед закрывающим тегом </body>.

Пример:

Code
<!-- Много букаф -->
<script type="text/javascript">shineLinks('msgText');</script>
</body>
</html>

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

К этому же вопросу (скорости работы) относится и то, почему функция провязана к ID блока, а не ко всем ссылкам страницы.
Считаю неправильным моё мнение (прим.авт.) вешать такой обработяик на всю страницу.

Можно модифицировать функцию и передавать в неё, кроме ID блока поиска, ещё и дополнительные параметры. Например классактивной ссылки.
Пример:
Функция:


Code (JavaScript)
function shineLinks(id,class){
try{
var el=document.getElementById(id).getElementsByTagName('a');
var url=document.location.href;
for(var i=0;i<el.length; i++){
if (url==el[i].href){
el[i].className += ' '+class+'';
};
};
}catch(e){}
};

Вызов:

Code
<!--Много букаф-->
<script type="text/javascript">shineLinks('msgText','act');shineLinks('msgText2','act2');</script>
</body>
</html>

CSS:

Code
<style type="text/css">
/* StartStyle */
body{font: 11px/normal Verdana,sans-serif;}
a{text-decoration:none;color:#999;}
a:hover{color:#666;}
a.act{color:#F00;} /* Активный класс #1 */
a.act2{color:#0F0;} /* Активный класс #2 */
/* EndStyle */
</style>

HTML:

Code
<div id="msgText">
<a href="/1">Ссылка</a>
<a href="/2.html">Ссылка</a>
<a href="/?3">Ссылка</a>
</div>

<div id="msgText2">
<a href="/1">Ссылка</a>
<a href="/2.html">Ссылка</a>
<a href="/?3">Ссылка</a>
</div>

Текущие ссылки в блоке <div id="msgText"> - будут иметь класс «act», так как для него вызвана shineLinks('msgText','act'); и, соответственно, красными (color:#F00;), а в блоке <div id="msgText2"> - зелёными ... (color:#0F0;). По тем сходным причинам ... ヅ


Всё то же самое ... но, чуть-чуть по другому.

Код:

Code
$(document).ready(function(){
/*Start DocumentReady*/
var url=document.location.href;
 $.each($("#msgText a"),function(){
  if(this.href==url){$(this).addClass('act');};
 });
/*End DocumentReady*/
});

Где:

$(document).ready() - узнаём о готовности документа, то есть о том, что его объектная модель готова к использованию, обработке скриптом.

var url=document.location.href; - Объявляем переменную «url» и назначаем ей значение, равное текущему URL документа.

$.each($("#msgText a"),function() - ищем все элементы «а» в блоке «msgText» и назначаем им обработчик.

if(this.href==url){$(this).addClass('act');}; - если атрибут «href», текущей ссылки равен текущему URL документа, назначаем/добавляем ей класс «act».


Код и стили - те же.

«Живые» примеры наблюдаем вот здесь:

☑ Выделяем активные ссылки чистым JavaScript

☑ Выделяем активные при помощи jQuery

 

Думаю всё понятно ... ヅ
Если это  не так, и вам что-то не понятно - можете задать свой вопрос в комментариях (ниже).


И ещё, скрипты на чистом JS должны находиться ниже блока меню(блок с ID) ...
Для скриптов на JQ - это не существенно, т.к. прописан $(document).ready(); ...


P.S.

Всем удачи... ヅ
Flesh.





Источник: Как подсветить (выделить) активную ссылку (текущую). JavaScript + CSS + jQuery,скрипты для юКоз,uCoz
Категория: JS и JQ скрипты для uCoz | Добавил: likbezz (14.08.2010)
Просмотров: 42906 | Комментарии: 37 | Теги: CSS, ссылку, JavaScript, выделить, элемент, подсветить, активную, текущую, меню, юкоз
Всего комментариев: 371 2 3 »
0  
37  Ether [Материал[01.02.2014]

Как реализовать что-то подобное на ajax сайте (т.е если в ссылке содержатся якоря)?

0  
36  Bublik [Материал[28.07.2013]

Пытаюсь приделать к своему сайту. Пока не очень получается :(
У меня вопрос. Должны ли ссылки в меню быть абсолютными, типа http://www.сайт.ru/default.htm?
Я понял так, что с помощью document.location.href мы получаем адрес страницы, а затем сравниваем с найденными ссылками в блоке. И если найденная ссылка равна адресу страницы, то мы этой ссылке допишем css-класс. А что же делать если в меню ссылки относительные типа "../../page.htm"

0  
35  lelianata [Материал[21.07.2013]

А как подсветить пункт меню http://мойсайт/faq, если открыта страница http://мойсайт/faq/1 ?
На странице http://мойсайт/faq есть ссылки, переходя по ним нужно, чтобы пункт меню http://мойсайт/faq был активным.
Аналогичная ситуация с пунктом меню http://мойсайт/index и страницами http://мойсайт/index/abc, http://мойсайт/index/dfg...

Использую ваш код на jQuery

0  
34  cari [Материал[26.06.2013]

Здравствуйте!
На вордпрессе создали новый шаблон страниц. В новом шаблоне страниц добавлено ещё одно меню, но оно статическое. Нужно присвоить класс ссылке, ведущей на страницу на которой находишься, в этом статическом меню, чтобы выделить активную (текущую) ссылку. Пробовали через ваш jQuery, но ничего не получалось. Этот код можно применять к вордпрессу?

0  
33  Михаил [Материал[29.04.2013]

для меня актуален этот код:

<script type="text/javascript">
$(document).ready(function(){
var url=document.location.href;
$.each($("#column-left a"),function(){
if(this.href==url){$(this).addClass('actual');};
});
});
</script>

Но проблема в том, что мне нужно также оставлять выделенной ссылку на вложенных меню.. т.е. в интернет магазине - каталог открыв один из пунктов меню - показываются товары в этом разделе, и если выбрать отдельный товар ссылка будет уже не магазин.ру\каталог\раздел100500, а магазин.ру\каталог\раздел100500\товар17 и пункт меню уже не есть выделенный.. что дописать в скрипте, чтобы продолжение url также считалось активным?

0  
32  gorgona_m [Материал[16.04.2013]

Спасибо, все понятно, я так и сделала.
Я и вправду совсем новичок и конечно же проблема не в вашем решении задачи, а в том как я им воспользовалась:)
Но я уже "докопалась до истины":) и все работает как надо.
Еще раз спасибо за помощь.

0  
31  gorgona_m [Материал[15.04.2013]

Спасибо за ответ.
После предыдущего вашего коментария я поменяла решетки на ссылки но, к сожалению, это никак не изменило ситуацию.
Я использую дримвейвер и он выдает ошибку по текущему коду при попытке сохранить как шаблон, вот и пыталась найти эту ошибку.

0  
30  gorgona_m [Материал[14.04.2013]

Нет, никак. hover работает, а вот активные ссылки не подсвечиваются. Только когда обновить страницу - все стает красное. Но ведь не так задумано. Попоробовала проверить на validator.w3.org. Выдало 7 ошибок:
Line 11, Column 6: document type does not allow element "body" here
<body>
The element named above was found in a context where it is not allowed. This could mean that you have incorrectly nested elements -- such as a "style" element in the "body" section instead of inside "head" -- or two elements that overlap (which is not allowed).

One common cause for this error is the use of XHTML syntax in HTML documents. Due to HTML's rules of implicitly closed elements, this error can create cascading effects. For instance, using XHTML's "self-closing" tags for "meta" and "link" in the "head" section of a HTML document may cause the parser to infer the end of the "head" section and the beginning of the "body" section (where "link" and "meta" are not allowed; hence the reported error).

Line 12, Column 23: document type does not allow element "style" here
<style type="text/css">
The element named above was found in a context where it is not allowed. This could mean that you have incorrectly nested elements -- such as a "style" element in the "body" section instead of inside "head" -- or two elements that overlap (which is not allowed).

One common cause for this error is the use of XHTML syntax in HTML documents. Due to HTML's rules of implicitly closed elements, this error can create cascading effects. For instance, using XHTML's "self-closing" tags for "meta" and "link" in the "head" section of a HTML document may cause the parser to infer the end of the "head" section and the beginning of the "body" section (where "link" and "meta" are not allowed; hence the reported error).
Line 26, Column 24: character ";" not allowed in attribute specification list
for(var i=0;i<el.length; i++){

Line 26, Column 24: element "el.length" undefined
for(var i=0;i<el.length; i++){
You have used the element named above in your document, but the document type you are using does not define an element of that name. This error is often caused by:
incorrect use of the "Strict" document type with a document that uses frames (e.g. you must use the "Frameset" document type to get the "<frameset>" element),
by using vendor proprietary extensions such as "<spacer>" or "<marquee>" (this is usually fixed by using CSS to achieve the desired effect instead).
by using upper-case tags in XHTML (in XHTML attributes and elements must be all lower-case).
Line 32, Column 9: end tag for "el.length" omitted, but OMITTAG NO was specified
</script>

You may have neglected to close an element, or perhaps you meant to "self-close" an element, that is, ending it with "/>" instead of ">".

Line 26, Column 14: start tag was here
for(var i=0;i<el.length; i++){

Line 34, Column 7: end tag for "head" omitted, but OMITTAG NO was specified
</html>

You may have neglected to close an element, or perhaps you meant to "self-close" an element, that is, ending it with "/>" instead of ">".

Line 3, Column 1: start tag was here
<head>

Line 34, Column 7: end tag for "html" which is not finished
</html>

Most likely, you nested tags and closed them in the wrong order. For example <p><em>...</p> is not acceptable, as <em> must be closed before <p>. Acceptable nesting is: <p><em>...</em></p>

Another possibility is that you used an element which requires a child element that you did not include. Hence the parent element is "not finished", not complete. For instance, in HTML the <head> element must contain a <title> child element, lists require appropriate list items (<ul> and <ol> require <li>; <dl> requires <dt> and <dd>), and so on.
К сожалению английский мой очень не очень. Кое-что понятно (про стили из <body> в <head>. Остальное не понятно.
Так что я там где и начала: помогите пожалуйста разобратся!

0  
29  Анатолий [Материал[13.04.2013]

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

0  
28  nikotex [Материал[04.04.2013]

да, правильно, но мне надо чтобы когда человек допустим нажал и перешел на "Область" , то у него в главном меню было "Новости", а в подменю "Область" biggrin

1-10 11-20 21-26
Добавлять комментарии могут только зарегистрированные пользователи.
[ Регистрация | Вход ]