如何使用jquery突出显示所选列表项?

Pau*_*aul 7 javascript jquery dom-manipulation

我在列表中有几个项目,并希望通过应用一些CSS样式,可能是背景颜色等突出显示用户点击的项目.

我的HTML看起来像这样:

<ul class="thumbnails">
    <li>
        <a href="#" class="thumbnail">
            <img class="giftthumb" src='thumb1.jpg' alt="">
            <span class="gifttitle">Thumb1</span>
        </a>    
    </li>
    <li>
        <a href="#" class="thumbnail">
            <img class="giftthumb" src='thumb2.jpg' alt="">
            <span class="gifttitle">Thumb3</span>
        </a>    
    </li>
    <li>
        <a href="#" class="thumbnail">
            <img class="giftthumb" src='thumb3.jpg' alt="">
            <span class="gifttitle">Thumb3</span>
        </a>    
    </li>
</ul>
Run Code Online (Sandbox Code Playgroud)

jQUery检索所选项目:

$('.thumbnail').click(function(e) {
    e.preventDefault();

    ???

})
Run Code Online (Sandbox Code Playgroud)

kap*_*apa 15

你可以使用jQuery的班级管理方法(即addClass()removeClass()在这种情况下)添加所选项目的一类,并从所有其他项目中删除同一类(如果你只想要一次一个选择).

//save class name so it can be reused easily
//if I want to change it, I have to change it one place
var classHighlight = 'highlight'; 

//.click() will return the result of $('.thumbnail')
//I save it for future reference so I don't have to query the DOM again
var $thumbs = $('.thumbnail').click(function(e) {
    e.preventDefault();
    //run removeClass on every element
    //if the elements are not static, you might want to rerun $('.thumbnail')
    //instead of the saved $thumbs
    $thumbs.removeClass(classHighlight);
    //add the class to the currently clicked element (this)
    $(this).addClass(classHighlight);
});
Run Code Online (Sandbox Code Playgroud)

然后在你的CSS中添加:

.highlight {
    background-color: cyan;
    font-weight: bold;
}
Run Code Online (Sandbox Code Playgroud)

jsFiddle演示

这是一个比直接从jQuery/Javascript(.css()例如方法)更改CSS属性更好的解决方案,因为关注点的分离将使您的代码更易于管理和读取.

  • @Paul我添加了一些评论来解释这一举动.`$ thumbs`基本上会保存`$('.thumbnail')`的结果,因为在jQuery中,大多数方法都会返回jQuery集合以允许链接.我这样做是因为在click处理程序中,我不必再次查询DOM来查找`.thumbnail`元素,我已经拥有了它们.如果元素正在改变(我的意思是添加/删除),所以不是静态的,不使用此方法,您应该再次查询DOM. (2认同)