Javascript-форум (https://javascript.ru/forum/)
-   Events/DOM/Window (https://javascript.ru/forum/events/)
-   -   Вещатели - наблюдатели - обработчики. (https://javascript.ru/forum/events/29251-veshhateli-nablyudateli-obrabotchiki.html)

bunta 21.06.2012 10:44

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

В 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);

Маэстро 22.06.2012 10:57

Цитата:

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

Наши мечты совпадают. Только мне надо механизм, который наблюдает/оповещает обо ВСЕХ событиях, возникающих в DOM. Или в Window. В частности, когда кто-то добавляет в DOM новый элемент, когда кто-то навешивает на элемент свой обработчик (например, onclick... onerror), когда кто-то добавляет новую функцию javascript. Ну хоть что-нибудь из этого...
мечты...

bunta 22.06.2012 12:16

Может быть Harmony Proxy ?
Но я в нем толком ничего не понял. Примеров мало и те слишком сложные.

bunta 23.06.2012 20:21

http://www.w3.org/TR/dom/#mutation-observers

Вот хорошая штука. Если повесить на окно отлавливает очень много. Но все равно не то. Работает только по DOM. Вот если бы то же самое но всем js объектам.


Часовой пояс GMT +3, время: 22:10.