2016-11-15 94 views
0

这个问题已经这个问题之前,有人问: Prevent multiple clicks and ActiveForm submission in Yii 2.0.10Yii2活性形式提交事件两次调用

症状

我有id活性形式等于surasGo。我使用Jquery附带了submit事件来处理提交之前的一些任务。我注意到事件函数中的任何alert函数都会产生两次。我检查了网页的HTML源代码,我发现下面的代码片段:

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

以前的片段前方有链接的JavaScript文件包含我的代码:

$('#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

你可以尝试'$( '身体')上( '提交', '#surasGo',函数(E){} )' – 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": "*"

注册资产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' => falseActiveForm为我工作。

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