Вещатели - наблюдатели - обработчики.
Добрый день!
В 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, время: 21:34. |