Вещатели - наблюдатели - обработчики.
Добрый день!
В 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);
|
Цитата:
мечты... |
Может быть Harmony Proxy ?
Но я в нем толком ничего не понял. Примеров мало и те слишком сложные. |
http://www.w3.org/TR/dom/#mutation-observers
Вот хорошая штука. Если повесить на окно отлавливает очень много. Но все равно не то. Работает только по DOM. Вот если бы то же самое но всем js объектам. |
| Часовой пояс GMT +3, время: 20:56. |