属性劫持 - pod4g/tool GitHub Wiki

劫持Host Object,有兼容性问题,

在safari,劫持DOM对象的属性会抛错,所以用MutationObserver来做

SOF相关问题

<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<title>每天一个小效果 - 测试属性劫持 - 20160826</title>
<meta charset="UTF-8">
<meta http-equiv="Content-Type" content="text/html;charset=UTF-8">
<meta name="description" content="">
<meta name="viewport" content="width=device-width,initial-scale=1,maximum-scale=1.0,user-scalable=no">
<meta http-equiv="X-UA-Compatible" content="IE=Edge,chrome=1">
<meta name="renderer" content="webkit">
</head>
<body>
<pre id="pre">
    采菊东篱下
    悠然见南山
</pre>
<button id="btn">改变</button>
<script>
btn.onclick = function(){
    pre.innerHTML = "欲穷千里目\n更上一层楼"
}
var ep = Element.prototype;
// {enumerable: true, configurable: true, set , get} // Ch/FF/Op
// {enumerable: true, configurable: false, get: undefined, set: undefined} // Safari
var epDescriptor = Object.getOwnPropertyDescriptor(ep, 'innerHTML');
console.log(epDescriptor);
var epOlderSetter = epDescriptor.set;
console.log(epOlderSetter);
/*
  Safari throw:
  TypeError: Attempting to change the getter of an unconfigurable property.
*/
try{
    Object.defineProperty(ep, 'innerHTML', {
       set: function(html){
         alert('I want to do something befroe ...');
         epOlderSetter.call(this, html);
       }
     });
}catch(e){

    // if(ep.__lookupSetter__){
    //     epOlderSetter = ep.__lookupSetter__('innerHTML');
    //     console.log(epOlderSetter);
    //     ep.__defineSetter__('innerHTML', function(html){
    //         alert('I want to do something befroe ...');
    //         // epOlderSetter.call(this, html);
    //     })
    // }

    // safari use MO
    var MutationObserver = window.MutationObserver || window.WebkitMutationObserver || MozMutationObserver;
    if(MutationObserver){
        var observer = new MutationObserver(function(mutations){
            mutations.forEach( function(mutation){
                var type = mutation.type;
                console.log(type);
                if(type === 'characterData'){
                    alert('I want to do something befroe ...');
                }
            });
        });
        var config = { 
            characterData: true,
            subtree: true 
        };
        observer.observe(pre, config);
    }
    
}
</script>
</body>
</html>
⚠️ **GitHub.com Fallback** ⚠️