javascript - 只能显示最后创建的对象的信息 |覆盖以前的

标签 javascript jquery arrays object

我有一个可以创建一些“房子”和“人”的系统。对我来说,下一步是我想显示有关我点击的房子的一些信息。但是,我只能访问有关最后创建的房屋的信息,而无法访问我单击的房屋的信息。

请参阅此处的图片:

enter image description here

右边的房子是我创建的最后一个房子。信息显示正确。但如果我点击第一个房子(左边的那个),我的信息不会改变。

我创建了一个JSFIDDLE在这里我们可以亲自尝试一下。

我猜我的问题出在 objHouse.click(function() 中的某个地方。我尝试了几种不同的方法。现在我尝试像这样定位它:

$('#BtnCreateHouse').click(function(){
oHouse = CreateHouseInMemory();
CreateHouseInLayout(oHouse);


});

function CreateHouseInMemory()
{
var oHouse = 
{
    "id":   "H"+GetRandomNumber(999, 999999999999),
    "StreetMame": $('#StreetName').val(),
    "Number": $('#Number').val(),
    "MaxPeople" : $('#MaxPeople select').val(),
    "aPeople": []
}
aHouses.push(oHouse);
console.log(oHouse); 
return oHouse;  
}

function CreateHouseInLayout()
// See JSFIDDLE, to much code to be posted here.


var objHouse = $('#' + oHouse.id)

objHouse.click(function(){
    $("#WindowDisplayHouseInfo").show();                            
    $('#ShowId').text("ID: " + oHouse.id);
    $('#ShowStreetName').text("Street Name: " + oHouse.StreetMame);
    $('#ShowNumber').text("Number: " + oHouse.Number);
    $('#ShowMaxInhabitants').text("Max inhabitants: " + oHouse.MaxPeople);

    for(var i = 0; i < oHouse.aPeople.length; i++)
    {
    $('#ShowInhabitants').html("<br />" + "Inhabitant: " + oHouse.aPeople.length 
                               +"<br />" + "ID: " + oHouse.aPeople[i].id
                               +"<br />" + "Name: " + oHouse.aPeople[i].Name
                               +"<br />" + "Last Name: " + oHouse.aPeople[i].Lastname
                               +"<br />" + "Age: " + oHouse.aPeople[i].Age
                               +"<br />" + "Gender: " + oHouse.aPeople[i].sGender
                               );
    }   

        $('.DeleteHouse').click(function()
        {
            $(objHouse).children().each(function(){
                $(this).appendTo($('#City')).css({"top":"" , "left":""});
            });

            $(objHouse).remove();                  
            $("#WindowDisplayHouseInfo").hide();
        });
}); 

我真的希望你们中的一个人能告诉我我做错了什么。我已经被困了好几个小时了。

更新

我发现如果我改变:

objHouse.click(function(){ 

$('.House').click(function(){ 

然后更改

$('#ShowId').text("ID: " + oHouse.id)

$('#ShowId').text("ID: " + this.id);

然后它将适用于 ID,但如果我 fx. write("街道名称:"+ this.StreetName);那么就不行了。知道为什么吗?

在此处更新了 JSFIDDLE:http://jsfiddle.net/Adnaves/pcVR6/2/

最佳答案

内部:

$('#BtnCreateHouse').click(function(){
oHouse = CreateHouseInMemory();
CreateHouseInLayout(oHouse);
});

您没有在函数作用域中定义 oHouse var,并且稍后在 CreateHouseInLayout 函数中您不使用传递的参数,而是使用之前的全局变量。因此,单击函数会在全局符号表中创建一个 oHouse 变量,稍后可以通过 CreateHourseInLayout 访问该变量,第一次可以正常工作,但第二次单击时,您将覆盖全局变量,并且第一个 house == 第二个 house房子。您需要做的是正确确定变量的范围:

$('#BtnCreateHouse').click(function(){
   var oHouse = CreateHouseInMemory(); // Create the house var locally and pass it to the other function
   CreateHouseInLayout(oHouse);
});

function CreateHouseInMemory() {
   var oHouse = {
    "id":   "H"+GetRandomNumber(999, 999999999999),
    "StreetMame": $('#StreetName').val(),
    "Number": $('#Number').val(),
    "MaxPeople" : $('#MaxPeople select').val(),
    "aPeople": []
   };
   aHouses.push(oHouse);
   console.log(oHouse); 
   return oHouse;  
}

function CreateHouseInLayout(oHouse) { // use the passed house object
   var objHouse = $('#' + oHouse.id)

   objHouse.click(function(){
     $("#WindowDisplayHouseInfo").show();                            
     $('#ShowId').text("ID: " + oHouse.id);
     $('#ShowStreetName').text("Street Name: " + oHouse.StreetMame);
     $('#ShowNumber').text("Number: " + oHouse.Number);
     $('#ShowMaxInhabitants').text("Max inhabitants: " + oHouse.MaxPeople);

     for(var i = 0; i < oHouse.aPeople.length; i++) {
       $('#ShowInhabitants').html("<br />" + "Inhabitant: " + oHouse.aPeople.length 
                               +"<br />" + "ID: " + oHouse.aPeople[i].id
                               +"<br />" + "Name: " + oHouse.aPeople[i].Name
                               +"<br />" + "Last Name: " + oHouse.aPeople[i].Lastname
                               +"<br />" + "Age: " + oHouse.aPeople[i].Age
                               +"<br />" + "Gender: " + oHouse.aPeople[i].sGender
                               );
     }
     $('.DeleteHouse').click(function() {
            $(objHouse).children().each(function(){
                $(this).appendTo($('#City')).css({"top":"" , "left":""});
            });

            $(objHouse).remove();                  
            $("#WindowDisplayHouseInfo").hide();
     });
   });
}

请记住,现在使用 CreateHouseInLayout 方法,oHouse 变量是本地变量,并且在该方法中创建的所有函数都可以访问它。因此,您的 objHouse.click(function(){}) 也可以访问该本地副本并将显示正确的信息。其中 objHouse 是代表该特定房屋的单个元素。如果您像在 JSFIDDLE 示例中那样使用 $('.House').click() ,则将回调绑定(bind)到所有元素,但使用单个 oHouse 对象,因此它们都将显示相同的信息(即使用 objHouse 方法)。

关于javascript - 只能显示最后创建的对象的信息 |覆盖以前的,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19366696/

相关文章:

javascript - 如何在同一模型的同一MVC页面上重用表单?

php - 从 PHP 中的多维数组中删除重复数组

javascript - 覆盖在 iframe 中加载的外部页面的 getFocus

jquery - jcrop - 中心的默认裁剪选择

javascript - jQuery 验证 : Validate dynamicly generated fields only on the first field

javascript - JS 或 JQuery - 将数据推送到二维数组?

java - 构造函数调用数组创建

JavaScript:使用 onClick 更改图像的功能不起作用。

javascript - 在 dagre-d3 中拖动节点时缺少结束箭头

javascript - 使用 js 数组为 Leaflet 标记创建弹出内容