Object.defineProperty在safari中表现

时间:2016-08-25 10:19:12

标签: javascript html5 safari cross-browser frontend

我想劫持(挂钩)innerHTMLnodeValue的{​​{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

我想知道是否有解决方法或黑魔法来实现我的两个目标(或一个)?

感谢您的任何建议

1 个答案:

答案 0 :(得分:0)

所以问题是:

  1. 您无法在Safari上劫持innerHTML,因为Safari已将其设为不可配置的属性(对他们有用!)

    < / LI>
  2. 您无法在Safari上劫持nodeValue,因为当您使用getOwnPropertyDescriptor时,它无法向您报告访问者功能,因此您无法将它们藏起来并从被覆盖的版本中使用它们

  3. 考虑到这些限制因素:不,您在Safari的Element.prototype级别无法接管这两个属性。

    我强烈要求强烈要求即使在允许您使用的主机(如Chrome)上也不要这样做,至少除了在受控环境中进行调试之外的其他目的。大多数人都会告诉你甚至不要增加主机提供的对象的原型,更不用说尝试接管他们现有的属性了。