Параметры функций в JS при изменении DOM
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 будет undefined2) () в конце функции сразу запустит ее на исполнение
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 років тому
Вы пробовали этот код или просто предполагаете?
1172 повідомлення
#15 років тому
Ваш код отправляет функцию на исполнение немедленно. Зачем его пробовать?
87 повідомлень
#15 років тому
Ну может быть затем, что функция, отправляемая на исполнение, как результат своей работы возвращает другую функцию, которая уже и присваивавется методу onclick. И внутри этой возвращаемой функции зашита переменная, которая доступна только ей. Вы же знаете что такое замыкание?
1172 повідомлення
#15 років тому
Да, вы правы, работает. С замыканием ранее не сталкивался. Благодарю за инфу.