在Yii 2.0.10中防止多次点击和ActiveForm提交

时间:2017-01-13 15:09:27

标签: javascript jquery yii yii2

我经常使用ActiveForms并发现它很方便,因为它包含客户端验证脚本yii.jsyii.activeForm.js。它通常会自行处理模型规则和基本验证。

直到Yii 2.0.9:
我们可以使用以下脚本来防止因快速按钮点击而提交多个表单:

$('form').submit(function(){
    $(this).find('button[type!="button"],input[type="submit"]').attr("disabled",true);
    setTimeout(function(){
        $('form .has-error').each(function(index, element) {
            $(this).parents("form:first").find(":submit").removeAttr("disabled");
        });
    },1000);
});

但是,
当前 Yii 2.0.10 版本带来了一些更改并且无法在脚本上方执行。现在,如果上面的代码执行,它将不会提交表单 它也在前面已经讨论过here并且已被确定为bug 因为yii.js有两处变化:

  1. Bug#10358:修复了yii.js AJAX预滤波器(silverfire)中的竞争条件
  2. Enh#12580:让yii.js符合严格且非严格的javascript模式,以允许与外部代码连接(mikehaertl)
  3. 和,yii.activeForm.js有四处变化:

    1. Bug#10681:在yii.activeForm.js(silverfire)中恢复了对beforeValidate事件的修复
    2. Enh#12376:为yii.activeForm.js validate()方法添加了参数,以便能够强制验证(DrDeath72)
    3. Enh#12499:启用AJAX验证后,yii.activeForm.js将在表单提交时强制运行以显示所有可能的错误(silverfire)
    4. Enh#12744:将afterInit事件添加到yii.activeForm.js(werew01f)
    5. 可以用v2.0.9中的oder js文件替换它们吗?

      替换js文件会导致故障和意外行为吗?

      是否有更好的解决方案可以阻止多次提交?

4 个答案:

答案 0 :(得分:1)

看起来这个问题已经得到了解决 那些通过作曲家安装了新的Yii 2.0.10的人不会有这个问题;那些从“存档文件安装”中下载存档文件的人'部分可能仍然存在此问题,因为它们可能尚未更新存档文件。

如果您遇到此特定问题,那么您所要做的就是从github source替换特定文件framework/assets/yii.activeForm.js。 如果是本地副本,此文件可以位于vendor\yiisoft\yii2\assets\yii.activeForm.js

答案 1 :(得分:1)

我建议您使用uiBlocking来防止多次点击或输入。这里有complte指南如何在正在进行的任务中阻止ui。 http://malsup.com/jquery/block/

答案 2 :(得分:1)

像魅力一样工作

我实施并测试了以下扩展程序:

https://github.com/Faryshta/yii2-disable-submit-buttons

作曲家需要

"faryshta/yii2-disable-submit-buttons": "*"

注册Asset Globaly

class AppAsset extends yii\web\AssetBundle
{
    public $depends = [
        'faryshta\\assets\\ActiveFormDisableSubmitButtonsAsset',
        // other dependencies
    ];
}

<强>用法

$form = ActiveForm::begin([
    'options' => ['class' => 'disable-submit-buttons'],
    // other configurations
]);

    // inputs

    Html::submitButton('Submit', [
        // optional, will show the value of `data-disabled-text` attribute
        // while handling the validation and submit
        'data' => ['disabled-text' => 'Please Wait']
    ])

$form->end();

答案 3 :(得分:0)

最近有一些错误,我的表单我们没有提交,按钮保持禁用状态,所以我把它改成了这个。大部分都将它发布在这里供我将来参考,以便我能快速找到它:D

<?php $this->registerJs("
    $(function () {
        $('body').on('submit', 'form', function() {
            $(this).find('button[type!=\"button\"],input[type=\"submit\"]').attr('disabled',true);
            setTimeout(function(){
                $(this).find('.has-error').each(function(index, element) {
                    $(this).parents('form:first').find(':submit').removeAttr('disabled');
                });
            },1000);
        });
    });
", View::POS_END, 'prevent-double-form-submit'); ?>