数组中的jquery对象是未定义的

时间:2013-10-24 00:53:18

标签: javascript jquery html

我正在创建大量随机div并将它们附加到正文中:

var cubes    = [], 
allCubes  = ''
for(var i = 0; i < 150; i++) {
    var randomleft = Math.floor(Math.random()*1000),
        randomtop = Math.floor(Math.random()*1000);
    allCubes += '<div id="cube'+i+'" style="position: absolute; border: 2px #000 solid; left: '+randomleft+'px; top: '+randomtop+'px; width: 15px; height: 15px;"></div>';
    cubes.push($('#cube'+i));
}
$('body').append(allCubes);

稍后我想在点击处理程序中选择一个特定的数组元素(如上所示为jquery对象):

 $('#trigger').click(function() { 
     console.log(cubes[1].attr('id'));
}); 

我扔了undefined。为什么呢?

3 个答案:

答案 0 :(得分:2)

因为您仅在稍后的时间点附加元素,所以您之前使用选择器创建一个jquery对象,该选择器将不提取任何内容(因为该元素尚未在DOM中)。而只是将id保存在数组中并稍后构造对象。

var cubes    = [], 
allCubes  = ''
for(var i = 0; i < 150; i++) {
    var randomleft = Math.floor(Math.random()*1000),
        randomtop = Math.floor(Math.random()*1000);
    allCubes += '<div id="cube'+i+'" style="position: absolute; border: 2px #000 solid; left: '+randomleft+'px; top: '+randomtop+'px; width: 15px; height: 15px;"></div>';
    cubes.push('#cube'+i); //just save the id
}
$('body').append(allCubes);

  $('#trigger').click(function() { 
      console.log(cubes[1]); 
      //create object as
      var $cube = $(cubes[1]);
  }); 

或做:

    var cubes  = []; 
    for(var i = 0; i < 150; i++) {
        var randomleft = Math.floor(Math.random()*1000),
            randomtop = Math.floor(Math.random()*1000);
        cubes.push($('<div id="cube'+i+'" style="position: absolute; border: 2px #000 solid; left: '+randomleft+'px; top: '+randomtop+'px; width: 15px; height: 15px;"></div>'));
    }
    $('body').append(cubes);

      $('#trigger').click(function() { 
          console.log(cubes[1].attr('id')); 
       }); 

<强> Demo

答案 1 :(得分:0)

PSL是对的。或者只是每次附加代码

randomtop = Math.floor(Math.random()*1000);
$('body').append('<div id="cube'+i+'" style="position: absolute; border: 2px #000 solid; left:    '+randomleft+'px; top: '+randomtop+'px; width: 15px; height: 15px;"></div>');
cubes.push($('#cube'+i));

答案 2 :(得分:0)

您正在尝试创建:

cubes.push($('#cube'+i));

#cubeX项目位于DOM之前,因此您创建并放入数组的jQuery对象中没有任何内容,因为在您创建自己的DOM时,它无法在DOM中找到#cubeX jQuery对象。

我建议你在添加的项目上添加一个公共类,并将代码更改为:

allCubes  = ''
for(var i = 0; i < 150; i++) {
    var randomleft = Math.floor(Math.random()*1000),
        randomtop = Math.floor(Math.random()*1000);
    allCubes += '<div id="cube'+ i + '" class="cube" style="position: absolute; border: 2px #000 solid; left: '+randomleft+'px; top: '+randomtop+'px; width: 15px; height: 15px;"></div>';
}
$('body').append(allCubes);

然后,只要你想获得所有立方体项目,你就可以使用它:

$(".cube")

并且您不需要将它们永久存储在数组中。只需在需要时获取它们。

如果您希望该属性不在第二个属性中,您可以执行以下操作:

$('#trigger').click(function() { 
     console.log($(".cube").eq(1).attr('id'));
});