CSS高度属性被for循环中的最后计算的高度参数覆盖

时间:2015-09-04 22:50:46

标签: javascript jquery html css

我编写了一个JQuery代码片段,它遍历JSON数组并计算出一个新的高度"必须分配给要追加的列表项的CSS属性的参数。 这里的问题是为所有列表项分配了最后计算的高度。即如果群组[] = {2,3},则高度正确计算为52和78。 但是,分配的css对于两个列表项都具有值78.

以下是代码段:

 print contact.getChildValue('tel',default = None, childNumber = 0)
 print contact.getChildValue('tel',default = None, childNumber = 1)

listElement的CSS如下 -

for(k=0; k<JSONObj.rackData[rackIdToBeDisplayed].groups.length; k++){                   
 newHeight = JSONObj.rackData[rackIdToBeDisplayed].groups[k] * 26;                  
 $('#rackBoxLi .list').append('<li id="listElement">Device Added</li>');
 $('#rackBoxLi .list #listElement').css({"height": newHeight + 'px'});                  
 }

7 个答案:

答案 0 :(得分:1)

在添加之前,直接将样式放在元素上;无论如何它会更快:

for(k=0; k<JSONObj.rackData[rackIdToBeDisplayed].groups.length; k++){                   
     newHeight = JSONObj.rackData[rackIdToBeDisplayed].groups[k] * 26;                  
     $('#rackBoxLi .list').append($("<li/>", {
       text: "Device Added",
       css: { height: newHeight + "px" }
     }));          
}

这样你根本不必进行DOM查找。

如同一直吟唱一样,不要在你添加的每个元素上加上相同的id。

答案 1 :(得分:1)

看起来每次在JavaScript中指定的ID都是相同的:

$('#rackBoxLi .list').append('<li id="listElement">Device Added</li>');

如果它们都具有相同的ID,则此选择器将匹配所有 时间:

$('#rackBoxLi .list #listElement').css({"height": newHeight + 'px'});

ID的要点是每个元素都是唯一的 - 这样您就可以选择一个ID并知道您只选择一个元素。要解决此问题,您可以更改它,以便它使用您的迭代器(k),以使它们完全不同:

for(k=0; k<JSONObj.rackData[rackIdToBeDisplayed].groups.length; k++){                   
 newHeight = JSONObj.rackData[rackIdToBeDisplayed].groups[k] * 26;                  

 //Notice that it's inserting k into the id, so that they'll all be different
 $('#rackBoxLi .list').append('<li id="listElement' + k + '">Device Added</li>');

 $('#rackBoxLi .list #listElement' + k).css({"height": newHeight + 'px'});                  
}

为了仍能在CSS文件中为它们提供相同的样式,您应该为它们提供相同的,如下所示:

for(k=0; k<JSONObj.rackData[rackIdToBeDisplayed].groups.length; k++){                   
 newHeight = JSONObj.rackData[rackIdToBeDisplayed].groups[k] * 26;                  

 //This way they'll all have the same class, but different IDs
 $('#rackBoxLi .list').append('<li class="listElement" id="listElement' + k + '">Device Added</li>');

 $('#rackBoxLi .list #listElement' + k).css({"height": newHeight + 'px'});                  
}

然后更改CSS以按类而不是ID引用它。

.listElement{
background-color: #0099CC;
border:1px dashed black;
border-radius: 5px;
width:180px;
margin-bottom: 5px;
}

答案 2 :(得分:1)

您不应对多个元素使用相同的ID。无需重新选择创建的项目。你可以这样做:

for(k=0; k<JSONObj.rackData[rackIdToBeDisplayed].groups.length; k++){                   
 newHeight = JSONObj.rackData[rackIdToBeDisplayed].groups[k] * 26;                  
 $('<li>Device Added</li>').css({ "height" : newHeight + 'px'}).appendTo('#rackBoxLi .list');             
 }

答案 3 :(得分:0)

我在这里看到的第一件事是你要在列表中添加多个项目,并为它们分配所有相同的ID。 ID应该只使用一次,而是尝试使用类。

关于你的问题,当你在JQuery中使用选择器时,它会抓取页面上符合你指定内容的所有元素。因此,每当你说“#rackBoxLi .list #listElement”时,它会抓取它找到的匹配的内容,这将是迄今为止添加的所有项目。尝试“#rackBoxLi .list #listElement:last”,它只会突出显示组中的最后一个元素,这将是最新添加的项目。

答案 4 :(得分:0)

在循环中设置CSS,该CSS应用于与#rackBoxLi匹配的所有元素.list #listElement

for(k=0; k<JSONObj.rackData[rackIdToBeDisplayed].groups.length; k++){                   
    newHeight = JSONObj.rackData[rackIdToBeDisplayed].groups[k] * 26;                  
    $('#rackBoxLi .list').append('<li id="listElement">Device Added</li>');
    $('#rackBoxLi .list #listElement').css({"height": newHeight + 'px'});                  
}

ID应该对每个元素都是唯一的,所以请尝试使用它。

for(k=0; k<JSONObj.rackData[rackIdToBeDisplayed].groups.length; k++){                   
    newHeight = JSONObj.rackData[rackIdToBeDisplayed].groups[k] * 26;                  
    $('#rackBoxLi .list').append('<li id="listElement'+k+'">Device Added</li>');
    $('#rackBoxLi .list #listElement'+k).css({"height": newHeight + 'px'});                  
}

答案 5 :(得分:0)

当您要对多个元素使用规则时,请改为使用类:

.listElement{
  background-color: #0099CC;
  border:1px dashed black;
  border-radius: 5px;
  width:180px;
  margin-bottom: 5px;
}

不是在创建元素之后找到元素(这就是为什么你找到的东西比你想要的多),创建元素并保持对它的引用:

for(k=0; k<JSONObj.rackData[rackIdToBeDisplayed].groups.length; k++){                   
  newHeight = JSONObj.rackData[rackIdToBeDisplayed].groups[k] * 26;                  
  var el = $('<li>').addClass('listElement').text('Device Added');
  $('#rackBoxLi .list').append(el);
  el.css({"height": newHeight + 'px'});                  
}

答案 6 :(得分:0)

正如whiterabbit25回答

更改代码
 for(k=0; k<JSONObj.rackData[rackIdToBeDisplayed].groups.length; k++){                   
 newHeight = JSONObj.rackData[rackIdToBeDisplayed].groups[k] * 26;                  
 $('#rackBoxLi .list').append('<li id="listElement">Device Added</li>');
 $('#rackBoxLi .list #listElement').css({"height": newHeight + 'px'});                  
 }

以下代码

for(k=0; k<JSONObj.rackData[rackIdToBeDisplayed].groups.length; k++){                   
 newHeight = JSONObj.rackData[rackIdToBeDisplayed].groups[k] * 26;                  
 $('#rackBoxLi .list').append('<li class="listElement">Device Added</li>');
 $('#rackBoxLi .list .listElement').eq(k).css({"height": newHeight + 'px'});                  
 }

如果您不想使用课程或ID,那么

for(k=0; k<JSONObj.rackData[rackIdToBeDisplayed].groups.length; k++){                   
 newHeight = JSONObj.rackData[rackIdToBeDisplayed].groups[k] * 26;                  
 $('#rackBoxLi .list').append('<li>Device Added</li>');
 $('#rackBoxLi .list li').eq(k).css({"height": newHeight + 'px'});                  
 }

如果.eq()不适合您,请使用.last()

$('#rackBoxLi .list li').last().css({"height": newHeight + 'px'});

希望这会有所帮助..