2010-05-27 63 views
0

我试图创建HTML元素的手表方法,使用__define[GS]etter__当属性更改停止。当我设置值时,它的反应很好,但如果属性被监听,是innerHTML,它会以某种方式呈现给定的字符串失败。所以基本上,当我添加一些innerHTML它不显示。__defineSetter__上的innerHTML从渲染

即时通讯使用这个前面的问题中所述的手表方法: Watch for object properties changes in JavaScript

我可能导致的只是不听innerHTML的变化,但我也想知道,如果__defineSetter__某种程度上防止设置值的原处理。

谢谢!

+0

即时通讯使用Chrome BTW。 但经过一些研究,我发现它使用defineProperty来代替,但它仍然不呈现innerHTML。这就好像它覆盖了原生的setter方法。 – Tokimon 2010-05-27 10:24:05

+0

该实现不适用于DOM节点。它只是在观看属性设置时调用回调。但它没有实际设置*真实*基础属性值(即实际会改变内部html的属性值)。 – 2010-05-27 11:08:58

回答

0

那垫片代码实际上并没有写通:当你设置一个属性,该值只记得在手表包装,而不是向下传递到底层对象。它专为纯粹的JavaScript对象而设计,其属性没有副作用(如更改DOM,在innerHTML的情况下)。

因为没有办法直接调用原型的setter,所以让它直写是件痛苦的事。您必须暂时移除该财产,写入相关财产,然后将其归还。

然而,它不值得追求IMO。 DOM节点被允许成为'主机对象',所以不能保证任何native-JavaScript对象属性函数都可以用于它们。

(在任何情况下,添加新成员到Object原型通常被认为是一个非常糟糕的主意。)

我可能导致的只是不听的innerHTML改变

我认为这是最好的,是的。

+0

嗯。是的,我听起来像一个想法,但一般问题是,不仅是innerHTML,这是问题,但所有导航DOM属性。因此,我试图做的更加麻烦。我会试着找到一些做法。 – Tokimon 2010-05-27 12:44:24

+0

以任何与标准兼容的方式实时监视主机对象属性是不可能的。 (对于某些特定更改,有DOM突变事件,但支持并不好。)您必须使用轮询器进行检查,或者更好地确保始终使用自己的包装函数(即触发回调)设置属性。 – bobince 2010-05-27 13:24:16

0

我发现的东西,看着有趣的另一个网页,但我不能完全得到它做什么,我想: http://www.refactory.org/s/recent/tag/accessors

我决定现在要找到一个解决办法,与定时器的东西,检查支持该属性的浏览器的属性更改和属性更改evnets。

但是,如果有任何人发现问题的PLZ帖子的解决方案:)