Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 02.06.2014, 02:05
Интересующийся
Отправить личное сообщение для MishaUA Посмотреть профиль Найти все сообщения от MishaUA
 
Регистрация: 03.05.2014
Сообщений: 26

Построение сложной структуры объекта.
Привет!
Я С++ прогер, сейчас изучаю web программирование.
Нужно построить довольно сложную (для меня) структуру объектов. Суть в том, что есть объект, который хранит в себе еще несколько, эти еще и т.д. На странице в динамическом режиме создаются элементы, у каждого элемента onclick должен изменять содержимое заданного объекта.
Небольшой пример:
var components = {};

function func(inputData) {
		
	for (var i=0; i<5; i++) {
		var component = components[i+""],
			data = inputData["d"+i];
			
		components[i+""] = document.createElement("div");
		components[i+""].innerText = data.text;
		components[i+""].onclick = function() {
			data.text = "hello";
			// вот эта часть не правильно работает (да и не должна вроде бы). Я не знаю, как правильно здесь записать.
			// Если сделать вывод в консоль, то при клике в data находится последний элемент (№4)
			// Нужно сделать так, чтобы при клике в data хранился указатель на нужный объект.
		}
	}
	
}

var ddd = {
	d0: {text: "0"},
	d1: {text: "1"},
	d2: {text: "2"},
	d3: {text: "3"},
	d4: {text: "4"}
}

func(ddd);

Создается множество div'ов, при клике они должны изменять переменную text в нужном объекте. Основная проблема в том, что я не знаю, как правильно в обработчике onclick указать объект, с которым нужно работать.
PS: реальная структура (можно сказать, дерево) объекта ddd гораздо сложней.
Спасибо!
Ответить с цитированием
  #2 (permalink)  
Старый 02.06.2014, 03:09
Аватар для Aetae
Тлен
Отправить личное сообщение для Aetae Посмотреть профиль Найти все сообщения от Aetae
 
Регистрация: 02.01.2010
Сообщений: 6,493

Обычное решение:
var components = {};
 
function func(inputData) {
    function click(ev){ //вынесем функцию отдельно, дабы не создавать новую на каждый элемент
            ddd[this.id].text = "hello";
    }     
    for (var i=0; i<5; i++) {
        var data = inputData["d"+i]; //component = components[i+""] - бессмыслено ибо == undefined
             
        components[i] = document.createElement("div"); //ключи всегда приводятся к строке, i+"" - не имеет смысла
        components[i].appendChild( document.createTextNode(data.text) ); //.innerText - не кроссбраузерно, в ff алалог .textContent
        components[i].id = 'd' + i; //проще всего хранить нужную для связи инфу в атрибутах
        components[i].onclick = click;
    }
     
}
 
var ddd = {
    d0: {text: "0"},
    d1: {text: "1"},
    d2: {text: "2"},
    d3: {text: "3"},
    d4: {text: "4"}
}
func(ddd);


Но если таки не хочется использовать атрибуты, и не волнует создание множества копий функций, то решение "проблемы" - классический вариант замыкания:
var components = {};
 
function func(inputData) { 
    for (var i=0; i<5; i++) {
        var data = inputData["d"+i]; //component = components[i+""] - бессмыслено ибо == undefined
             
        components[i] = document.createElement("div"); //ключи всегда приводятся к строке, i+"" - не имеет смысла
        components[i].appendChild( document.createTextNode(data.text) ); //.innerText - не кроссбраузерно, в ff алалог .textContent
        components[i].onclick = function(innerData){
            return function(){
                innerData.text = "hello";
            }
        }(data) //создаём и тут же вызываем функцию, передавая в неё нужный объект(это работает по той же причине по которой не работает ваш пример: функция "замыкает" на себя все переменные, а не их значения на момент создания)
    }
     
}
 
var ddd = {
    d0: {text: "0"},
    d1: {text: "1"},
    d2: {text: "2"},
    d3: {text: "3"},
    d4: {text: "4"}
}
func(ddd);
__________________
29375, 35

Последний раз редактировалось Aetae, 02.06.2014 в 14:00.
Ответить с цитированием
  #3 (permalink)  
Старый 02.06.2014, 13:09
Интересующийся
Отправить личное сообщение для MishaUA Посмотреть профиль Найти все сообщения от MishaUA
 
Регистрация: 03.05.2014
Сообщений: 26

Второй вариант - то, что надо!
Огромное СПАСИБО!!!
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Canvas. Как сделать или вообще нельзя? Вращение рандомизированно изменяемого объекта. Zemsky Общие вопросы Javascript 30 19.12.2013 19:44
динамическое обновление свойств объекта в цикле grego Общие вопросы Javascript 3 04.12.2013 23:29
Чем отличается составной оператор от литерала объекта? rgl Общие вопросы Javascript 10 26.02.2013 22:38
Скрипт вычисления координат объекта banderasantonio197555 Events/DOM/Window 4 16.08.2011 17:37
Можно ли получить имя экземпляра объекта внутри самого объекта? Ichigeki Общие вопросы Javascript 9 14.11.2008 19:00