Дополнение — в математическом смысле слова — к «этому» в jQuery

#jquery #selector #this

#jquery #селектор #это

Вопрос:

Я создаю меню навигации таким образом, что при нажатии кнопки навигации он получает «выбранный» класс, в то время как этот класс одновременно удаляется из других кнопок. (Я также исчезаю на соответствующих страницах). Простой код:

 <html>
<head>
<script type="text/javascript" src="https://ajax.googleapis.com/ajax/libs/jquery/1.6.4/jquery.min.js"></script>
<style type="text/css">
ul li a.selected {font-weight:bold;}
div.page {position:absolute;}
</style>

<script type="text/javascript">
$(function(){
    $("div.page:not(:first)").hide();   // hide all pages except the home page

    $("ul li a").click(function(){
        var previous=window.location.hash;
        var selected=$(this).attr("href");
        if (previous != selected) {
            $("div.page" previous).fadeOut();
            $("div.page" selected).fadeIn();
            }
        $(this).addClass("selected")
        $("ul li a").not(this).removeClass("selected");
    });
});
</script>
</head>
<body>
<ul>
<li><a href="#home">Home</a></li>
<li><a href="#portfolio">Portfolio</a></li>
<li><a href="#contact">Contact</a></li>
</ul>
<div class="page" id="home">This is my home page.</div>
<div class="page" id="portfolio">This is my portfolio page.</div>
<div class="page" id="contact">This is my contact page.</div>
</body>
</html>
  

Хотя этот код действительно работает, я «эстетик кода» и не люблю вводить $ («ul li a») снова, ссылаясь на кнопки навигации; поскольку я уже ввел это в начале цепочки, кажется, я смогу получить его в общем виде без повторного ввода. По сути, я хочу выбрать относительное дополнение «this» в исходном выбранном наборе «ul li a». Есть ли общий способ сделать это?

Комментарии:

1. Вы имеете в виду $(this).siblings() ?

2. @mblase75: a они не являются братьями и сестрами друг друга.

Ответ №1:

Сохранение его в переменную:

 $elements = $("ul li a");
$elements.click(function(){
    // ...
    $elements.not(this).removeClass("selected");
});
  

Комментарии:

1. Привет, спасибо за ваши ответы! Ответ (на самом деле есть несколько более элегантных способов) довольно прост, ха-ха, но иногда вам нужен свежий взгляд 🙂

Ответ №2:

Вы могли бы (должны) кэшировать результат $('ul li a') в первый раз и использовать его во второй;

 var elements = $("ul li a").click(function(){
    var previous=window.location.hash;
    var selected=$(this).attr("href");
    if (previous != selected) {
        var previousId=previous.substring(1);   // remove the hash symbol
        var selectedId=selected.substring(1);
        $("div.page#" previousId).fadeOut();
        $("div.page#" selectedId).fadeIn();
        }
    $(this).addClass("selected")
    elements.not(this).removeClass("selected");
});
  

Ответ №3:

сначала удалите «выбранный» класс из всего, а затем добавьте его в $(this):

 $('.selected').removeClass('selected')
$(this).addClass('selected')
  

Таким образом, вы можете быть уверены, что не повлияете на какие-либо несвязанные ul> li> a…

Ответ №4:

Нет — если все остальные элементы не являются братьями и сестрами $(this) , то jQuery не может узнать, что содержал этот селектор, если вы не кэшируете его.

Кэширование — хорошая идея всякий раз, когда вы используете селектор более одного раза:

 var $sel = $("ul li a"); // cache
$sel.click(function(){
    // other code ...
    $sel.not(this).removeClass("selected");
});