jQuery - 根据属性值创建元素组

标签 jquery

我正在尝试找出基于公共(public)属性创建元素组的最佳方法。显然我可以将它们一一比较并最终得到正确的结果,但我确信还有更好的方法。

所以,我基本上为我的 div 分配了 4 种类型的属性:顶部位置、左侧位置、宽度和底部位置。我有 4 个 div,我将它们分配给它们(但 4 将来可能会更大)。

zones = 4;
for (x = 1; x<=zones ; x++)
    {
        $('#zone'+x).attr('data-top',Math.floor($('#zone'+x).position().top));
        $('#zone'+x).attr('data-bottom',Math.floor($('#zone'+x).position().top) + $('#zone'+x).height());
        $('#zone'+x).attr('data-left',Math.floor($('#zone'+x).position().left));
        $('#zone'+x).attr('data-width',$('#zone'+x).width());
    }   

这样我最终会得到这样的结果:

<div id="zone2" data-top="976" data-bottom="2579" data-left="131" data-width="660">...</div>

现在我面临的挑战是根据具有共同 data-top 值的所有 div 创建元素组。简单的解决方案就是将所有 data-top 相互比较,虽然只有 4 个 div 来比较还可以管理,但如果 div 数量增加,很快就会变得一团糟。

问题1:如何为公共(public)属性值分配组?

我最终想要得到的是:

<div id="zone2" data-top="976" data-bottom="2579" data-left="131" data-width="660" data-group="1">...</div>

对于具有相同 data-top 值的所有 div,data-group 将等于 1。如果有多个组共享共同的数据顶部值,那么我需要增加数据组。我最终可能会得到这样的结果:

<div id="zone1" data-top="976" data-bottom="2379" data-left="131" data-width="660" data-group="1">...</div>
<div id="zone2" data-top="976" data-bottom="2579" data-left="131" data-width="660" data-group="1">...</div>
<div id="zone3" data-top="1500" data-bottom="2479" data-left="131" data-width="660" data-group="2">...</div>
<div id="zone3" data-top="1500" data-bottom="3579" data-left="131" data-width="660" data-group="2">...</div>

问题2:如何找到组内的最大值?

正确设置组后,我应该如何继续找到最大数据底部值?在上面的示例中,data-group=1 的最大 data-bottom 值为 2579,data-group=2 的最大 data-bottom 值为 3579

我想过使用 .each 并在 .each 中比较值,它最终有效,但代码非常长。

最佳答案

我建议采用这种方法( FIDDLE )

首先,为每个元素设置一个数据属性(data-zone)。然后迭代元素并调用 getTopGroup() 函数来检查该组是否存在并分配 data-group-top 属性。

HTML

<div class="zone1" data-zone="1">Zone 1</div>
<div class="zone2" data-zone="2">Zone 2</div>
<div class="zone3" data-zone="3">Zone 3</div>
<div class="zone4" data-zone="4">Zone 4</div>
<div class="zone1" data-zone="1">Zone 1</div>
<div class="zone2" data-zone="2">Zone 2</div>
<div class="zone3" data-zone="3">Zone 3</div>
<div class="zone4" data-zone="4">Zone 4</div>

jQuery

// Create a blank array of groups
var groupsTop = [];

var getTopGroup = function(top) {
  var group = 1;
  var groupIndex = $.inArray(parseInt(top), groupsTop);      
  if (groupIndex == -1) {
    groupsTop.push(top);
    return groupsTop.length;
  } else {
    return groupIndex + 1;
  }
};

$('[class^=zone]').each(function() {
    var elem = $(this);
  var x = elem.attr('data-zone');
  var top = 10* x;
  var topGroup = getTopGroup(top);
  // This is an example calculation of offsets
  elem.attr({
    'data-top': top,
    'data-bottom': 5 * x,
    'data-left': 3 * x,
    'data-width': 6 * x,
    'data-group-top': topGroup
  });
});

您也可以使用相同的逻辑来实现对其他数据属性的检查。

关于jQuery - 根据属性值创建元素组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37255989/

相关文章:

jQuery AutoComplete,自定义返回数据

javascript - 棋盘图片标签变为图片

jquery - 如何使 Jquery Mobile 1.3 ListView(仅)从右到左(R2L)?

jquery - 如何将 jQuery 的动画过渡从线性更改为二次

javascript - 如何在页面加载和事件上执行相同的代码?

javascript - 将 JSON 字符串转换为日期

jquery - 请求回调状态 'textStatus'

javascript - 如何通过onclick函数点击图片来输入密码?

javascript - 检测加载的 Pixi Canvas 图像

javascript - 在 asp.net mvc 中提交 Ajax.BeginForm 后 jQuery 代码无法正常工作