0

我需要获得left一组元素的最大值,这些元素都具有一个left值,因为它们设置为绝对位置。我需要检索具有最高左值的元素,以便在我可以向该元素添加特定类之后。

window.load(function()
{
    $('.elements').each(function() 
    {
        var leftValue = $(this).offset().left;
    });
});
4

7 回答 7

3

所有的答案都忘记了一件事:他问的是左值最高的元素,而不是元素中的最大值。

所以:

window.load(function()
{
    var max = 0, $element;
    $('.elements').each(function()
    {
        if($(this).offset().left > max)
        {
            max = $(this).offset().left;
            $element = $(this);
        }
    }
}

最后,$element将具有左值最高的元素

于 2014-02-10T13:32:01.753 回答
1

您可以将它们添加到数组中,然后用于Math.max获取最大的数字。

var arr = [], max = 0, $elements = $('.elements');

$elements.each(function() {
  arr.push($(this).offset().left);
});

max = Math.max.apply(null, arr);

然后使用$.grep抓取相关元素。

var element = $.grep($elements, function (e) {
  return $(e).offset().left === max;
});

演示

于 2014-02-10T13:12:40.287 回答
1

您可以在内部window.load或任何需要的地方运行它:

var max = $('.elements').toArray().reduce(function(max, elem) {
    return Math.max(max, $(elem).offset().left || 0);
}, Number.NEGATIVE_INFINITY);

尽管您可以0在最后一行中使用而不是Number.NEGATIVE_INFINITY,但这样您也可以考虑可能的负值。

JSFiddle上的示例。


更新

正如@Eagle指出的那样,这与许多答案一样,错过了 OP 想要element,而不是实际size。更新的JSFiddle显示了对该技术的修改,以提供该技术。

var maxElem = $('.elements').toArray().reduce(function(curr, elem) {
    var left = $(elem).offset().left;
    return left > curr.val ? {elem: elem, val: left} : curr 
}, {elem: null, val: Number.NEGATIVE_INFINITY}).elem;
于 2014-02-10T13:25:51.770 回答
0
window.load(function(){

        var max = 0;
        $('.elements').each(function() {
            var leftValue = $(this).offset().left;
            if ( leftValue > max ) 
            {
               max = leftValue;
            }
        });

    });

max变量最高。

于 2014-02-10T13:11:04.573 回答
0

我知道没有max内置函数,但你可以

window.load(function(){
    var maxLeft = 0;

    $('.elements').each(function() {
        var leftValue = $(this).offset().left;
        if (leftValue > maxLeft) {
            maxLeft = leftValue;
        }
    });

    console.log(maxLeft);
});
于 2014-02-10T13:11:15.217 回答
0

您需要做的是将变量保留在each. 然后,您只需将您的价值与您找到的所有其他价值进行比较,并随时分配最高的价值。

window.load(function()
{
    var leftValue = 0;
    $('.elements').each(function() 
    {
        maxLeft = $(this).offset().left;
        if (maxLeft > leftValue) 
        {
            leftValue = maxLeft;
        }
    });
});
于 2014-02-10T13:12:49.253 回答
0

这里使用递归的替代方法:http: //jsfiddle.net/wared/Y762p/。请注意,您现在可以在不重新启动 fiddle 的情况下调整演示面板的大小。

var els = $('.elements').get();
var $el = mostLeft(els);

function mostLeft(list) {    
    var biggestLeft; // saves "left" to reduce calls to .offset()
    return function rec(list) {
        var sel, $el, left; // "sel" means "selection"
        if (list.length) {
            $el = $(list[0]);
            left = $el.offset().left;
            sel = rec(list.slice(1));
            if (!sel || left > biggestLeft) {
                biggestLeft = left;
                sel = $el;
            } 
            return sel;
        }
    }(list);    
};

与以前版本相比的变化:

  • 原始元素列表不再修改,因此可以重复使用,
  • 删除sel参数以防止错误使用和错误。
于 2014-02-18T13:30:28.297 回答