スタートページJavascriptjQueryの基礎

jQueryによる外部ファイルの読込

jQueryを用いています。head部に <script src="http://code.jquery.com/jquery-latest.js"></script< が必要です。


外部ファイルの読込・表示(HTMLファイル)

重要! 例1~例4では、毎回クリックする前に「再読み込み」をしてください。先に行った結果が残るからです。

子ファイルをcalled/called1.htmlとします。

<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="UTF-8">
<style>.maroon {color:maroon}</style>        <!-- ア -->
<script>
function funcHead() {
    alert("called1.html head部script実行");  <!-- イ -->
}
</script>
</head>
<body>
<script>
function funcBody() {
    alert("called1.html body部script実行");  <!-- ウ -->
}
</script>
<style>.teal{color:teal}</style>             <!-- エ -->
<tagA>                                      <!-- オ -->
<p id="idB">カ <p id="idB"><br> 
<span class="maroon">キ class="maroon"</span>
<span class="teal">ク class="teal"</span>
<span class="red">ケ class="red"</span>
</p>                                         <!-- コ -->
<h4 class="teal">サ class="teal"</h4>
シ<button onClick="funcHead()">funcHead実行</button><br>
ス<button onClick="funcBody()">funcBody実行</button><br>
</tagA>                                     <!-- セ -->
<img src="120x80.jpg"><br>                   <!-- ソ -->
<img src="called/120x80.jpg">                <!-- タ -->
</body>
</html>

例1(関数A):子ファイルの全体を<div id="表示場所1"></div>に表示

<script>
function 関数A() {
    $("#表示場所1").load("called/called1.html");
}   // ↑ 表示場所がidで指定されているので#をつける
</script>
<button onClick="関数A()">関数A()</button>
<div id="表示場所1"></div>
  • キはア、ク・サはエでの指定が反映されています。
  • ケ:redは子HTMLでは指定がなく、親HTMLのhead部のstyleでの指定が反映されています。
  • シはイ、スはウで定義されており実行されます(Internet Exprolor ではscriptは引き継がれないようです)。
  • ソ・タ:120x80.jpgは、子HTMLからは120x80.jpg、親HTMLからはcalled/120x80.jpgの相対位置にあります。
    親HTMLでの相対位置が有効になり、ソはエラーになりタが表示されます。

例2(関数B):同上。ファイル名と表示場所の引数渡し

<script>
function 関数B(ファイル名, 表示場所) {
    $(表示場所).load(ファイル名);   // 表示場所は引数で#がついている。#表示場所ではエラーになる
}</script>
<button onClick="関数B('called/called1.html', '#表示場所2')">関数B()</button>
<div id="表示場所2"></div>

例3(関数B):特定のタグ範囲だけの読込表示(<tagA> オ~セの部分)

ファイル名の後に、半角スペース+タグ の形式で範囲を指定します。
<div>や<p>のようなタグが使えます。
<html>のような利用者独自のタグも使えます(google Crome は不許可)。
<html>や<body>のようなタグは使えません。

maroon(ア)、teal(エ)のclassは指定範囲外なので反映されません。
シ・スについても同様です。

ここをクリックする以前に例1などを実行していると、その結果が残っていて反映されてしまいます。

例4(関数B):タグの多階層で指定した範囲だけの読込表示(<tagA>直下の<h4> サの部分)


外部ファイルの読込・表示(テキストファイル .txt .csv など)

子ファイルをcalled/text.txtとします。

called/text.txt(UTF-8)の1行目です。

この上に空白行があり、これは3行目です。ここで改行しています。

例5(関数B):関数Bによる子ファイル(called/text.txt)の<div>への表示


↓ <div id="表示場所5"></div>
改行が無視されます。

例6(関数B):同上。表示場所を<pre>にする


↓ <pre id="表示場所6"></pre>
改行が正しく反映されます。

読み込んだ内容を変数に格納して加工($.ajax)

単に外部ファイルを表示するのではなく加工をしたい場合には、読み込んだ内容を変数に格納する必要があります。
それには、ajax(非同期通信)という方法を用います。jQueryでは、次のように記述します。

    $.ajax( {
        url: 'ファイル名',
        detaType: 'html'|'text',
        success: function( data ) { // 読み込まれた内容がdataに格納される
            // 正常に読み込まれたときの処理
        }
    ] )

