2016-11-15 30 views
0

Этот вопрос был задан до этого вопроса: Prevent multiple clicks and ActiveForm submission in Yii 2.0.10Yii2 активная форма отправить событие вызывается дважды

Симптомы

У меня есть активная форма с id равна surasGo. Я приложил submit событие, используя JQuery для обработки некоторых задач перед отправкой. Я заметил, что любая функция alert в функции события создается дважды. Я проверил источник страницы HTML, и я нашел следующие фрагменты:

... 
jQuery('#surasGo').yiiActiveForm([], []); 
});</script></body> 

перед предыдущим фрагментом есть связанные файл яваскрипт содержит мой код:

$('#surasGo').submit(function(e){ 
    e.preventDefault(); 
    suraId = $('#surasId').val()*1; 
    verseId = $('#versesId').val()*1; 
    if (!isNaN(verseId*1) && verseId !== 0){ 
     window.location = '/verses/view/'+verseId; 
    } 
    else if (!isNaN(suraId) && suraId !== 0){ 
     window.location = '/view/'+suraId; 
    } 
    else{ 
     alert(tError+"\n"+tQAccessError);// this alerted twice for example 
    } 
    return false; 
    }); 

То, что я пытался

Я понял, что первый фрагмент jQuery('#surasGo').yiiActiveForm([], []); может отвечать за двойной вызов отправки событий из-за проверки активной формы клиента, поэтому я добавил 'enableClientValidation'=>false к активной форме:

<?php $form = ActiveForm::begin(['id' => 'surasGo','enableClientValidation'=>false, 'action'... 

Тем не менее, форма по-прежнему, кажется, подвергается отправке события дважды! В чем причина этого странного поведения и как его решить?

+1

Вы можете попробовать '$ ('тело') на ('Submit', '#surasGo', функция (е) {})' – jagsler

+0

@jagsler Да, я попробовал это, как вы сказали, и работает отлично.Однако, в чем причина, которая делает мой путь $ ('# surasGo'). Submit (... «повторное применение события дважды? – SaidbakR

+0

Не знаю ... имела ту же самую проблему. Принял меня навсегда, чтобы найти это решение . – jagsler

ответ

1

Я думаю, вам также необходимо прекратить выполнение любой последующей последовательности обработчиков событий. Это может быть сделано путем вызова event.stopImmediatePropagation() в дополнение к event.preventDefault().

Попробуйте так:

$('#surasGo').submit(function(e){ 
    e.preventDefault(); 
    e.stopImmediatePropagation(); // this is required in some cases 
    suraId = $('#surasId').val()*1; 
    verseId = $('#versesId').val()*1; 
    if (!isNaN(verseId*1) && verseId !== 0){ 
     window.location = '/verses/view/'+verseId; 
    } 
    else if (!isNaN(suraId) && suraId !== 0){ 
     window.location = '/view/'+suraId; 
    } 
    else{ 
     alert(tError+"\n"+tQAccessError);// this alerted twice for example 
    } 
    return false; 
    }); 
2

работает как шарм

Я реализованного и проверенного следующее расширение:

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(); 
+0

Люди предложили обновить до Yii2 2.0.10, у которого есть предполагаемое исправление, но это не сработало для меня. –

0

Ssetting 'validateOnSubmit' => false для ActiveForm работал для меня.

$form = ActiveForm::begin(['id' => 'my-form-id', 'validateOnSubmit' => false]);