Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/430.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/arduino/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript CSS height属性被for循环中最后计算的height参数覆盖_Javascript_Jquery_Html_Css - Fatal编程技术网

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

Javascript CSS height属性被for循环中最后计算的height参数覆盖,javascript,jquery,html,css,Javascript,Jquery,Html,Css,我编写了一个JQuery代码段,该代码段遍历JSON数组,并计算一个新的高度参数,该参数必须分配给要附加的列表项的CSS属性。 这里的问题是,为所有列表项指定了上次计算的高度。i、 e如果组[]={2,3},则高度正确计算为52和78。 但是被分配的css对于这两个列表项的值都是78 下面是代码片段: for(k=0; k<JSONObj.rackData[rackIdToBeDisplayed].groups.length; k++){ newHe

我编写了一个JQuery代码段,该代码段遍历JSON数组,并计算一个新的高度参数,该参数必须分配给要附加的列表项的CSS属性。 这里的问题是,为所有列表项指定了上次计算的高度。i、 e如果组[]={2,3},则高度正确计算为52和78。 但是被分配的css对于这两个列表项的值都是78

下面是代码片段:

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。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'});                  
}

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

在循环中,您正在设置应用于与rackBoxLi.list 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'});                  
}
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'});                  
}

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

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。

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

$'rackBoxLi.list'。追加'Device Added'

如果它们都具有相同的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'});                  
}

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

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'});                  
}
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');             
 }

由于要对多个元素使用规则,请改用类:

.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'});                  
}

正如怀特拉比回答的那样

从更改代码

 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'});                  
 }

希望这有帮助。

这看起来像是一个上下文问题。尝试在newHeight赋值之前添加一个var语句,并检查它是否有效:var newHeight=..,因为可能有许多元素与rackBoxLi.list匹配,您需要使用.each遍历它们,或者使用选择器匹配某个项目。您正在添加具有相同id的多个元素。您反复使用id listElement-这是无效的。id属性对于页面上的每个元素都必须是唯一的。@SpencerWieczorek注释更有意义。我只关注代码结构,而不是jQuery选择器。他关注的是独特的元素。制作一个CSS类实际上并不能让你达到目的。这很有效:非常感谢。我一开始不知道id必须是唯一的。您需要在最后一个选择器中执行'rackBoxLi.list listElement'+k。
 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'});                  
 }
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'});                  
 }
$('#rackBoxLi .list li').last().css({"height": newHeight + 'px'});