如何从点击处理程序中的对象数组访问对象属性?

时间:2015-07-19 04:54:37

标签: javascript arrays object object-properties

我已经创建了一些对象构造函数的实例,我将它放入一个数组中并循环显示到一个列表中。现在我想从该列表中选择一个名称属性,以便在onclick事件处理程序中使用(此代码中未显示)。我想知道如何在单击处理程序中访问name属性。这是我到目前为止所尝试的,但我一直在不确定。

console.log(contactarray[i].name);
console.log(contactarray.name);

$(document).ready(function() {

function ContactList (name, email, number,address) {
    this.name = name;
    this.email = email;
    this.number = number;
    this.address = '6539 Wilton Ave Culver City CA 90234';
}

var christian = new ContactList('Christian', 'christian@example.com', '323-555-124');
var rich = new ContactList('Rich', 'rich@example.com', '323-555-124');
var scott = new ContactList('Scott', 'scott@example.com', '323-555-124');
var danny = new ContactList('Danny', 'danny@example.com', '323-555-124');
var taka = new ContactList('Taka', 'taka@example.com', '323-555-124');
var tim = new ContactList('Tim', 'tim@example.com', '323-555-124');
var patrick = new ContactList('Patrick', 'patrick@example.com', '323-555-124');
var jacques = new ContactList('Jacques', 'jacques@example.com', '323-555-124');

var contactarray = [christian, rich, scott, danny, taka, tim, patrick, jacques];

for (i = 0; i < contactarray.length; i++) {
    $('#contacts').append('<li class="itemname" id="'+i+'"><a href="#">' + contactarray[i].name + '</a></li>');
}

我的问题是在点击列表项时可以访问其中一个列表项的名称属性。

3 个答案:

答案 0 :(得分:3)

您遇到的是循环中异步JavaScript事件的典型问题。这在你的问题中并不明显,因为它在任何地方都没有click处理程序,但是随后的评论显而易见。始终在问题中提供足够的信息以重现实际问题。简化的代码很好,但是当基本问题区域被简化时就不行了!

最简单的解决方案是为每个循环迭代调用一个函数。每次调用一个函数时,它都会创建一个“闭包”,它捕获该函数中的所有参数和局部变量,即使对于稍后调用的click处理程序等异步代码也是如此。

由于您正在使用jQuery,您可以使用$.each()执行此操作,或者您可以在for循环中创建并调用自己的函数,只要您为每个循环调用它迭代。

这是一个有效的解决方案。我还通过将联系人项直接放在数组中而不是为每个创建一个命名变量来简化您的代码。我将ContactList构造函数的名称更改为ContactItem,因为它代表的是单个项目,而不是列表:

function ContactItem( name, email, number,address ) {
    this.name = name;
    this.email = email;
    this.number = number;
    this.address = '6539 Wilton Ave Culver City CA 90234';
}

var contactarray = [
    new ContactItem('Christian', 'christian@example.com', '323-555-124'),
    new ContactItem('Rich', 'rich@example.com', '323-555-124'),
    new ContactItem('Scott', 'scott@example.com', '323-555-124'),
    new ContactItem('Danny', 'danny@example.com', '323-555-124'),
    new ContactItem('Taka', 'taka@example.com', '323-555-124'),
    new ContactItem('Tim', 'tim@example.com', '323-555-124'),
    new ContactItem('Patrick', 'patrick@example.com', '323-555-124'),
    new ContactItem('Jacques', 'jacques@example.com', '323-555-124')
];

var $contacts = $('#contacts');

$.each( contactarray, function( i, contact ) {
    var $contact = $(
        '<li class="itemname" id="' + i + '">' +
            '<a href="#">' + contact.name + '</a>' +
        '</li>'
    );
    $contact.click( function() {
        alert( contact.name );
    }).appendTo( $contacts );
});

Updated fiddle

答案 1 :(得分:-1)

尝试替换

for (i = 0; i < contactarray.length; i++) {
    $('#contacts').append('<li class="itemname" id="'+i+'"><a href="#">' + contactarray[i].name + '</a></li>');
}

contactarray.forEach(function(contact, id) {
    $('#contacts').append('<li class="itemname" id="'+id+'"><a href="#" onclick="alert(' + contact.name + ')">' + contact.name + '</a></li>');
});

答案 2 :(得分:-1)

function ContactList (name, email, number,address) {
    this.name = name;
    this.email = email;
    this.number = number;
   this.address = '6539 Wilton Ave Culver City CA 90234';
}

window.onload = function() 
{
     var christian = new ContactList('Christian', 'christian@example.com','');
     var rich = new ContactList('Rich', 'rich@example.com', '323-555-124');
     var scott = new ContactList('Scott', 'scott@example.com', '323-555-');
     var contactarray = [christian, rich, scott];

     var btn = document.getElementById('btn');  

     btn.addEventListener('click',function(){
          for (i = 0; i < contactarray.length; i++) {
         $('#contacts').append('<li class="itemname" id="'+i+'"><a  href="#">' + contactarray[i].name + '</a></li>');
      }
     },false);

}
相关问题