Javascript 使用更改观察程序观察Object.observe()下的本机属性

Javascript 使用更改观察程序观察Object.observe()下的本机属性,javascript,polymer,object.observe,Javascript,Polymer,Object.observe,现在Chrome默认启用了Object.observe(),我遇到了很多情况,我想重用浏览器的内置属性(hidden,title,draggable),但是*Changed当属性更改时,不再调用观察者 一个例子是hidden:(hiddenChanged()从不被调用) 我当前的解决方法是使用attributeChanged()观察属性的变化: attributeChanged: function(attrName, oldVal, newVal) { // Cannot use *Chan

现在Chrome默认启用了
Object.observe()
,我遇到了很多情况,我想重用浏览器的内置属性(
hidden
title
draggable
),但是
*Changed
当属性更改时,不再调用观察者

一个例子是
hidden
:(
hiddenChanged()
从不被调用)

我当前的解决方法是使用
attributeChanged()
观察属性的变化:

attributeChanged: function(attrName, oldVal, newVal) {
  // Cannot use *Changed watchers for these native properties.
  if (attrName == 'hidden') {
    this.marker.setVisible(!this.hidden);
  }
}
推荐的方法是什么



顺便说一句,在尝试使用本机属性时抛出警告将导致调试时间过长:

Object.observe()
用于JavaScript内容,而
MutationObserver
用于DOM元素。在这种情况下,MutationObserver可能工作得更好。

这似乎是Polymer 1的一篇老文章,可能不再是一个有用的问题

Object.observe()建议和


聚合物现在使用哪种载体

在Chrome34中,
alert()
似乎正在发生。可能已经修复了?Chrome 34没有Object.observe()。它使用肮脏的检查。啊,是的,这是有道理的。DOM尚未移动到V8中,因此Object.observe()可能对DOM元素不起作用。因此,是否要侦听DOM元素状态的更改?如答案中所述,使用mutationobserver:您当然可以使用MO来检测元素上的属性更改,但您已经免费获得了
attributeChangedCallback
)。无论哪种方式,解决方案都是有漏洞的。它依赖于这样一个事实,即本机IDL属性还公开了一个同名的属性。因此,您不是在观察属性,而是在更改属性。请注意,为了避免将来的麻烦:MutationObserver只会在实际的DOM树突变(即影响DOM结构和属性的突变)时启动。这将不允许您捕获对本机属性的更改。截至2014年10月,在Chrome中无法做到这一点——您应该能够通过Object.defineProperty()填充本机属性getter,但这不起作用,因为Chrome和Safari上的本机属性的Object.getOwnPropertyDescriptor()已被破坏。