Андрей К.
1172 повідомлення
#15 років тому
В 4х-уровневом каталоге реализую раскрытие 4-й ветви через аякс. Сюда приводить весь код не буду, только часть цикла:

var div = document.getElementById('div_'+section);
for(var i = 0; i < response.length; i++) {
var temp = document.createElement('input');
temp.id='products_subsections+']';
temp.type = 'checkbox';
temp.onclick = function(){ alert(response) };
div.appendChild(temp);
}


Подскажите, как сделать так, чтобы значение, которое выдает alert фиксировалось? Т.е. если в момент прохода цикла response равнялось скажем "значение", то независимо от последующих изменений response или i всегда выдавалось "значение".
Андрей К.
1172 повідомлення
#15 років тому
После того как цикл закончится, функция завершит свое выполнение и response вообще перестанет существовать. И при событии onclick огребём undefined.
Дмитрий Засядько
87 повідомлень
#15 років тому
А если присваивать необходимое значение какому-нибудь свойсту элемента DOM? Ну или через замыкание работать, чтобы переменная для onclick локально сохранялась.
Андрей К.
1172 повідомлення
#15 років тому
Примерно так сейчас костыль и сделал в виде

temp.onclick=function(e) {
if(!e) e=window.event;
var id=e.target.id.split('.split(']');
alert(id);
};

Но конструкция нечитабельная, а менять id нельзя, т.к. цифровые значения элементов одного уровня не уникальны относительно других уровней.
Дмитрий Засядько
87 повідомлень
#15 років тому
Да уж, запутанно. А может стоит попробовать так?

temp.onclick = (function() {
var resp = response;
return function() {
alert(resp);
}
})();
Андрей К.
1172 повідомлення
#15 років тому
1) response будет undefined
2) () в конце функции сразу запустит ее на исполнение
3) resp внутри внутренней функции будет undefined

onclick-то должен обрабатываться именно при щелчке, а не сразу.
Дмитрий Засядько
87 повідомлень
#15 років тому
Странно, а вроде бы должно было создаться замыкание. Тут же принцип такой, как и в коде

function CreateClick(response) {
return function() {
alert(response);
}
}
temp.onclick = CreateClick(response);


То есть в функции, возвращаемой функцией CreateClick(response), создаётся замыкание и переменная response становится локальной и недоступной извне.
Андрей К.
1172 повідомлення
#15 років тому
Смысл в том, что когда происходит щелчок на элементе, response уже не существует. Т.е. последняя строка равносильна temp.onclick = CreateClick(undefined);
Я понимаю, что задача не тривиальная, что можно обойтись получением id элемента как я это сделал, но хотелось бы более изящного решения.
Дмитрий Засядько
87 повідомлень
#15 років тому
Вы пробовали этот код или просто предполагаете? Переменная через замыкание должна сохраняться до тех пор, пока на неё сохраняется ссылка из функции, созданной функцией CreateClick и сохранённой в переменной temp.onclick. По крайней мере так это должно работать.
Андрей К.
1172 повідомлення
#15 років тому
Ваш код отправляет функцию на исполнение немедленно. Зачем его пробовать?
Дмитрий Засядько
87 повідомлень
#15 років тому
Ну может быть затем, что функция, отправляемая на исполнение, как результат своей работы возвращает другую функцию, которая уже и присваивавется методу onclick. И внутри этой возвращаемой функции зашита переменная, которая доступна только ей. Вы же знаете что такое замыкание?
Андрей К.
1172 повідомлення
#15 років тому
Да, вы правы, работает. С замыканием ранее не сталкивался. Благодарю за инфу.
Дмитрий Засядько
87 повідомлень
#15 років тому
Да не за что. Это полезная штука. При помощи неё в js можно даже иммитировать private свойства у объектов.