例7(関数C):テキストファイルを読み込んだ内容を各行に分解する

function 関数C() {
    $.ajax( {
        url: "called/text.txt",               // 取得ファイル指定
        detaType: "text",
        success: function( 読込文 ) {           // データ取得成功後の処理。読み込まれた内容が読込文に格納される
            var 行 = new Array();                   // ┐
            読込文 = 読込文.replace(/\r/g, "");     // ├ 各行に分解する
            行 = 読込文.split("\n");                // ┘
            var 表示内容 = "";
            for (var i=0; i<行.length; i++) {
                表示内容 += 行[i] + "<br>";         // 各行にHTMLでの改行コードを付ける
            }
            $("#表示場所7").html(表示内容);        // HTMLとして表示する
        }
    });
}
改行が正しく反映されます。

例8(関数D):同上。各行データに任意の加工をする

例7での加工をする部分を別関数とし、その関数を親HTMLで記述して、関数名を引数で渡すようにしました。
その関数名を「関数D1」とすれば、関数D1(行) { ・・・ } が必要になります。

function 関数D(ファイル名, 処理関数) {
    $.ajax( {
        url: ファイル名,
        detaType: "text",
        success: function( 読込文 ) {
            var 行 = new Array();
            読込文 = 読込文.replace(/\r/g, "");
            行 = 読込文.split("\n");
            var 関数 = new Function('行', 'return ' + 処理関数 + '(行)');
            関数(行);               // 処理関数(行) が生成される
        }
    });
}

// 親HTMLで記述する処理関数
function 関数D1(行) {
    行[0] = 行[0].replace(/1行目/, "先頭行");
    行[1] = "ここは空白行でした。";
    var 表示内容 = "";
    for (var i=0; i<行.length; i++) {
        表示内容 += 行[i] + "<br>";
    }
    $("#表示場所8").html(表示内容);
}

<button onClick="関数D('called/text.txt', '関数D1')">関数D);</button>
行[0]と行[1]の内容が変わりました。

例9(関数E):HTMLファイルを読み込みタグを変える

called/called1.htmlを読み込み、<tagA>の範囲の<h4>を<h2>に置き換え、<tagA>の範囲を表示します。

function 関数E() {
    $.ajax( {
        url: "called/called1.html",                  // 取得ファイル指定
        detaType: "html",
        success: function( 読込文 ) {                      // データ取得成功後の処理
            var 先頭位置 = 読込文.indexOf("<tagA>");            // ┐
            var 末尾位置 = 読込文.lastIndexOf("</tagA>") + 7;   // ├ <tagA>の範囲だけにする
            読込文 = 読込文.substring(先頭位置, 末尾位置);       // ┘
            読込文 = 読込文.replace(/h4/g, "h2");                // h4→h2
            $("#表示場所9").html(読込文);                       // 変更した内容を表示
        }
    });
}
例3と比較してください。
サが大きくなっています。
青字になっているのは親ファイルのcssの影響です。

例10(関数F):同上。変更処理の別関数化

例9と同じ処理を、例8のように、変更と表示を別関数で記述する形式にします。

function 関数F(ファイル名, 処理関数) {
    $.ajax( {
        url: ファイル名,
        detaType: "html",
        success: function(読込文) {
            var 関数 = new Function('引数', 'return ' + 処理関数 + '(引数)');
            関数(読込文);
        }
    });
}

function 関数F1(読込文) {
    var 先頭位置 = 読込文.indexOf("<tagA>");
    var 末尾位置 = 読込文.lastIndexOf("</tagA>") + 7;
    読込文 = 読込文.substring(先頭位置, 末尾位置); 
    読込文 = 読込文.replace(/h4/g, "h2");
    $("#表示場所10").html(読込文);
}

<button onClick="関数F('called/called1.html', '関数F1')">関数F();</button>

改善課題

例9、例10において、読込文の変更処理を正規表現での変更に頼っています。煩雑ですし複雑な処理を行うには不適切です。jQueryを用いた記述ができるのではないかと思うのですが、未解決のままになってます。