簡體   English   中英

在Yii 2.0.10中防止多次點擊和ActiveForm提交

[英]Prevent multiple clicks and ActiveForm submission in Yii 2.0.10

我經常使用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版本帶來了一些更改,並且無法在上面的腳本 現在,如果上面的代碼執行,它將不會提交表單。
它在前面已經討論過並且已被確定為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()方法添加了參數,以便能夠強制驗證(DrDeath72)
  3. Enh#12499:當啟用AJAX驗證時,yii.activeForm.js將在表單提交時強制運行以顯示所有可能的錯誤(silverfire)
  4. Enh#12744:將afterInit事件添加到yii.activeForm.js(werew01f)

它們可以用v2.0.9中的oder js文件替換嗎?

替換js文件會導致故障和意外行為嗎?

有沒有更好的解決方案來防止多次提交?

看來這個問題已經得到了解決。
那些通過作曲家安裝了新的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

作曲家要求

"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

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM