jQuery:有没有更好的方法来写这个?多个each()循环

时间:2011-03-28 15:26:17

标签: jquery

var currentTallest = 0;

if($j(".eachLateDeal").exists()){
  $j(this).children().find(".resultList").each(function(i){      
    if($j(this).height() > currentTallest){
      currentTallest = $j(this).height();
    }
});

  $j(this).children().find(".resultList").each(function(i){      
    if (!$j.support.minHeight){
      $j(this).css({'height': currentTallest + 5});
    }

    $j(this).css({'min-height': currentTallest});  
});      
}

更新: 在考虑了所有建设性意见之后,我提出了以下似乎按预期工作的内容:

$j.fn.equalHeights = function(px) {
$j(this).each(function(){
    var currentTallest = 0;
    var results;

if($j(".eachLateDeal").length){
  results = $j(".resultList", ".eachLateDeal");
}else{
  results = $j(this).children();
}

$j.each(results, function(){
  if($j(this).height() > currentTallest){
    currentTallest = $j(this).height();
  }
});

var cssProp = {};

if (!$j.support.minHeight){
  cssProp["height"] = currentTallest + 5;
}else{
  cssProp["min-height"] = currentTallest;
}

results.css(cssProp);
});

};

全部谢谢!

4 个答案:

答案 0 :(得分:1)

查看this answer您可以使用JavaScript Math对象为您获取最大值,这意味着您可以将所有功能包装到一个循环中:

$(document).ready(function() {

    Array.max = function( array ){
            return Math.max.apply( Math, array );
        };

    if($j(".eachLateDeal").length) {
        var heights= new Array();
        var resultLists = $j(this).children().find(".resultList");
        resultLists.each(function() {
            heights.push($j(this).height());
        });
        var max = Array.max(heights);
        var propertyName = 'min-height';
        if(!$.support.minHeight) {
            max = max + 5;
            propertyName = 'height';
        }
        resultLists.css(propertyName, max);
    }   
});

JSFiddle example here

答案 1 :(得分:0)

首先,如果你有一个exists()函数,那么如果你刚才这样做会更容易:

$j(".eachLateDeal").length

它几乎做同样的事情(不需要声明额外的功能)

第二

$j(this).children().find(".resultList").each(function(i){   

可以写成

$j(this).find(".resultList").each(function(i){   

因为find会查看所有它的后代

第三,为什么你需要两次进入循环?

答案 2 :(得分:0)

您的选择器的一个想法:使用“上下文”,它限制搜索的范围,而不是获取所有子项并查找返回的数据:

var oScope = $("selectorX");
$j(".resultList", oScope).each(function(i){ ...

答案 3 :(得分:0)

使用reduce,您可以将其简化为以下内容:

$.reduce = function(elems, callback, memo, arg) {
    for (var i = 0, length = elems.length; i < length; i++) {
        memo = callback(elems[i], i, memo, arg);
    }

    return memo;
};

$.fn.reduce = function(callback, memo) {
    return jQuery.reduce(this, function(elem, key, memo) {
        return callback.call(elem, elem, key, memo);
    }, memo);
};

if ($j(".eachLateDeal").length) {
    // get results
    var results = $j(this).children().find(".resultList");
    // reduce results to tallest height
    var currentTallest = results.reduce(function(val, i, memo) {
        var h = $j(this).height();
        return h > memo ? h : memo;
    }, 0);

    // set css properties
    var cssProp = {};
    if (!$j.support.minHeight) {
        cssProp["height"] = currentTallest + 5;
    } else {
        cssProp["min-height"] = currentTallest;
    }
    // set css of all elements at once.
    results.css(cssProp);
}