Как добавить класс (активный) на конкретный "ли" на клик пользователя с помощью jQuery
У меня есть меню с определенными элементами, и я хочу, когда пользователь нажимает на любой ли, чем только его класс становится активным классом. У меня есть пункты меню, например:
<ul class="nav">
<li class="dropdown active">
<asp:HyperLink ID="hlHome" runat="server" href="Default.aspx">Home</asp:HyperLink>
</li>
<li class="dropdown">
<asp:HyperLink runat="Server" cssClass="dropdown-toggle" data-toggle="dropdown" data-hover="dropdown" data-delay="0" data-close-others="false" href="#">
Register
<i class="icon-angle-down"></i>
</asp:HyperLink>
<ul class="dropdown-menu">
<li><asp:HyperLink runat="server" ID="hlCreateAccount" href="register.aspx">Create Account</asp:HyperLink></li>
<li><asp:HyperLink runat="Server" href="forgot.aspx" ID="hlForgot">Forgot Credentials ?</asp:HyperLink></li>
<li><asp:HyperLink runat="server" href="blocked.aspx" ID="hlBlockedAccount">Blocked Account</asp:HyperLink></li>
<li><asp:HyperLink ID="hlUnblockAccount" href="unblock.aspx" runat="server">Unblock Account</asp:HyperLink></li>
</ul>
</li>
<li><asp:HyperLink ID="hlBug" runat="server" href="bug.aspx">Report A Bug</asp:HyperLink></li>
<li><asp:HyperLink ID="hlContact" runat="server" href="contact.aspx">Contact Us</asp:HyperLink></li>
</ul>
И я пробовал следующий код с jQuery:
<script type="text/javascript">
function pageLoad() {
var loc = window.location.href.split('/');
var page = loc[loc.length - 1];
$('ul.nav a').each(function (i) {
var href = $(this).attr('href');
if (href.indexOf(page) !== -1) {
$('ul.nav li.active').removeClass('active');
$(this).parent().addClass('active');
}
});
}
Не работает с выпадающими меню во время работы со всеми другими меню, не имея ниспадающих элементов. Как я могу изменить код, который он тоже работает, с пунктом меню с выпадающим списком элементов. Я также использую панель обновления на своей странице.
Ответы
Ответ 1
Вы указали как jQuery, так и Javascript в тегах, поэтому оба подхода.
JQuery
var selector = '.nav li';
$(selector).on('click', function(){
$(selector).removeClass('active');
$(this).addClass('active');
});
Fiddle: http://jsfiddle.net/bvf9u/
Чистый Javascript:
var selector, elems, makeActive;
selector = '.nav li';
elems = document.querySelectorAll(selector);
makeActive = function () {
for (var i = 0; i < elems.length; i++)
elems[i].classList.remove('active');
this.classList.add('active');
};
for (var i = 0; i < elems.length; i++)
elems[i].addEventListener('mousedown', makeActive);
Fiddle: http://jsfiddle.net/rn3nc/1
jQuery с делегированием событий:
Обратите внимание, что в подходе 1 обработчик напрямую связан с этим элементом. Если вы ожидаете обновления DOM и нового li
для ввода, лучше использовать делегирование событий и делегировать следующий элемент, который останется статичным, в этом случае .nav
:
$('.nav').on('click', 'li', function(){
$('.nav li').removeClass('active');
$(this).addClass('active');
});
Fiddle: http://jsfiddle.net/bvf9u/1/
Тонкая разница заключается в том, что обработчик привязан к .nav
сейчас, поэтому, когда вы нажимаете li
, событие выдает пузырьки DOM в .nav
, который вызывает обработчик, если элемент, нажавший, соответствует вашему selector
аргумент. Это означает, что новым элементам не нужен новый обработчик, связанный с ними, поскольку он уже привязан к предку.
Это действительно интересно. Подробнее об этом читайте здесь: http://api.jquery.com/on/
Ответ 2
$(document).ready(function () {
$('.dates li a').click(function (e) {
$('.dates li a').removeClass('active');
var $parent = $(this);
if (!$parent.hasClass('active')) {
$parent.addClass('active');
}
e.preventDefault();
});
});
Ответ 3
//Напишите метод javascript для привязки события click для каждого элемента "li"
function BindClickEvent()
{
var selector = '.nav li';
//Removes click event of each li
$(selector ).unbind('click');
//Add click event
$(selector ).bind('click', function()
{
$(selector).removeClass('active');
$(this).addClass('active');
});
}
//сначала вызовите этот метод, когда первый раз при загрузке страницы
$( document ).ready(function() {
BindClickEvent();
});
//Вызов метода BindClickEvent со стороны сервера
protected void Page_Load(object sender, EventArgs e)
{
ScriptManager.RegisterStartupScript(Page,GetType(), Guid.NewGuid().ToString(),"BindClickEvent();",true);
}
Ответ 4
Немного отключив тему, но придя сюда при разработке приложения Angular2, я хотел бы поделиться тем, что Angular2 автоматически добавляет класс "router-link-active" к активным ссылкам маршрутизатора, таким как этот:
<li><a [routerLink]="['Dashboard']">Dashboard</a></li>
Таким образом, вы можете легко создавать такие ссылки с помощью CSS:
.router-link-active {
color: red;
}
Ответ 5
// Remove active for all items.
$('.sidebar-menu li').removeClass('active');
// highlight submenu item
$('li a[href="' + this.location.pathname + '"]').parent().addClass('active');
// Highlight parent menu item.
$('ul a[href="' + this.location.pathname + '"]').parents('li').addClass('active')