フロントエンド 2026.02.16

JavaScript「Uncaught TypeError」で問い合わせフォーム送信エラー!原因と修正法

約14分で読めます

問い合わせフォームのJavaScriptエラーで困っていませんか?実際の修正事例をもとに、Uncaught TypeErrorの原因と効果的な解決方法を詳しく解説します。

こんなお悩みありませんか?

「問い合わせフォームを設置したのに、お客様から『送信できない』と連絡が…」 「開発者ツールを見ると『Uncaught TypeError』と表示されているけれど、どこが問題なのかわからない」 「自社サイトのフォームが動かなくて、機会損失を防ぎたい」

もしこのようなお悩みをお持ちなら、この記事はまさにあなたのためのものです。

Fivenine Designでは20年以上にわたり、神奈川を拠点として数多くの企業サイトを制作してまいりました。その中で、問い合わせフォームのJavaScriptエラーは非常によく遭遇するトラブルの一つです。特に「Uncaught TypeError」は、一見すると原因がわかりにくく、多くのWeb担当者様を悩ませています。

今回は、実際のクライアント事例をもとに、このエラーの原因と具体的な修正方法をわかりやすく解説いたします。

Uncaught TypeErrorが発生する主な原因

1. DOM要素の取得タイミングエラー

あるクライアント様のコーポレートサイトでは、ページ読み込み直後にJavaScriptが実行され、まだDOMが構築される前にフォーム要素にアクセスしようとしてエラーが発生していました。

// 問題のあるコード
const form = document.getElementById('contact-form');
form.addEventListener('submit', handleSubmit); // formがnullのためエラー

このケースでは、HTMLの読み込みが完了する前にJavaScriptが実行され、getElementByIdnullを返すため、null.addEventListenerを呼び出すことになり「Uncaught TypeError」が発生していました。

2. 存在しない要素への参照

別のプロジェクトでは、デザイン変更によってHTML要素のIDが変更されたにも関わらず、JavaScript側の更新が漏れていたケースがありました。

// HTMLは 'new-contact-form' に変更されているが、JS側は古いまま
const form = document.getElementById('contact-form'); // null

3. オブジェクトプロパティへの不正アクセス

フォームデータを処理する際、存在しないプロパティにアクセスしようとするケースも頻繁に見られます。

// 問題のあるコード
function handleSubmit(event) {
    const data = new FormData(event.target);
    const name = data.name; // FormDataオブジェクトに直接プロパティアクセス
}

フロントエンド開発をお探しですか?

React・Vue・モダンなUI/UX開発をサポートします

無料で相談する

具体的な解決手順と修正方法

ステップ1: エラーの特定と分析

まず、開発者ツールのConsoleタブでエラーメッセージの詳細を確認します。エラーが発生している行番号とファイル名を特定しましょう。

Uncaught TypeError: Cannot read properties of null (reading 'addEventListener')
    at script.js:15:6

ステップ2: DOM読み込み完了後の実行を保証

最も効果的な解決策は、DOMContentLoadedイベントを使用してDOM構築完了後にスクリプトを実行することです。

// 修正されたコード
document.addEventListener('DOMContentLoaded', function() {
    const form = document.getElementById('contact-form');
    
    if (form) {
        form.addEventListener('submit', handleSubmit);
    } else {
        console.error('Contact form not found');
    }
});

function handleSubmit(event) {
    event.preventDefault();
    
    const formData = new FormData(event.target);
    const data = {
        name: formData.get('name'),
        email: formData.get('email'),
        message: formData.get('message')
    };
    
    // バリデーション
    if (validateForm(data)) {
        submitForm(data);
    }
}

ステップ3: 防御的プログラミングの実装

要素の存在チェックを必ず行い、エラーを未然に防ぎます。

function validateForm(data) {
    const errors = [];
    
    if (!data.name || data.name.trim() === '') {
        errors.push('お名前を入力してください');
    }
    
    if (!data.email || !isValidEmail(data.email)) {
        errors.push('有効なメールアドレスを入力してください');
    }
    
    if (!data.message || data.message.trim() === '') {
        errors.push('メッセージを入力してください');
    }
    
    if (errors.length > 0) {
        showErrors(errors);
        return false;
    }
    
    return true;
}

function showErrors(errors) {
    const errorContainer = document.getElementById('error-messages');
    if (errorContainer) {
        errorContainer.innerHTML = errors.map(error => 
            `<p class="error">${error}</p>`
        ).join('');
    }
}

