使用Dojo阻止表单提交

时间:2010-10-02 08:42:40

标签: javascript dojo

我有一个带有jsId =“saveParamButtonWidget”的Dojo SubmitButton。我通过put:

覆盖了它的onClick方法
saveParamButtonWidget.onClick = editParam

我定义了editParam()函数,如下所示:

function editParam(eventObj) {
    dojo.stopEvent(eventObj);
    // ...
}

dojo.stopEvent()应该停止事件冒泡和默认处理。但是,浏览器仍会提交表单。我也试过以下内容:

function editParam(eventObj) {
    eventObj.stopPropagation();
    eventObj.preventDefault();
    // ...
}

同样的事情。我设法阻止表单提交的唯一方法是从事件处理程序返回“false”:

function editParam(eventObj) {
    // ...
    return false;
}

有人可以告诉我为什么前两种方法不起作用?感谢。

3 个答案:

答案 0 :(得分:23)

好的,经过深思熟虑后,我相信我可以肯定地回答你的问题。

dojo.stopEvent()不起作用的原因,return false确实起作用,完全是由于dijit.form.Button的编码方式。如果你有兴趣,现在是时候进行一次实地考察了。保持你的安全帽。

点击dijit.form.Button

  1. 调用按钮的_onButtonClick方法。 (这是在模板中连接到特殊ondijitclick事件,它不仅捕获鼠标点击,而且还捕获某些按键,用于11个目的。)
  2. _onButtonClick方法首先调用_onClick方法,假定按钮未被禁用(在这种情况下不是),调用并返回的结果onClick方法。这是特别令人感兴趣的,因为它是你要覆盖的方法!
  3. 回到_onButtonClick,如果_onClick正确 false返回(例如,如果您的onClick处理程序返回false), _onButtonClick 立即退出这就是为什么返回false会使您的代码按预期工作。但是如果没有拯救那么会发生什么?让我们进一步追踪......
  4. 接下来,_onButtonClick检查此按钮不是是否是实际HTML表单的后代,但 是具有{{1}的窗口小部件的后代方法(鸭子打字)。我假设在你的情况下 真正的形式(_onSubmit计数)内,所以我们将跳过这个。 (我的印象是这段代码路径实际上不会最终提交,而你的代码路径显然会提交。)
  5. 检查最后一个条件:如果按钮定义了dijit.form.Form(确实如此),则调用此节点的valueNode方法。不幸的是,这会在您表单下的一个不可见的click节点上生成一个全新的事件对象,因此您尝试告诉原始事件的任何内容都将变得无关紧要,并且表单继续提交! 这就是为什么input type="submit"不起作用的原因 - dojo.stopEvent中的这段代码完全没有注意到它。
  6. 我把它作为一个有限的概念证明(确保打开firebug /等来获取日志):http://jsfiddle.net/Bf5H8/

    也许这应该被记录为一个错误,但我想最初的想法可能是支持着名的dijit.form.Button机制就足够了。

    所有这一切都说,很有可能覆盖表单的提交更符合你的兴趣而不是覆盖按钮的onClick(如S.Jones建议的那样),但至少这应该解决这个谜。

答案 1 :(得分:2)

有趣的问题。 1

我相信您必须使用dojo.connect将您的函数连接到DOM事件,以便使用事件对象访问这些方法。

请参阅:The Event Object (DojoTollkit.org Reference Guide)

  

事件对象

     

将函数连接到DOM时   dojo.connect事件,   Dojo将您的函数传递给规范化   事件对象。这意味着,   无论客户的浏览器如何,   你可以指望一套标准   关于事件和集合的属性   操纵事件的方法。

     

假设你的功能已经存在   由dojo.connect调用并获取   名为 event 的参数,如:

dojo.connect(dojo.byId("node"), "onclick", function(event){
    // the var 'event' is available, and is the normalized object 
});
     

...

     

Dojo使用事件对象规范化以下方法:

     
      
  • event.preventDefault - 阻止事件的默认行为(例如,加载新页面的链接)
  •   
  • event.stopPropagation - 阻止事件触发父节点的事件
  •   
     

此外,dojo.stopEvent(事件)   将防止任何默认行为   任何传播(鼓泡)的   事件


也就是说,在提交之前放置一个类似下面的函数来执行某些逻辑,是一个相当干净,易于理解的功能。可持续的方法。

<script type="dojo/method" event="onSubmit">
    if (!this.validate()) { // or whatever else you'd like to evaluate
        // insert calls here...
        return false;
    }
    return true;
<script>

干杯。

答案 2 :(得分:2)

我在使用dojo.stopEvent

时遇到了同样的问题

这个问题解决了这样的表单提交问题 - 这里是一个用于通过dojo连接的简单表单:

this.formId = dojo.byId("formId");
dojo.connect(this.formId, 'onsubmit', function(evt) {
    var val_main = validate_this_form(0);
       if(val_main == false)
           dojo.stopEvent(evt);
});