有没有办法根据包含整数的最近属性来定位项目?

时间:2012-03-17 06:50:13

标签: javascript jquery navigation scrolltop

这是我想要完成的基本想法,我有一个清单......

<ul>
<li position="400">Item 1</li>
<li position="510">Item 2</li>
<li position="590">Item 3</li>
<li position="614">Item 4</li>
</ul>

我想做的是根据数字选择最接近的项目。

如果我们的随机数是490,它会将“选定”类添加到列表项目2中。

但是我不知道怎么做,或者甚至可能......我这样做是为了导航,所以...

var position = $(window).scrollTop();

然后在按键上,选择列表项,其中position属性最接近“position”变量。我有道理吗?

如果有人能帮助我解决这个问题,我会很感激,我很失落

3 个答案:

答案 0 :(得分:2)

function selectClosest(val){
var diffs = [];
$("li[position]").each(function(){
    diffs.push(Math.abs(parseInt($(this).attr("position"))-val));
});
$("li[position]").eq(diffs.indexOf(Math.min.apply( Math,diffs))).css("font-weight","bold");
}

selectClosest(551);

答案 1 :(得分:1)

我相信你可以对一系列职位进行二元搜索: 只需创建一个位置数组,按“position”属性排序,然后进行二进制搜索:

var positions = [];
$("[position]").sort(function (a, b) {
    return $(a).attr("position") - $(b).attr("position")
})
.each(function () {
    positions.push(parseInt($(this).attr("position")));
}); 

答案 2 :(得分:0)

使用此帖Formal way of getting closest values in array in Javascript, given a value and a sorted array?上的解决方案,您可以执行以下操作:http://jsfiddle.net/elclanrs/phFUq/

var num = 600, // scroll number
    $li = $('li'),
    pos = [];

$li.each(function() {
    pos.push($(this).attr('position'));
});

function sortfunc(a, b) { // To sort `pos` array
    return a - b;
}
var getClosestValues = function(a, x) {
    var lo, hi;
    for (var i = a.length; i--;) {
        if (a[i] <= x && (lo === undefined || lo < a[i])) lo = a[i];
        if (a[i] >= x && (hi === undefined || hi > a[i])) hi = a[i];
    };
    return [lo, hi];
};

$('li[position=' + 
    getClosestValues(pos.sort(sortfunc), num)[0] + 
    ']').toggleClass('red'); // Or whatever...