技術資料

ダッシュボードのパフォーマンス改善:Ajaxとiframeの実践例

2024.12.11

システム管理画面のログイン後のダッシュボードなど、雑多な情報を表示する画面を出力する際、サーバーサイドで全部処理してから出力するようにすると、画面が表示されるまでの体感時間が長くなってちょっと微妙な時があります。

例えば、ログイン後のダッシュボードに、「サイトのアクセスランキング」「新規問合せ件数」「新着お知らせ」が表示される場合、ダッシュボード画面を出力してからそれぞれの処理を呼び出すような設計の方が、システムの構造的にも、UX的にも良さそうな気がします。

そういう時の手段としては、

  • Ajaxで呼び出す
  • iframeで呼び出す

あたりが、シンプルな解決手段になるのかなという気がします。

Ajax で呼び出す

例えば、Ajaxで以下の3つのスクリプトを呼び出して表示する場合。

  • access_ranking.php
  • contact_notice.php
  • recent_news.php

HTMLは以下のような感じに。

<script type="text/javascript">
    // 呼び出すスクリプトの一覧
	const load_url = [
		'https://mydomain/path/to/script/access_ranking.php',
		'https://mydomain/path/to/script/contact_notice.php',
		'https://mydomain/path/to/script/recent_news.php'
	];
</script>

<div>
    <!-- 一つ目のスクリプト呼び出し -->
    <script type="text/javascript">
        loadContents(load_url[0]);
    </script>
    <!-- 二つ目のスクリプト呼び出し -->
    <script type="text/javascript">
        loadContents(load_url[1]);
    </script>
    <!-- 三つ目のスクリプト呼び出し -->
    <script type="text/javascript">
        loadContents(load_url[2]);
    </script>
</div>

わざわざscript要素をスクリプト呼び出し毎に三つに分けている理由は後述します。

Ajaxで呼び出すスクリプト側(jQuery)は以下のような感じ。

function loadContents(load_url){
    let element = document.currentScript;
    $.ajax({
        url: load_url,
        type: 'GET',
        dataType: 'html',
        timeout: 5000,
    })
    .done(function(data) {
        element.insertAdjacentHTML('beforebegin', data)
    })
    .fail(function(jqXHR, textStatus) {
        // エラー時の処理
        console.log(textStatus);
        console.log(jqXHR);
        alert('Error: loadContents ' + load_url);
    });
}

ポイントは、document.currentScriptで、呼び出されたscript要素を取得してる点。これにより、処理成功時にelement.insertAdjacentHTML('beforebegin')で、呼び出された位置に、データを出力することができます。

script要素を3つに分けていない場合、3つの処理のうち、そのタイミングで処理完了が一番早かったものから順番に出力されてしまうため、出力するコンテンツの順番が、アクセスするタイミングによって異なってしまう可能性があります。それを解決するために、scriptを3つに分けて、呼び出された位置に出力する処理を行なっています。

iframe で呼び出す

ぶっちゃけ、こっちの方が基本的にはシンプルで良いと思っています。Ajaxでやると、予期せぬエラーが出た時のデバッグが色々面倒だし。

「出力する縦横幅が可変だがスクロールバーを出したくない」みたいなケース以外はiframeで良い気がします。

<div>
    <iframe src="https://mydomain/path/to/script/access_ranking.php"></iframe>
    <iframe src="https://mydomain/path/to/script/contact_notice.php"></iframe>
    <iframe src="https://mydomain/path/to/script/recent_news.php"></iframe>
</div>

contenteditableで作るインライン編集システムとデータ送信の仕組み

2024.12.03

contenteditable属性を利用すれば、HTML内のテキストを直接編集できるインターフェースを構築できます。 本記事では、contenteditableを活用したインライン編集機能の実装手法について解説します。 UIの向上を目指す際の参考として。

CSS HTML JavaScript jQuery

セレクトボックスでデータ更新を実現する仕組みと実装例

2024.11.29

「チェックボックスを使ったデータ更新の仕組み」に続く記事として、今回はセレクトボックスを活用したデータ更新の方法をご紹介します。複数の選択肢から値を選び、それをサーバー側に送信して更新する仕組みを、実装例とともに解説します。

HTML JavaScript jQuery

チェックボックスでデータ更新を実現する仕組みと実装例

2024.11.27

一覧画面のチェックボックスを用いて、データの状態を即時に更新する仕組みを実装する方法を解説します。HTMLの構造設計からJavaScriptの連携処理、サーバーサイドでの対応まで、説明しています。

HTML JavaScript jQuery

datalistとJavaScriptで作るタグ入力フォームの実装ガイド

2024.11.17

ブログやアプリケーションで便利な「タグ入力フォーム」。この記事では、datalist要素を利用して、既存タグの選択と新規タグの追加を同時に実現するUIの作成方法をご紹介します。さらに、JavaScriptとCSSを活用して、複数選択対応やタグ削除機能、Enterキーでのタグ追加機能も実装。タグ入力フォームを効率的かつユーザーフレンドリーにカスタマイズする方法を詳しく解説します。

CSS HTML JavaScript jQuery

阿部辰也へのお仕事の依頼・お問い合わせ

お名前 *必須
会社名
メールアドレス *必須
電話番号
URL
お問い合わせのきっかけ
お問い合わせの内容 *必須
個人情報の取り扱いについて *必須 プライバシーポリシーをご確認いただき、同意いただける場合は「同意する」にチェックをしてください。

keyboard_double_arrow_up
TOP