2010-05-27 7 views
0

Я пытаюсь создать метод наблюдения для элементов HTML, используя __define[GS]etter__, когда свойство изменено. Он отлично реагирует, когда я устанавливаю значение, но если свойство прослушивается, является innerHTML, оно каким-то образом не может выполнить данную строку. Таким образом, в основном, когда я добавляю что-то к innerHTML, он не отображается.__defineSetter__ на innerHTML останавливает его от рендеринга

Im, используя метод, описанный в часы этого предыдущий вопрос: Watch for object properties changes in JavaScript

я мог причины просто не слушать изменения innerHTML, но я также интересно, если __defineSetter__ каким-то образом предотвращает первоначальную обработку установки значения.

Спасибо!

+0

im using Chrome BTW. Но после небольшого исследования я обнаружил, что вместо этого он использовал defineProperty, но он по-прежнему не отображает innerHTML. Это похоже на то, что он переопределяет метод локального сеттера. – Tokimon

+0

Эта реализация не предназначена для узлов DOM. Он просто вызывает обратный вызов, когда установлено свойство просмотра. Но нигде он не устанавливает значение свойства * real * основного свойства (т. Е. Тот, который фактически изменит * внутренний html). –

ответ

0

Этот код прокладки не является сквозным: когда вы устанавливаете свойство, значение запоминается только на оболочке часов и не передается базовому объекту. Он предназначен для чистых объектов JavaScript, свойства которых не имеют побочных эффектов (например, изменение DOM, в случае innerHTML).

Выполнение этого метода записи будет больно, так как нет возможности напрямую вызвать сеттер прототипа. Вам придется временно удалить свойство, записать в базовое свойство, а затем вернуть его на место.

Однако это не стоит проводить ИМО. DOM-узлам разрешено быть «объектами-хозяевами», поэтому нет никакой гарантии, что любые функции объекта-свойства native-JavaScript будут работать над ними вообще.

(В любом случае, добавление новых членов на Object прототип, как правило, считается очень плохая идея.)

я мог причины просто не слушать innerHTML изменения

Я думаю, что это лучше, да.

+0

Hm. да, я звучу как идея, однако общая проблема заключается в том, что это не только innerHTML, это проблема, но все свойства NavTive DOM.Таким образом, сделать его еще более громоздким, что я пытаюсь сделать. Я попытаюсь найти способ сделать это. – Tokimon

+0

Явным образом невозможно жить-наблюдать свойства объекта хоста любым стандартно-совместимым способом. (Для некоторых изменений есть DOM Mutation Events, но поддержка невелика.) Вам нужно будет использовать контролер для проверки или, лучше, убедитесь, что вы всегда используете свою собственную функцию-обертку (которая вызывает обратные вызовы) для установки свойств , – bobince

0

ОК обновление. Я нашел эту страницу на MSDN, которая имеет именно то, что мне нужно: http://msdn.microsoft.com/en-us/library/dd229916(VS.85).aspx

Но Object.getOwnPropertyDescriptor способ делать вещи, по-видимому, работает только в IE. Облом. Любые идеи были бы хорошы.

0

я нашел другую веб-страницу, с чем-то, что казалось интересным, но я не мог заставить его делать то, что я хотел: http://www.refactory.org/s/recent/tag/accessors

Я решил найти обходной путь сейчас, то с таймером, проверяет атрибут изменений и изменения атрибутов evnets для браузеров, которые его поддерживают.

Но если кто-нибудь найдет решение для вопроса plz post :)