【问题标题】:__defineSetter__ on innerHTML stops it from renderinginnerHTML 上的 __defineSetter__ 阻止它呈现
【发布时间】:2010-05-27 10:14:07
【问题描述】:

我正在尝试为 HTML 元素创建一个监视方法,当属性更改时使用 __define[GS]etter__。当我设置值时它的反应很好,但是如果监听的属性是 innerHTML,它会以某种方式无法呈现给定的字符串。所以基本上,当我向 innerHTML 添加内容时,它不会显示。

我正在使用上一个问题中描述的 watch 方法: Watch for object properties changes in JavaScript

我可能只是不听 innerHTML 更改,但我也想知道 __defineSetter__ 是否会以某种方式阻止对设置值的原始处理。

谢谢!

【问题讨论】:

  • 我正在使用 Chrome BTW。但经过一番研究,我发现它改用了defineProperty,但它仍然不呈现innerHTML。就好像它覆盖了原生的 setter 方法。
  • 该实现不适用于 DOM 节点。它只是在设置监视属性时调用回调。但它实际上并没有设置 real 底层属性值(即,实际上会更改内部 html 的值)。

标签: javascript innerhtml watch


【解决方案1】:

该 shim 代码实际上并没有直写:当您设置一个属性时,该值仅在 watch-wrapper 上被记住,而不是传递给底层对象。它是为纯 JavaScript 对象设计的,其属性没有副作用(比如更改 DOM,在 innerHTML 的情况下)。

因为无法直接调用原型的设置器,所以将其写入会很痛苦。您必须暂时移除该属性,写入基础属性,然后将其放回原处。

然而,追求 IMO 并不值得。 DOM 节点被允许作为“宿主对象”,因此无法保证任何原生 JavaScript 对象属性函数都可以在它们上工作。

(无论如何,在Object 原型上添加新成员通常被认为是一个非常糟糕的主意。)

我可能只是不听 innerHTML 的变化

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

【讨论】:

  • 嗯。是的,我听起来像是一个想法,但是普遍的问题是,问题不仅是 innerHTML,而且是所有 navtive DOM 属性。从而使我正在尝试做的事情变得更加麻烦。我将尝试找到一些方法。
  • 显然不可能以任何标准兼容的方式实时监视主机对象属性。 (有一些特定更改的 DOM 突变事件,但支持不是很好。)您将不得不使用轮询器来检查,或者更好的是,确保您始终使用自己的包装函数(触发回调)来设置属性.
【解决方案2】:

好的更新。 我在 MSDN 上找到了这个页面,它正是我需要的: http://msdn.microsoft.com/en-us/library/dd229916(VS.85).aspx

Object.getOwnPropertyDescriptor 的处理方式显然只适用于 IE。真可惜。任何想法将不胜感激。

【讨论】:

    【解决方案3】:

    我找到了另一个网页,其中包含一些看起来很有趣的东西,但我无法让它完成我想做的事情: http://www.refactory.org/s/recent/tag/accessors

    我现在决定找到一种解决方法,使用计时器来检查属性的更改以及支持该功能的浏览器的属性更改 evnet。

    但是如果有人找到问题的解决方案请发帖:)

    【讨论】:

      猜你喜欢
      • 2020-06-17
      • 1970-01-01
      • 2021-05-11
      • 1970-01-01
      • 1970-01-01
      • 2010-10-28
      • 2014-06-20
      • 2020-09-27
      • 1970-01-01
      相关资源
      最近更新 更多