Работает везде
<!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>