Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #21 (permalink)  
Старый 28.07.2012, 21:24
что-то знаю
Отправить личное сообщение для devote Посмотреть профиль Найти все сообщения от devote
 
Регистрация: 24.05.2009
Сообщений: 5,176

Работает везде
<!DOCTYPE html>
<html>
<body>
<div id="test"></div>
<div id="test2"></div>
<script>
function setInnerHTMLHandler( elem, setfn, getfn ) {
    var descriptor = Object.getOwnPropertyDescriptor( elem, "innerHTML" ),
        temp = document.createElement( 'div' ),
        currentHTML = elem.innerHTML;

    Object.defineProperty( elem, "innerHTML", {
        configurable: true,
        set: descriptor.set ? function( value ) {
            var result;
            if ( !setfn || ( result = setfn( value ) ) !== false ) {
                descriptor.set.call( this, result || value );
            }
        } : function( value ) {
            var result;
            if ( !setfn || ( result = setfn( value ) ) !== false ) {
                temp.innerHTML = result || value;
                currentHTML = temp.innerHTML;
                while( this.firstChild ) {
                    this.removeChild( this.firstChild );
                }
                while( temp.firstChild ) {
                    this.appendChild( temp.firstChild );
                }
            }
        },
        get: descriptor.get ? function() {
            var result;
            if ( !getfn || ( result = getfn() ) !== false ) {
                return result || descriptor.get.call( this );
            }
        } : function() {
            var result;
            if ( !getfn || ( result = getfn() ) !== false ) {
                return result || currentHTML;
            }
        }
    });
}


// тесты

var div = document.getElementById('test');

setInnerHTMLHandler( div, function( value ) {
    alert( "Попытка установить значение: " + value );
}, function() {
    alert( "Попытка получить значение" );
})

div.innerHTML = "Hello World!!!";
alert( div.innerHTML );


var div2 = document.getElementById('test2');
setInnerHTMLHandler( div2, function( value ) {
    alert( "Попытка установить значение: " + value );
    return "А вот и значение: " + value;
}, function() {
    alert( "Попытка получить значение" );
    return "Текущее не дам";
})

div2.innerHTML = "Hello World!!!";
alert( div2.innerHTML );


</script>
</body>
</html>
__________________
хм Russians say завтра but завтра doesn't mean "tomorrow" it just means "not today."
HTML5 history API рассширение для браузеров не поддерживающих pushState, replaceState
QSA CSS3 Selector Engine

Последний раз редактировалось devote, 28.07.2012 в 21:28.
Ответить с цитированием
  #22 (permalink)  
Старый 28.07.2012, 22:00
Профессор
Отправить личное сообщение для oneguy Посмотреть профиль Найти все сообщения от oneguy
 
Регистрация: 31.05.2012
Сообщений: 396

Сообщение от devote
Работает везде
В Фаерфоксе не работает: TypeError: descriptor is undefined, 14 строка.
Да и там, где работает, работает неправильно: innerHTML - это не единственный способ изменить содержимое элемента. Например appendChild не изменяет локальную переменную currentHTML.

Последний раз редактировалось oneguy, 28.07.2012 в 22:02.
Ответить с цитированием
  #23 (permalink)  
Старый 28.07.2012, 22:02
Профессор
Отправить личное сообщение для oneguy Посмотреть профиль Найти все сообщения от oneguy
 
Регистрация: 31.05.2012
Сообщений: 396

У меня вопрос: нужно отследить только записи innerHTML или любые изменения внутри элемента?
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Повесить событие на изменение DOM nebaz Events/DOM/Window 5 17.06.2012 15:15
повесить событие на массив элементов zlodiak Элементы интерфейса 1 24.02.2012 13:57
Не получается повесить событие wine-time Элементы интерфейса 2 23.07.2011 03:54
Выпадающий калькулятор, помогите... Silentz Общие вопросы Javascript 2 23.01.2010 10:39
Как повесить событие без редактирования файла? bilbas Общие вопросы Javascript 8 11.09.2009 15:17