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

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

直到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版本带来了一些更改并且无法在脚本上面进行 现在,如果上面的代码执行,它将不会提交表单。
它在前面已经讨论过,并且已被确定为bug。
因为, yii.js有两处变化:

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

而且, yii.activeForm.js有四处变化:

  1. 错误#10681:在yii.activeForm.js中恢复了对beforeValidate事件的修复(silverfire)
  2. Enh#12376:为yii.activeForm.js validate()方法添加了参数,以便能够强制validation(DrDeath72)
  3. Enh#12499:当启用AJAXvalidation时,yii.activeForm.js将在表单提交时强制运行以显示所有可能的错误(silverfire)
  4. Enh#12744:将afterInit事件添加到yii.activeForm.js(werew01f)

它们可以用v2.0.9中的oder js文件替换吗?

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

有没有更好的解决方案来防止多次提交?

看来这个问题已经得到了解决。
那些通过composer php安装了新的Yii 2.0.10的人不会有这个问题; 而从“从存档文件安装”部分下载存档文件的人可能仍会遇到此问题,因为他们可能没有更新存档文件。

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

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

奇迹般有效

我实现并测试了以下扩展:

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

composer php要求

"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(); 

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

 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'); ?>