2012-03-17 28 views
1

这里是什么,我试图完成的基本思想,我有一个列表...有没有一种方法可以根据包含整数的最近属性来定位项目?

<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(); 

然后按键,与位置选择列表项属性最接近“位置”变量。我有道理吗?

如果有人可以帮助通过这个走我,我会很感激的,我迷路了

+0

520怎么样?你想要它选择510?或590?选择总是向前最接近?或者它也可能倒退? – 2012-03-17 07:11:39

+0

嗯,根据情况我想要做它向后或向前(基于向上箭头或向下箭头),但是,如果有人可以解释如何做到这一点,我敢肯定,我可以从中找出它那里。我只是没有模糊的想法如何实现,也就是选择一个具有与特定变量最接近的属性的项目。 – Ian 2012-03-17 07:19:03

+0

看到更新的答案http://stackoverflow.com/a/9748013/880434 – 2012-03-17 07:39:18

回答

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); 
+0

ooooh真棒,这看起来像我需要的东西的类型。我会稍微调整一下并回复你。感谢一堆答案。 – Ian 2012-03-17 07:33:54

1

我相信你可以做位置的阵列上的二进制搜索: 只需创建位置的数组通过“位置”属性进行排序,然后执行二进制搜索:

var positions = []; 
$("[position]").sort(function (a, b) { 
    return $(a).attr("position") - $(b).attr("position") 
}) 
.each(function() { 
    positions.push(parseInt($(this).attr("position"))); 
}); 
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... 
相关问题