Показать сообщение отдельно
  #1 (permalink)  
Старый 21.06.2012, 11:44
Новичок на форуме
Отправить личное сообщение для bunta Посмотреть профиль Найти все сообщения от bunta
 
Регистрация: 09.09.2010
Сообщений: 6

Вещатели - наблюдатели - обработчики.
Добрый день!

В XUL есть такая замечательная вещь как вещатели и наблюдатели.
В двух словах - один (или несколько) тегов налюдает(ют) за изменением атрибутов другого (других) тегов.

Подробнее на русском:
http://www.intuit.ru/department/se/mozilla/6/4.html

Очень удобная вещь. Позволяет отказаться от навешивания событий на элементы.
Но есть один недостаток.
Эта штука работает только при изменении атрибутов элементов (тегов). Н.п.: element.setAttribute('color', 'red').

При изменении свойств элемента н.п.:
element.childNodes.length ( в случае добавления дочернего элемента)
эта штука не работает.

В идеале хотелось бы иметь следующую возможность.
Создать такой javascript- объект наблюдатель, которому при создании передаются ссылки на наблюдаемые js или DOM объекты (их свойства) - вещатели и, функцию - обработчик, которая бы срабатывала каждый раз, когда происходит какое либо изменение в наблюдаемом объекте (со свойствами объекта ).

пример:

/** Массив из свойств наблюдаемых объектов - */
var node = document.getElementById('main');
var ao = [ node.childNodes, node.style.color];

/** Функция - обработчик */
var hnd = function (el, prop, old_value, new_value){ 
	var msg = "";
	if (prop=='childNodes'){
		if (prop.length == 10){
			msg = "Число дочерних узлов достигло 10!";
			node.setAttribute('color', 'red'); 
			clearInterval(it);
		}	
		alert(msg);   
	};

	if (prop=='color'){
		msg = "Цвет элемента изменился со значения "
		+ old_value +" на " +new_value; 		
		alert(msg);   
	};


};

/** Создание обозревателя */
var obs = new Observer(ao, hnd);

/** Функция для проверки */
var f = function(){
	var span = document.createElement('span')
	node.appendChild(span); 
} 
 
var it = setInterval(f, 1000);

Последний раз редактировалось bunta, 21.06.2012 в 11:48.
Ответить с цитированием