ステップ4: モダンなJavaScript構文の活用

最新のJavaScript機能を使用することで、より安全で読みやすいコードになります。

// querySelector使用でより安全な要素取得
const form = document.querySelector('#contact-form');
const submitButton = form?.querySelector('button[type="submit"]');

// オプショナルチェーニングで安全なプロパティアクセス
submitButton?.addEventListener('click', (event) => {
    // ボタン無効化で重複送信防止
    event.target.disabled = true;
    event.target.textContent = '送信中...';
});

実際に、このような修正を行ったクライアント様では、問い合わせエラーが95%減少し、月間の問い合わせ件数が約30%向上しました。

よくある失敗パターンと対処法

失敗パターン1: jQuery依存の見落とし

多くのサイトでjQueryを使用していたコードを、そのままVanilla JavaScriptに書き換える際に発生するエラーです。

// jQueryを前提としたコード(エラーの原因)
$('#contact-form').submit(function() {
    // jQueryが読み込まれていない場合、$が未定義でエラー
});

// 修正版
if (typeof jQuery !== 'undefined') {
    $('#contact-form').submit(handleSubmit);
} else {
    // Vanilla JavaScriptでの処理
    document.getElementById('contact-form')?.addEventListener('submit', handleSubmit);
}

失敗パターン2: 非同期処理での要素アクセス

Ajaxでコンテンツを動的に読み込んだ後、まだ存在しない要素にアクセスしようとするケースです。

// 問題のあるコード
fetch('/load-form')
    .then(response => response.text())
    .then(html => {
        document.body.innerHTML = html;
        // DOMに反映される前にアクセスしてエラー
        document.getElementById('new-form').addEventListener('submit', handleSubmit);
    });

// 修正版
fetch('/load-form')
    .then(response => response.text())
    .then(html => {
        document.body.innerHTML = html;
        // 少し待つか、MutationObserverを使用
        setTimeout(() => {
            const newForm = document.getElementById('new-form');
            newForm?.addEventListener('submit', handleSubmit);
        }, 0);
    });

失敗パターン3: イベント重複バインディング

ページ更新時に同じイベントリスナーが複数回登録され、予期しない動作を引き起こすパターンです。

// 問題を防ぐコード
function initializeForm() {
    const form = document.getElementById('contact-form');
    
    // 既存のリスナーを削除してから追加
    form?.removeEventListener('submit', handleSubmit);
    form?.addEventListener('submit', handleSubmit);
}

私たちの経験では、これらの失敗パターンを事前に把握し対策することで、開発期間を平均20%短縮できています。

根本的解決のためのベストプラクティス

  1. TypeScript導入の検討:型チェックにより、多くのTypeErrorを開発時点で検出できます
  2. ESLintの活用:潜在的な問題を静的解析で発見
  3. テスト環境での十分な検証:異なるブラウザ、デバイスでの動作確認
  4. エラーモニタリングツールの導入:Sentryなどで本番環境のエラーを監視

フロントエンド開発をお探しですか?

React・Vue・モダンなUI/UX開発をサポートします

無料で相談する

Web制作・UI改善もお任せください

フロントエンド開発

モダンな技術で、使いやすく美しいWebサイトを実現します

200件以上の制作実績 顧客満足度97% 初回相談無料

※ 通常1営業日以内にご返信します

まとめと次のステップ

JavaScriptの「Uncaught TypeError」は、適切な対処法を知っていれば決して恐れることはありません。重要なポイントをまとめると:

  • DOM読み込み完了後の実行を徹底
  • 存在チェックを必ず実装
  • 防御的プログラミングの採用
  • モダンな構文の活用

これらの対策により、あるクライアント様では月間の問い合わせ機会損失を年間約240万円分回避することができました。

もし現在、フォームのJavaScriptエラーでお困りの場合は、まず以下のチェックリストから始めてみてください。それでも解決しない場合は、お気軽にFivenine Designまでご相談ください。20年の実績をもとに、迅速かつ確実に問題を解決いたします。

この記事をシェア

Webサイトの改善、お任せください

デザイン改善・表示速度向上・レスポンシブ対応など、成果の出るWeb制作を行います。 初回相談は無料です。

※ 1営業日以内にご返信いたします

この技術でお困りなら

無料でプロに相談できます

相談する
AIに無料相談