2013-07-29 39 views
0

我想有从按钮改变CSS类“主动”基于表单是否有效与否形态改变事件

所以我有这个声明位“无效” ......

<form data-dojo-type="dijit/form/Form" id="myForm" action="http://somthing"> 
<script type="dojo/on" data-dojo-event="change" data-dojo-args="e"> 
// for some reason change returns dom object not dijit object.... 
var self = dijit.byId(this.id); 
require([ 'dojo/dom-class' ], function (domClass) { 
    var tmp, on = 'active' , off = 'inactive'; 
    if (self.get('state')) { 
     // invalid 
     tmp = off; off=on; on=tmp; 
    } 
domClass.replace('complete', on, off); 
}); 
</script> 
..rest of form and submit button with id='complete' is here. 

该脚本旨在根据表单是否有效更改提交按钮的类别。我的第一个问题是,为什么这个例程将DOM对象取为this而不是Dijit对象,因为这些示例似乎暗示我应该获取后者。我的第二个问题是我是否应该以更好的方式做到这一点?

回答

1

检查您收到的事件的target属性:你最有可能接受它关闭的形式,起泡(通过HTML事件冒泡)了从您形式的实际控制权。这是一个本地DOM事件,而不是更高级别的Dojo事件,因此this是DOM节点。

有时使用简单的旧JavaScript代码代替dojo/on脚本更容易,并且使用dojo/on手动订阅。没有什么神奇的,你可以看到你订阅到底该怎么那么:

require(['dojo/on'], function (on) { 
    var myForm = dijit.byId("myForm"); 
    on(form, "change", function(evt) { 
    // Handle the event here, referring to myForm rather than trying to 
    // work with 'this'. 
    }); 
}); 

更多的例子,包括检查的有效性,地址为:http://dojotoolkit.org/reference-guide/1.9/dijit/form/Form.html#using-native-form-elements

+0

是的,我得到的印象是,我有时会试着吞下整个道场哲学的钩线和沉降片,当有可能是一个更简单的方法。从这些例子中,我预计会得到更高层次的事件。例如,你给出的页面通过'dojo/on'获取'submit'事件,并且期望'this'是Dojo对象,而不是DOM对象,调用'this.validate()' – vogomatix

+0

我的团队和我从来没有使用dojo/on