@ozonosho (翔 大薗)

Are you sure you want to delete the question?

If your question is resolved, you may close it.

Leaving a resolved question undeleted may help others!

We hope you find it useful!

validationEngineでAjaxを利用して独自のバリデーションを追加したところ送信時に2回処理が走ってしまう

解決したいこと

validationEngineでAjaxを利用して独自のバリデーションを追加したところ、Ajaxを経由するバリデーションをつけたフォームだけ送信時に2回処理が走ってしまいます。
2回ボタンが押されるわけではなく、フォームで設定したaction=""の飛び先の処理が2回実行されてしまうような状況です。
どなたかお知恵を貸していただけますと幸いです。

下記、簡易化したコードです

発生している問題・エラー

<form method="post" class="validation-form" action="create_topic.php">

    <label>相談タイトル</label>
    <input id="topic-title" name="topic-title" type="text" class="validate[required,ajax[ngword]]">

    <label>相談内容</label>
    <textarea id="topic-content" name="topic-content" class="validate[required,ajax[ngword]]"></textarea>

    <button type="submit">この内容で相談する</button>

</form>

<script type="text/javascript">
$(function(){
    $(".validation-form").validationEngine('attach', {
        promptPosition:"bottomLeft",
        ajaxFormValidationMethod: 'post',
        focusFirstField: false,
        scroll: false,
        allrules: {
            ngword: {
                url: 'validation.php',
                alertText: '* NGワードが含まれています',
                alertTextOk: '',
                alertTextLoad: ''
            }
        },
    });
});
</script>

上記のうち、
・validation.phpはajaxの飛び先でNGワードチェックをして成否を返すコード
・create_topic.phpはフォームの送信データを受け取り投稿記事を作成するコード
です。

現状、リアルタイムでも送信ボタンをクリックしてもバリデーションチェックは正常に動作しますが、チェック後に送信された際にcreate_topic.phpの処理が2回実行されてしまいます。

ajaxのバリデーションを除いて、

<script type="text/javascript">
$(function(){
    $(".validation-form").validationEngine('attach', {
        promptPosition:"bottomLeft",
    });
});
</script>

とすると、1回しか実行されないのでajaxのバリデーションが何か悪さをしていることまでは分かったのですが、、、

validation.phpでは単純な文字列比較のみしかおこなっておらず、送信をもう一度おこなうような処理は加えていないので、何を直せば良いのか行き詰っています。

0 likes

1Answer

ざっとコードを読んだ感じでは、フォームの送信ボタンを押すとフィールドのバリデーションが実行されて、そのバリデーションが通るとフォームの送信を実行するようです。それがフォームの通常の送信処理と重複した結果2回送信されてしまうのではないかと思います。

また onValidationComplete オプションに false を返す関数を渡すと通常の送信をキャンセルできるようです。

$(".validation-form").validationEngine('attach', {
  onValidationComplete: function() { return false; },
  // 略
});

こうすればバリデーションが通った後の送信だけが実行されるのではないかと。

1Like

Comments

  1. @ozonosho

    Questioner

    ご丁寧にありがとうございます。
    助かります。

    記載いただいた方法を試したところ、送信自体がされなくなってしまいました。
    通常の入力必須バリデーションなどは1度しか送信されないため、バリデーション全体ではなくajaxのチェックだけ何か問題があるのかなと思っています。

    ソースをもう少し読んでみます!

Your answer might help someone💌