gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 00:25:48 26 4
gpt4 key购买 nike

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

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

我的问题是在单击其中一个列表项时获取其名称属性。

最佳答案

您遇到的是循环中异步 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

关于javascript - 如何从单击处理程序中的对象数组访问对象属性?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31498124/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com