5. RTE
5.3 API
5.3.3 API インスタンスの実装方法
起動されたSCOとLMSとで通信を確立するには,まずAPIインスタンスを呼び出す必要が ある.SCOはAPIインスタンスが実装されているLMSウィンドウ(APIフレーム)が見つかる まで,親およびオープナ・ウィンドウの階層を再起的に探索することが必要となる.ここでLMS ウィンドウは,API インスタンスを(”API_1484_11”と命名される)DOM オブジェクトとして アクセスできるように,LMS側で提供しなければいけない.
3 APIインスタンス(API Instance)は,SCORM 1.2以前ではAPIアダプタ(API Adapter)
と呼ばれていた.
4 SCORM 2004では,APIインスタンスの名称が”API”から”API_1484_11”に変更された.
5.3.3.1 LMSの責任範囲
LMSはAPIインスタンスを提供しなければならない.API インスタンスを提供するための必 要条件は以下のとおりである.
・ APIインスタンスは, API_1484_11 と命名されるオブジェクトとしてアクセス可能でな ければならない.
・ API インスタンスは,SCOからECMAScript(Javaスクリプト)でアクセス可能でなく てはならない.
・ LMSは,API インスタンスを含んでいる子ウィンドウあるいは,LMS ウィンドウの子フ レームであるブラウザ・ウィンドウでSCOを起動しなければならない.
親ウィンドウ3 親ウインドウ2
親ウインドウ1
SCO API̲1484̲11
API̲1484̲11
ウィンドウ・オープナ
SCO API̲1484̲11
API̲1484̲11
親ウィンドウ3 親ウィンドウ2
親ウィンドウ1
SCO
親ウィンドウ4
ウィンドウ・オープナ
API̲1484̲11 API̲1484̲11
図 5.3 API の起動方法
5.3.3.2 SCOの責任範囲
SCOは,APIインスタンスを探索して,LMSと通信を確立できるようにしなければならない.
SCOがDOMウィンドウ内に配置されているAPIインスタンスを見つける為には,以下の範囲 を探索しなければならない.
・ 現在のウィンドウに対する親ウィンドウの連鎖=連鎖している親ウィンドウがトップ・ウ ィンドウになるまで探索する.
・ ウィンドウ・オープナ(window.opener)=SCOのウィンドウをオープンしたウィンドウ.
・ ウィンドウ・オープナに対する親ウィンドウの連鎖.
親ウィンドウN 親ウィンドウ2
親ウィンドウ1
SCO
SCO
親ウィンドウの連鎖
親ウィンドウN 親ウィンドウ2
親ウィンドウ1
ウィンドウ・オープナの親ウィンドウの連鎖
図 5.4 API インスタンスの探索
また,SCOがAPIインスタンスを見つけると,最低限,Initialize(“”)とTerminate(“”)のAPI を呼び出さなくてはならない.IEEE標準規格では,ECMA スクリプト(Java スクリプト)の 簡単なコードを利用して API インスタンスを探索する方法を提供している.しかし規格では ECMAスクリプトの利用を必要条件としていないので,他の方法を採用することもできる.
APIインスタンスを再帰的に探索するためのサンプルコードは以下のとおりである.
<html>
<head>
<script type=”text/javascript”>
<!‑‑
//‑‑‑‑‑ API インスタンスを見つける ‑‑‑‑‑ var API = null;
function FindAPI(win) {
if ((typeof(win.API̲1484̲11) != “undefined”) && (win.API̲1484̲11 != null)) { return win.API̲1484̲11;
} else if (win.location == top.location) { return null;
} else {
return FindAPI(win.parent);
} }
function MyInit() {
// API フレームを見つける
if ((window.parent != null) && (window.parent != window)) { API = FindAPI(window.parent);
}
// ウィンドウ・オープナにある API フレームを見つける if ((API == null) && (window.opener != null)) { API = FindAPI(window.opener);
}
if (API != null) { // 初期化を行います API.Initialize("");
} else {
alert("API が見つかりません.");
} }
funciton MyFin() { if (API != null) { // 終了処理を行います API.Terminate("");
} } //‑‑>
</script>
</head>
<body onload=”MyInit();” onunoad=”MyFin()”>
<h1>SCORM サンプル</h1>
</body>
</html>