サンプルデモ
テキストだけだと分かりづらいと思うので、下記のデモページをご覧下さい。このライブラリの特徴は、エレメントと関数を結び付けることです。エレメントが見えたタイミングで、関数が実行されるのを確認して下さい。ここでは3つのペアをエントリーしています。
この記事は、Advent Calendar、「らいとなデブ SYNCER」の3日目の記事です。指定したエレメントが画面内に見えたタイミングで関数を実行できる、ちょこっと便利なライブラリ、LazyLoadFunctionを公開、配布します。複数指定に対応していて、jQueryは必要ありません。「Google Mapsを遅れて読み込みたい」などといった場合に有用です。
テキストだけだと分かりづらいと思うので、下記のデモページをご覧下さい。このライブラリの特徴は、エレメントと関数を結び付けることです。エレメントが見えたタイミングで、関数が実行されるのを確認して下さい。ここでは3つのペアをエントリーしています。
LazyLoadFunctionのライブラリは、下記より、ダウンロードして下さい。
ファイル一覧
ファイル名をクリックすると内容を確認できます。「Download Zip」をクリックするとファイル一式をダウンロードできます。
ご利用の際は、付属のREADMEファイル(readme.txt)をご確認下さい。
ダウンロードしたファイルを解凍して下さい。基本的に利用するのは、lazyloadfunction.jsだけで大丈夫です。他は全て、デモ用に用意されたファイルです。
SYNCER000676.zip
それでは早速、LazyLoadFunctionを実装してみましょう。今回は、2つのエレメントと関数を結びつけてみましょう。
まずはヘッダー内で、ライブラリのファイルを読み込んで下さい。
HTML
<head>
<!-- JavaScriptの読み込み -->
<script src="./lazyloadfunction.js"></script>
</head>
続いて、「これが見えたら関数を実行する」というエレメントを配置しましょう。エレメントには、任意のid属性値を付けておいて下さい。ここでは、aaa
、bbb
というidを付けておきます。2つのエレメントは、離しておいた方が分かりやすいと思います。
HTML
<p id="aaa">id:aaa</p>
<br><br><br><br><br><br><br><br><br><br>
<br><br><br><br><br><br><br><br><br><br>
<br><br><br><br><br><br><br><br><br><br>
<br><br><br><br><br><br><br><br><br><br>
<br><br><br><br><br><br><br><br><br><br>
<p id="bbb">id:bbb</p>
次に、実行するための関数を用意して下さい。とりあえずは、簡単にアラートを表示しておけばいいですね。なお、LazyLoadFunctionを通して関数が実行された場合、引数に対象エレメントのノードを受け取ります。
JavaScript
function alert1( element ) {
alert( "要素が見えましたー。その1" ) ;
}
function alert2( element ) {
alert( "要素が見えましたー。その2" ) ;
}
ここから、LazyLoadFunctionをセットアップします。方法は簡単で、次のように、insert()
メソッドに、id属性値と、関数名を指定して下さい。例えば、次のように指定することで、「id属性値がaaa
のエレメントが画面に見えたら、関数alert1
を実行する」というようにセットされます。
JavaScript
LazyLoadFunction.insert( {
id: "aaa" , // エレメントのID名
action: alert1 , // 実行したい関数名
} ) ;
今回は、2つのエレメントと関数を結びつけるから、次のようにinsert()
メソッドを2回実行することになりますね。
JavaScript
// [#aaa]と[alert1]を結びつける
LazyLoadFunction.insert( {
id: "aaa" , // エレメントのID名
action: alert1 , // 実行したい関数名
} ) ;
// [#bbb]と[alert2]を結びつける
LazyLoadFunction.insert( {
id: "bbb" , // エレメントのID名
action: alert2 , // 実行したい関数名
} ) ;
もちろん、次のように、2つのエレメントに同じ関数をセットしても問題ありません。
JavaScript
// [#aaa]と[alert1]を結びつける
LazyLoadFunction.insert( {
id: "aaa" , // エレメントのID名
action: alert1 , // 実行したい関数名
} ) ;
// [#bbb]と[alert1]を結びつける
LazyLoadFunction.insert( {
id: "bbb" , // エレメントのID名
action: alert1 , // 実行したい関数名
} ) ;
仕上げです。エレメントと関数のエントリーが全て終了したら、最後にfire()
メソッドを実行して、LazyLoadFunctionを起動して下さい。ここで初めて、各エレメントが見えた時に関数が実行されるようになります。引数には、対象エレメントが画面内にあるかチェックする頻度となるミリ秒数を指定することができます。何も指定しない場合、スクロールイベント中、250ミリ秒ごとにチェックします。
JavaScript
// LazyLoadFunctionを起動する
LazyLoadFunction.fire() ;
// チェックの頻度を縮めたければ、[10]などを指定する
// ただし、ブラウザの負担がその分、増えるのでご注意下さい
// LazyLoadFunction.fire( 10 ) ;
ここまでの説明を整理すると、HTMLファイルは次のようになるはずです。JavaScriptを記述する順番を守りましょう。関数を定義していないうちに指定しようとするとエラーになってしまいます。
HTML
<html>
<script src="./lazyloadfunction.js"></script>
</html>
<body>
<p id="aaa">id:aaa</p>
<p id="bbb">id:bbb</p>
<script>
function alert1() {
alert( "要素が見えましたー。その1" ) ;
}
function alert2() {
alert( "要素が見えましたー。その2" ) ;
}
// [#aaa]と[alert1]を結びつける
LazyLoadFunction.insert( {
id: "aaa" , // エレメントのID名
action: alert1 , // 実行したい関数名
} ) ;
// [#bbb]と[alert2]を結びつける
LazyLoadFunction.insert( {
id: "bbb" , // エレメントのID名
action: alert2 , // 実行したい関数名
} ) ;
// LazyLoadFunctionを起動する
LazyLoadFunction.fire() ;
</script>
</body>
LazyLoadFunctionは、次のようにinsert()
メソッドの引数にオブジェクトリテラルを指定することで、ある程度の調整ができます。id
とaction
のみ、指定必須です。
JavaScript
LazyLoadFunction.insert( {
id: "aaa" , // ID名
action: read_google_maps , // シャッターをかけるクラス名
offsetTop: 200 , // 上方向のオフセット値
offsetBottom: 200 , // 下方向のオフセット値
offsetLeft: 200 , // 左方向のオフセット値
offsetRight: 200 , // 右方向のオフセット値
} ) ;
指定できるオプションは、下記の通りです。
プロパティ名 | 説明 |
---|---|
id | エレメントのid属性値。 |
action | エレメントが見えた時に実行する関数。 |
offset | 上下左右のオフセット値をまとめて指定する。例えば200pxを指定した場合、対象のエレメントが見える200px前の時点で関数が実行される。 |
offsetTop | 上方向のオフセット値。 |
offsetBottom | 下方向のオフセット値。 |
offsetLeft | 左方向のオフセット値。 |
offsetRight | 右方向のオフセット値。 |
LazyLoadFunctionには、次のメソッドが用意されています。
メソッド名 | 説明 |
---|---|
insert( options ) | エレメントと関数のペアをエントリーに追加する。引数に、オプションオブジェクトを指定する。 |
fire( delay ) | 起動する。引数に、チェックの頻度となるミリ秒数を指定できる。デフォルトでは250 がセットされているが、これを1 にすれば、チェックの頻度が高まるが、ブラウザにその分、負担がかかる。 |
destroy() | エントリーを個別に破棄する。引数には、対象エレメントのid属性値を文字列で指定する。 |
destroyAll() | 全てのエントリーを破棄する。スクロールイベントも解除される。 |
check() | 各エレメントが見えているかチェックし、必要であれば関数が実行される。 |
例えば、エントリーしたエレメントと関数のペアを全て削除したい場合は、次のようにdestroyAll()
メソッドを実行して下さい。
JavaScript
// LazyLoadFunctionを停止する
LazyLoadFunction.destroyAll() ;
id属性値がaaa
のエレメントに設定したエントリーを削除したい場合は、次のようにdestroy()
メソッドを実行しましょう。
JavaScript
// [#aaa]に設定したエントリーを破棄する
LazyLoadFunction.destroy( "aaa" ) ;
info@syncer.jp