Jquery找到最接近的元素

时间:2017-03-09 01:37:45

标签: javascript jquery html

像这样的是我的HTML代码:

<div class="single-img"></div>
<h4>The title</h4>
<h4>The title 2</h4>
<div class="single-img"></div>

<div class="single-img"></div>
<h4>The title 3</h4>
<h4>The title 4</h4>
<div class="single-img"></div>

然后jquery代码是这样的:

$("h4").mouseenter(function() {
    //Find the closest div.single-img and add class "hover";        
}).mouseleave(function() {
    //Find the closest div.single-img and remove class "hover";
});

我想要的是如果我将鼠标悬停在h4上它会找到更接近div.single-img并为其添加类,它可以是前一个div.single-img或下一个div.single-img。

例如,如果我将鼠标悬停在<h4>The title</h4>上,如果将类添加到前一个div.single-img,那么如果我将鼠标悬停在<h4>The title 2</h4>上,它会向下一个div.single-img添加一个类

我发现我不能使用.closest,因为它在树中而不是兄弟姐妹。

3 个答案:

答案 0 :(得分:0)

尝试$("h4").prev("div.single-img")

答案 1 :(得分:0)

这是一个示例,当您将鼠标悬停在关闭h4上时,该示例将突出显示带有蓝色的兄弟div中的文本。

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="utf-8">
    <meta name="viewport" content="width=device-width, initial-scale=1">
    <link rel="stylesheet" href="//code.jquery.com/ui/1.12.1/themes/base/jquery-ui.css">
    <style>
        .hover {
            color: blue
        }
    </style>
    <script src="https://code.jquery.com/jquery-1.12.4.js"></script>
    <script src="https://code.jquery.com/ui/1.12.1/jquery-ui.js"></script>
    <script>
        $(function() {
            $("h4").mouseenter(function() {
                //Find the closest div.single-img and add class "hover";
                if ($(this).next().hasClass('single-img')) {
                    $(this).next().addClass('hover');
                } else if ($(this).prev().hasClass('single-img')) {
                    $(this).prev().addClass('hover');
                }
            }).mouseleave(function() {
                //Find the closest div.single-img and remove class "hover";
                if ($(this).next().hasClass('single-img')) {
                    $(this).next().removeClass('hover');
                } else if ($(this).prev().hasClass('single-img')) {
                    $(this).prev().removeClass('hover');
                }
            });
        });
    </script>
</head>
<body>

<div class="single-img">Test Area 1</div>
<h4>The title</h4>
<h4>The title 2</h4>
<div class="single-img">Test Area 2</div>

<div class="single-img">Test Area 3</div>
<h4>The title 3</h4>
<h4>The title 4</h4>
<div class="single-img">Test Area 4</div>


</body>
</html>

答案 2 :(得分:0)

你可以使用jQuery的.index()找出父元素下面每个元素的位置,然后通过减去它们的索引来找到它们之间的距离。当你取绝对值Math.abs(...)时,它会忽略负号(因此无论它是在目标元素之前还是之后都无关紧要。)

然后只需排序并返回最短距离的元素。请参阅以下示例:

var findNearestSib = function(element){
    var t = $(element);
    var ind = t.index();
    var sibs = t.siblings('div.single-img'); // Filter out target siblings
    
    var closest = sibs.map(function(i,e){
        var cur = $(e).index(); // Index of current element
        return {
            dist: Math.abs(cur - ind), // Distance between sibling and h4
            elem: e
        };
    }).toArray().sort(function(a,b){
        return a.dist - b.dist; // Sort by shortest distance
    });
    
    if(closest.length){
        return closest[0].elem; // Return nearest element
    }
}
$("h4").mouseenter(function() {
    $(findNearestSib(this)).addClass('hover');
}).mouseleave(function() {
    $(findNearestSib(this)).removeClass('hover');
});
div.single-img {
    background-color:blue;
    height:12px;
    border:2px solid white;
}
div.single-img.hover {
    background-color:green;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script>
<div class="parent-div">
    <div class="single-img"></div>
    <h4>The title</h4>
    <h4>The title 2</h4>
    <div class="single-img"></div>

    <div class="single-img"></div>
    <h4>The title 3</h4>
    <h4>The title 4</h4>
    <div class="single-img"></div>
</div>