我想劫持(挂钩)innerHTML
和nodeValue
的{{1}}和Element.prototype
属性以便我可以在设置之前执行某些操作并获取操作
innerHTML案例:
Node.prototype
耶。我知道原因。因为safari中的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');
var epOlderSetter = epDescriptor.set;
/*
Safari throw:
TypeError: Attempting to change the getter of an unconfigurable property.
*/
Object.defineProperty(ep, 'innerHTML', {
set: function(html){
alert('I want to do something befroe ...');
epOlderSetter.call(this, html);
}
})
是configurable
所以safari throw错误。
nodeValue案例:
false
我想知道是否有解决方法或黑魔法来实现我的两个目标(或一个)?
感谢您的任何建议
答案 0 :(得分:0)
所以问题是:
您无法在Safari上劫持innerHTML
,因为Safari已将其设为不可配置的属性(对他们有用!)和
您无法在Safari上劫持nodeValue
,因为当您使用getOwnPropertyDescriptor
时,它无法向您报告访问者功能,因此您无法将它们藏起来并从被覆盖的版本中使用它们
考虑到这些限制因素:不,您在Safari的Element.prototype
级别无法接管这两个属性。
我强烈要求强烈要求即使在允许您使用的主机(如Chrome)上也不要这样做,至少除了在受控环境中进行调试之外的其他目的。大多数人都会告诉你甚至不要增加主机提供的对象的原型,更不用说尝试接管他们现有的属性了。