Я думаю, что ваша проблема возникает из-за неправильного понимания областей действия в JavaScript. (Мои извинения, если я ошибаюсь.)
function () {
for (...) {
var foo = ...;
$('<div>').click(function () { alert(foo); }).appendTo(...);
}
}
В JavaScript только функции создают новую область действия (обычно называемую closure ).
Таким образом, каждый раунд цикла for
будет знать один и тот же foo
, поскольку его область действия - function
, а не for
. Это также относится к определяемым событиям. К концу цикла каждый click
будет знать тот же foo
и будет знать, что это последнее значение, которое ему было присвоено.
Чтобы обойти это, создайте внутреннее закрытие с помощью немедленно выполняющейся анонимной функции:
function () {
for (...) {
(function (foo) {
$('<div>').click(function () { alert(foo); }).appendTo(...);
})(...);
}
}
Или, используя функцию обратного вызова, такую как jQuery.each
:
function () {
$.each(..., function (i, foo) {
$('<div>').click(function () { alert(foo); }).appendTo(...);
});
}
Для вашей проблемы, я бы пошел с последним (обратите внимание на изменения objects[x]
до просто object
):
var list;
jQuery.each(data.objects, function (x, object) {
// Clone the object list item template
var item = $("#object_item_list_template").clone();
// Setup the click action and inner text for the link tag in the template
var objectVal = object.Value;
item.find('a').click(function () { ShowObject(objectVal.valueOf(), 'T'); }).html(object.Text);
// add the html to the list
if (list == undefined)
list = item;
else
list.append(item.contents());
});