我经常使用ActiveForms并发现它很方便,因为它包含客户端验证脚本yii.js
和yii.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
有两处变化:
和,yii.activeForm.js
有四处变化:
可以用v2.0.9中的oder js文件替换它们吗?
替换js文件会导致故障和意外行为吗?
是否有更好的解决方案可以阻止多次提交?
答案 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'); ?>