2010-05-27 62 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帖子的解決方案:)