代码之家  ›  专栏  ›  技术社区  ›  Ariod

使用Dojo防止表单提交

  •  6
  • Ariod  · 技术社区  · 15 年前

    saveParamButtonWidget.onClick = editParam
    

    我这样定义editParam()函数:

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

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

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

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

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

    3 回复  |  直到 15 年前
        1
  •  24
  •   Ken Franqueiro    15 年前

    好吧,在对消息来源做了一些挖掘之后,我相信我能肯定地回答你的问题。

    dojo.stopEvent() 不起作用,但是 return false 是的,完全是因为 dijit.form.Button

    已单击。。。

    1. 按钮是 _onButtonClick ondijitclick 事件,它不仅捕获鼠标点击,而且还捕获某些按键,以供使用。)
    2. 这个 _打开按钮单击 方法首先调用 _onClick 方法,假定按钮未被禁用(在本例中不是这样),则调用 并返回 这个 onClick 方法。这是特别有趣的,因为它是你重写的方法!
    3. 回到过去 _打开按钮单击 _单击 返回 准确地说 false 处理程序返回 ), _打开按钮单击 . 这就是为什么返回false会使代码按预期工作。 但如果发生了什么呢
    4. 接下来, 检查此按钮 实际HTML表单的后代,但是 具有 _onSubmit 方法(鸭型)。我想在你的情况下 内部 真实的 dijit.form.Form 计数),所以我们跳过这个。(我的印象是,这个代码路径实际上不会最终提交,而你的显然会提交。)
    5. 检查最后一个条件:如果按钮有 valueNode click 在一个看不见的地方 input type="submit" 节点,因此您试图告诉原始事件的任何内容都变得无关紧要,表单继续提交! dojo.stopEvent 不起作用-此代码在 dijit.form.Button按钮

    我把它当作一个有限的概念证明(一定要打开firebug/etc获取日志): http://jsfiddle.net/Bf5H8/

    也许这是一个应该被记录为bug的东西,但是我想最初的想法可能是支持众所周知的 返回false 机制就足够了。

    尽管如此,很可能重写表单的onSubmit比重写按钮的onClick更符合您的兴趣(正如s.Jones所建议的),但至少这应该解决了这个问题。

        2
  •  2
  •   S.Jones    15 年前

    有趣的问题。+1

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

    The Event Object (DojoTollkit.org Reference Guide)

    将函数连接到DOM时 事件对象。这意味着, 不管客户的浏览器是什么, 关于事件和集合的属性 操作事件的方法。

    假设您的函数 呼叫人dojo.connect连接并采取了

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

    ...

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

    • 事件.停止播放-防止事件触发父节点的事件

    另外,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>
    

    干杯。

        3
  •  2
  •   Matthias    13 年前

    我也有同样的问题dojo.stopEvent事件

    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);
    });