选择多个元素height();

时间:2016-02-22 11:43:45

标签: javascript jquery

嘿伙计们,我只是想知道为什么这个jQuery不能工作:

hdr = $('.header-wrapper, #top-bar, #new-showroom-header').height();

因此,您可以看到我正在尝试获取多个元素的高度并将它们全部存储在我的变量中。我希望jQuery将所有元素高度添加到一起以创建最终值,但是当我在console.log中变量hdr时,我得到第一个元素的高度。

知道如何选择全部并将它们存储到我的var中吗?

谢谢,尼克

3 个答案:

答案 0 :(得分:4)

使用$.each()获取身高总和。

var hdr = 0;
$('.header-wrapper, #top-bar, #new-showroom-header').each(function () {
    hdr += $(this).height();
});

FIDDLE DEMO

答案 1 :(得分:1)

您可以为此方案编写jQuery插件。 :)

以下代码将根据提供的选择器返回一个高度数组。

[20,30,80]

jQuery插件

(function($) {
  $.fn.heights = function() {
    return this.map(function() {
    	return $(this).height();
    }).toArray();
  };
}(jQuery));

var heights = $('.header-wrapper, #top-bar, #new-showroom-header').heights();

document.body.innerHTML = JSON.stringify(heights); // [20,30,80]
body                 { font-family: monospace; white-space: pre; }
.header-wrapper      { height: 20px; }
#top-bar             { height: 30px; }
#new-showroom-header { height: 80px; }
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script>

<div class="page-wrapper">
  <div class="header-wrapper"></div>
  <div id="top-bar"></div>
  <div id="new-showroom-header"></div>
</div>

或者,您可以构建一个高度缓存及其选择器。

{
  "html>body>div>.header-wrapper": 20,
  "html>body>div>#top-bar": 30,
  "html>body>div>#new-showroom-header": 80
}

(function($) {
  $.reduce = function(arr, fn, initVal) {
    if (Array.prototype.reduce) { return Array.prototype.reduce.call(arr, fn, initVal); }
    $.each(arr, function(i, val) { initVal = fn.call(null, initVal, val, i, arr); });
    return initVal;
  };
  $.fn.heights = function() {
    return $.reduce(this, function(map, el) {
      map[$(el).fullSelector()] = $(el).height();
      return map;
    }, {});
  };
  $.fn.fullSelector = function() {
    var sel = $(this)
      .parents()
      .map(function() { return this.tagName.toLowerCase(); })
      .get()
      .reverse()
      .concat([this.nodeName])
      .join(">");
    var id = $(this).attr('id'); if (id) { sel += '#' + id; };
    var cls = $(this).attr('class'); if (cls) { sel += '.' + $.trim(cls).replace(/\s/gi, '.'); };
    return sel;
  }
}(jQuery));

var heights = $('.header-wrapper, #top-bar, #new-showroom-header').heights();

document.body.innerHTML = JSON.stringify(heights, null, 2);
body                 { font-family: monospace; white-space: pre; }
.header-wrapper      { height: 20px; }
#top-bar             { height: 30px; }
#new-showroom-header { height: 80px; }
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script>

<div class="page-wrapper">
  <div class="header-wrapper"></div>
  <div id="top-bar"></div>
  <div id="new-showroom-header"></div>
</div>

selector algorithm的信用额转到Jesse Gavin

答案 2 :(得分:0)

不,你不能使用.height()获得所有元素高度;功能 首先在集合中应用$ .each()循环,然后逐个获得高度 以下代码可以帮助您

$.each($('.header-wrapper, #top-bar, #new-showroom-header'),function(ind,item){
 var Height = $(item).height();
});