如何看DOM对象属性?

时间:2011-04-02 00:54:00

标签: javascript dojo

我想观看一个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 )
  })
}

2 个答案:

答案 0 :(得分:3)

  

我想看一个DOM节点   财产,但我似乎无法得到它   工作

通过将Mozilla的watch直接添加到DOM节点,您无法使其工作。

http://james.padolsey.com/javascript/monitoring-dom-properties/提及使用setIntervalonpropertychange(仅限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)

Dojo中的

watch仅针对dojo.Stateful个对象以及dijit小部件(都是从dojo.Stateful继承)定义。

如果不诉诸特定于浏览器的怪癖,您无法以跨浏览器方式查看普通DOM节点中的属性更改。事件不是节点的属性。