Я делаю простой запрос ajax, который извлекает список значений переменной длины в виде данных JSON. Я пытаюсь создать список, основанный на этих данных, который имеет функции щелчка, основанные на значениях, которые я получил из запроса JSON. Я могу сделать эту работу очень хорошо, написав onClick-методы в HTML, как это:
function loadFooList() {
var list_area = $("#sidebar");
list_area.html("<ul>")
$.ajax({
type: 'GET',
url:'/data/foo/list',
dataType: 'json',
success: function (json) {
$.each(json, function(i, item) {
var link_id = "choosesfoo" + item.id;
list_area.html(list_area.html()
+ "<li> <a href='#' onClick='alert(\"" +
link_id + "\");'>" +
item.name + "</a></li>");
});
list_area.html(list_area.html() + "</ul>");
}
});
}
Мне не нравится писать onClick-функцию в HTML, и я также хочу узнать, как создать эту же функцию с помощью JQuery click-function.
Так что проблема, очевидно, в переменной области видимости. Моя наивная попытка здесь, очевидно, не сработает, потому что переменные больше не существуют, когда происходит щелчок:
function loadFooList2() {
var list_area = $("#sidebar");
var link_ids = Array();
list_area.html("<ul>")
$.ajax({
type: 'GET',
url:'/data/foo/list',
dataType: 'json',
success: function (json) {
$.each(json, function(i, item) {
var link_id = "choosefoo" + item.id;
list_area.html(list_area.html()
+ "<li> <a href='#' id='" + link_id + "'>"+item.name+"</a></li>");
link_ids.push(link_id);
});
list_area.html(list_area.html() + "</ul>");
for (link_index=0; link_index<link_ids.length; link_index++) {
$("#" + link_ids[link_index]).click(function() {
alert(link_ids[i]);
});
}
}
});
}
Очевидно, что я хотел бы сделать что-то еще, кроме как просто предупредить значение, но сигнал тревоги есть, пока я могу заставить это работать и двигаться вперед.
Я понимаю, что мне придется создать некую функцию-обработчик, которой я передаю переменную состояния. Это работает для одного значения (я могу прекрасно хранить весь массив link_ids, но тогда я не знаю, какое из них является правильным значением для этой ссылки), но как мне это сделать для списков произвольной длины?
Вот пример из документации JQuery , который я пытаюсь скопировать:
// get some data
var foobar = ...;
// specify handler, it needs data as a paramter
function handler(data) {
//...
}
// add click handler and pass foobar!
$('a').click(function(){
handler(foobar);
});
// if you need the context of the original handler, use apply:
$('a').click(function(){
handler.apply(this, [foobar]);
});
И я прошу последний пример здесь, «если вам нужен контекст оригинального обработчика ...», вероятно, это то, что я хочу, но я не знаю точно, как туда добраться. Я пытался сохранить текущее значение link_id в this , использовать его из this в примененной функции (используя apply ()), но мне это не удалось. Необходимые значения были еще не определены в соответствии с FireFox. Я использую JQuery 1.3.2.
Так, каково правильное решение для этой относительно основной проблемы?