株式会社NextCodeのロゴ株式会社NextCode

BLOG

ブログ

2021/07/15

IEでフォームが二重送信される 原因と解決方法

とあるシステムにて問題が発生しました。

それがタイトルにもある通り、IEだけフォームが二重送信されているのです。

問題が起きたのはECサイトだったのですが、カートに2つ商品が追加されていました。

最初はバックエンド側(PHP)に問題があるのかと見ていたのですが、ネットワークを見ると2つ送られている事が発覚しました。

同じ問題が発生した場合に、解決出来る様に原因と解決方法を記載しておきます。

原因

問題が発生したフォームは次の様なものでした。

HTML

<form>
    <button type="button" onclick="addCart();">カートに追加</a>
</form>

JavaScript

<script>
    function addCart() {
        $('form').submit();
    }
</script>

「カートに追加」ボタンを押下されると、そのままフォームを送るのではなく、JavaScriptで送るといった事をしていました。

※上記のコードだけでは、JavaScriptでフォーム送信する必要がないかと思われますが、実際のシステムではもう少し複雑な事をしています。分かりやすい様に不要な部分を省いています。

何故、二重送信されたかと言うと、HTMLのフォーム送信 と JavaScriptのフォーム送信の両方が送信されている為でした。

ChromeやFirefoxなどでは<button>タグでフォームの送信がされないのですが、IEでは<button>タグでもフォームが送信されてしまいます。

これが原因でした。

解決方法

次の様に変更する事で解決しました。

HTML

addCartの前に「return」を追加

<form>
    <button type="button" onclick="return addCart();">カートに追加</a>
</form>

JavaScript

フォーム送信の後に「return false」を追加

<script>
    function addCart() {
        $('form').submit();
        return false;
    }
</script>

JavaScriptでフォーム送信をしたあとは、HTMLでのフォーム送信をキャンセルしています。

これでフォームの二重送信が解決しました。

バックエンドを見てしまいがちなので、ハマってしまうと時間が掛かると思います。

今回は問題が発生したのがIEと事前にクライアントから情報を頂けたので、比較的スムーズに解決しました。

知っているか知らないかでハマり度合いが違うと思うので、片隅にでも入れておきましょう!

TOPへ移動
PAGE
TOP
%d人のブロガーが「いいね」をつけました。