我想观看一个DOM节点属性,但我似乎无法让它工作。
在我的小部件中,我尝试了以下内容。
startup: function() {
this.inherited(arguments);
// First try using the dojo 1.6 watch.
// I'm setting the property of the widget
// to reference the DOM node's offsetWidth property
this.width = this.domNode.offsetWidth;
this.watch("width", function() {
console.debug('Width changed to ' + this.domNode.offsetWidth )
})
// Does this.width contain a reference or a copy of this.domNode.offsetWidth?
// Second try, the Mozilla watch
this.domNode.watch("offsetWidth", function() {
console.debug('Width changed to ' + this.domNode.offsetWidth )
})
}
答案 0 :(得分:3)
我想看一个DOM节点 财产,但我似乎无法得到它 工作
通过将Mozilla的watch
直接添加到DOM节点,您无法使其工作。
在http://james.padolsey.com/javascript/monitoring-dom-properties/提及使用setInterval
,onpropertychange
(仅限IE)和DOMSubtreeModified
(还有其他此类标准DOM修改事件,例如DOMAttrModified
},但你必须检查浏览器支持)。标准DOM修改事件仅在DOM属性发生更改时才起作用,而不是等效属性(尽管您可以通过initMutationEvent
从JS触发突变事件):
<input />
<script>
window.onload = function () {
var ct=0;
document.addEventListener('DOMAttrModified', function () {
alert('Value modified ' + (++ct) + ' times');
}, false);
var input = document.getElementsByTagName('input')[0];
input.setAttribute('value', 5); // Triggers the event
input.value = 15; // Though it sets the value, it doesn't trigger the event
};
</script>
//首先尝试使用dojo 1.6手表。 //我正在设置的属性 小部件//引用DOM node的offsetWidth属性
this.width = this.domNode.offsetWidth; this.watch(“width”,function(){ console.debug('宽度更改为'+ this.domNode.offsetWidth}})
您可以使用Dojo API在此处监视width属性的设置,但这似乎不会为您跟踪DOM节点(尽管http://dojotoolkit.org/features/1.6/widget-watch似乎暗示它确实如此)。例如,你可以这样做:
widget.set('width', 100);
然后可以修改上面的watch
事件以动态更改DOM width
(但不是offsetWidth
,因为这是一个只读属性)。
但是,您似乎正在尝试检测自动offsetWidth
计算更改,而不是您自己的更改。在这一点上,对你来说最好的解决方案似乎是setInterval
。
// this.width是否包含引用 或者是this.domNode.offsetWidth?
的副本
由于this.domNode.offsetWidth是一个数字而在JavaScript中,非对象类型将始终按值复制。
//第二次尝试,Mozilla手表
this.domNode.watch( “offsetWidth” function(){ console.debug('宽度更改为'+ this.domNode.offsetWidth)
})
如果能够工作(并且没有),则需要在函数内部使用this.offsetWidth
,因为Mozilla将回调this
设置为被监视对象的回调。 / p>
答案 1 :(得分:1)
watch
仅针对dojo.Stateful
个对象以及dijit小部件(都是从dojo.Stateful继承)定义。
如果不诉诸特定于浏览器的怪癖,您无法以跨浏览器方式查看普通DOM节点中的属性更改。事件不是节点的属性。