画面遷移制御・履歴管理(シーン機能)仕様 [ver.1.2]
- シーンコンテナ
- シーン
- シーンコンテナ内の遷移(シーンの遷移)
- メインシーンコンテナの遷移について
- シーンコンテナのタイトル
- ベースURLの指定
- HTML要素の記述に基づいたコントローラの自動バインド
- 別ウィンドウを開いてのポップアップ[ver1.2.1]
- シーンコンテナのnavigateメソッドの実行[ver1.2.1]
- h5.scene.scan関数[ver1.2.1]
- 遷移先のルーティングについて[ver1.2.1]
いわゆる「SPA」(シングルページアプリケーション)の開発をサポートする「シーン機能」の仕様を説明します。
シーンコンテナ
シーンコンテナは、シーン間の遷移を制御する単位です。
ひとまとまりのコンテンツの単位である「シーン」を内部に表示します。
メインシーンコンテナについて
シーンコンテナのうち、メインシーンコンテナとして指定されたものは、シーン遷移時にブラウザの履歴(ヒストリ)と連動します。
メインシーンコンテナは、ページ上に一つだけ作成でき、複数作成できません。
シーンの表示に必要な情報をURLに保持しているため、ブラウザの戻る、進むでも画面を遷移させての表示が可能です。
※この際、メインシーンコンテナ要素以外の部分はそのままとなります。
※現VerではパラメーターのURLでの保持は未対応です。
リロードや直接リンクへの対応については、HTMLベースの遷移の場合、遷移先のHTMLが同様にシーンの設定・実装を行っている必要があります。
(現状、HTMLベースの遷移のみ)
シーンコンテナの生成
以下の二つの方法があります。
- HTMLの記述に基づいた自動生成
- スクリプトによる生成
HTMLの記述に基づいた自動生成
ドキュメントロード前にh5.settings.scene.autoInitにtrueを設定すると、以下の条件に基づき、フレームワークによりシーンコンテナが自動生成されます。
h5.settings.scene.autoInitのデフォルト値はfalseです。
- メインシーンコンテナ
以下の条件で、上が優先。ページ上で一つだけ作成できます。- data-h5-main-scene-container属性のある要素
- mainタグ要素 ※ドキュメントロード前にh5.settings.scene.autoCreateMainContainerにtrueが設定されている場合
- bodyタグ要素 ※ドキュメントロード前にh5.settings.scene.autoCreateMainContainerにtrueが設定されている場合
- 通常のシーンコンテナ
- data-h5-scene-container属性のある要素
HTMLベースで遷移するメインシーンコンテナについては、こちらで生成するようにしてください。
※後述の「メインシーンコンテナの遷移について」>「メインシーンコンテナ生成時の注意点」を参照してください。
スクリプトによる生成
h5.scene.createSceneContainer(element, isMain)を呼び出します。
- 第1引数 … シーンコンテナにするDOM要素(jQueryオブジェクトも可)です。nullの場合、新たにdiv要素を生成してその要素をシーンコンテナとします。
- 第2引数 … メインシーンコンテナとして扱うか否か。trueを設定するとメインシーンコンテナとして扱います。
- 戻り値 … SceneContainerのインスタンスです。
この場合、配下にシーンコンテナ・コントローラーが生成されていないことが前提となります。
HTMLベースで遷移するメインシーンコンテナについては、こちらで生成しないようにしてください。
※後述の「メインシーンコンテナの遷移について」>「メインシーンコンテナ生成時の注意点」を参照してください。
シーンコンテナの取得
シーンコンテナの取得方法には以下があります。
- createSceneContainerメソッドの戻り値で取得
- h5.scene.getMainSceneContainer()メインシーンコンテナを取得
- h5.scene.getSceneContainerByName()シーンコンテナ名を指定してシーンコンテナを取得
- h5.scene.getSceneContainers()引数に要素またはセレクタを指定してシーンコンテナを配列で取得
- コントローラーのscene.getParentSceneContainer()メソッドで所属のシーンコンテナを取得
createSceneContainerメソッドの戻り値で取得
前述の「シーンコンテナの生成」>「スクリプトによる生成」を参照してください。
h5.scene.getMainSceneContainer()関数でメインシーンコンテナを取得
メインシーンコンテナはh5.scene.getMainSceneContainer()関数で取得できます。引数はありません。
h5.scene.getSceneContainerByName()関数でメインシーンコンテナを取得
第1引数にシーンコンテナ名を文字列で指定し、該当するシーンコンテナを取得します。
シーンコンテナ名は、data-h5-scene-container属性、またはdata-h5-main-scene-container属性の値が対象です。
<head><!--省略--></head>
<body>
<h1>TO</h1>
<div data-h5-scene-container="sub">
<h2>SUB</h2>
</div>
</body>
</html>
var container = h5.scene.getSceneContainerByName('sub');
h5.scene.getSceneContainers()関数でメインシーンコンテナを取得
第1引数に対象のDOM要素またはjQueryまたはセレクタ、第2引数にオプションオブジェクトを指定します。
第1引数に指定された要素を対象要素とし、対象要素にバインドされているシーンコンテナを取得します。省略した場合はbody要素が対象です。
第2引数のオプションオブジェクトは、以下のプロパティを取ります。
プロパティ名 | 型 | デフォルト | 説明 |
deep | boolean | true | 子孫要素にバインドされているコントローラも含めるかどうか(デフォルトは含める) |
第1引数に指定された要素の子要素も探索の対象に含めます。
戻り値はシーンコンテナの配列です。該当するシーンコンテナが無い場合も空配列を返します。
コントローラーのgetParentSceneContainer()メソッドで所属のシーンコンテナを取得
コントローラーから、自身の所属するシーンコンテナを取得する場合は、scene.getParentSceneContainer()メソッドで取得できます。
シーン
シーンは、ひとまとまりのコンテンツを表す単位です。
シーンはいずれかのシーンコンテナの直下に含まれて表示されます。
シーンの生成
1つのシーンのルートとなるタグにはdata-h5-scene、またはdata-h5-default-scene属性を記述します。
シーン要素はシーンコンテナ要素の直下に配置します。それ以外には配置できません。(配置した場合、処理の対象外となります)
data-h5-default-scene属性は、最初に表示するシーンに記述します。シーンコンテナ内で一つだけ記述できます。
シーンコンテナの生成時、直下先頭要素にdata-h5-scene属性、data-h5-default-scene属性のどちらも存在しない場合、フレームワークにより、自動的にシーンコンテナ直下にシーン要素(data-h5-default-scene属性を持つ)が追加され、配下の要素すべてが包含されます。
この際、シーンコンテナに後述のdata-h5-controller属性があった場合、その指定は追加されたシーン要素に移動されます。(ただし、シーン要素にdata-h5-controller属性がある場合は移動しません。)
※シーンコンテナ内に複数シーン要素が同時に存在するケースは現在未対応です。
コントローラーベースで遷移する場合、シーン要素は自動生成され、開発者が指定することはできません。
対応するコントローラーについて(シーンコントローラー)
シーン要素にはコントローラーがバインドされることが前提となります。シーンコンテナは、現在表示しているシーンのコントローラーを保持しています。(一つのみ)
これを「シーンコントローラー」と呼びます。
シーンコンテナ生成時、シーンコントローラーが指定されていない場合は、ダミーのコントローラーをバインドしています。(開発者が気にする必要はありません)
シーンコントローラーは、後述の「シーンコンテナ内の遷移(シーンの遷移)」で、遷移元からのパラメーターを受け取ることができます。
シーンコンテナ内の遷移(シーンの遷移)
シーンコンテナ内の表示を遷移させることができます。
シーンを遷移させる方法には以下があります。
- シーンコンテナのnavigateメソッドの実行
- シーンコンテナ所属コントローラーからのnavigateメソッドの実行
- シーンコンテナ所属要素からのnavigateイベントの発行
シーンコンテナのnavigateメソッドの実行
シーンコンテナのnavigateメソッドを使用します。
引数は以下の通りです。
第一引数 … 指定必須。遷移先の指定をしてします。遷移先のみであれば文字列で指定します。その他オプションが必要な場合はオブジェクトで指定します。
- 文字列の場合
- HTMLページのURL
HTMLをAjaxでロード後、以下の条件で表示部分を抽出します。- ※[ver1.2.1] 表示対象コンテナの指定があればその部分を抽出します。(後述 第二引数のcontainerプロパティで指定)
- メインシーンコンテナと同じ条件で表示部分を抽出します。
- 上記条件に合致しない場合はそのまま使用します。
- コントローラーの__name属性
文字列の終端が'Controller'である場合にコントローラーを表示するものとみなします。
この値でh5.res.requireによりコントローラーのソースファイルが読み込めることが前提となります。( リソース管理機能参照)
空のDIV要素を生成し、これにコントローラーをバインド後、シーンコンテナ内に表示します。このため、画面描画はコントローラーで行う必要があります。
- HTMLページのURL
- オブジェクトの場合
以下のプロパティを持つオブジェクトです。- to … 指定必須。上述の「文字列の場合」と同様になります。
- title … 移動した際のシーンコンテナのタイトル(後述)を設定します。
- args … 最初に表示されるシーンに対応するコントローラー生成時の第三引数を設定します。コントローラー側で__initメソッド等の仮引数に設定されます。
- navigationType … メインシーンコンテナのみで有効。遷移時のパターンを指定します。以下の値が設定できます。
- 'normal' … URLに開発者指定のパラメーターを入れます(デフォルト)。ブラウザバック等でパラメーター含めて再表示可能です。h5.scene.navigationType.NORMALと同値なのでこれを指定してもよいです。
- 'once' … URLに開発者指定のパラメーターを入れません。フレームワーク用パラメーターのみとなります。ブラウザバック等で再表示はできなくなります(再表示不可のメッセージ画面(後述)を表示)。h5.scene.navigationType.ONCEと同値なのでこれを指定してもよいです。
- 'silent' … URLは変化させずに遷移します。h5.scene.navigationType.SILTENTと同値なのでこれを指定してもよいです。
- replace … URLを置換しつつ遷移するか否か。置換して遷移する場合はtrueを設定します。(デフォルトfalse)
trueで遷移した場合、元の画面のURLは履歴から削除されるため、ブラウザバックでは戻れなくなります。 - method … toの設定値がHTMLページのURLである場合に有効。AjaxでのHTMLデータ取得時のHTTPメソッドを指定します。
- 'get' … GETメソッドで取得します(デフォルト)。h5.scene.method.GETと同値なのでこれを指定してもよいです。
- 'post' … POSTメソッドで取得します。h5.scene.method.POSTと同値なのでこれを指定してもよいです。
ブラウザバック等で再表示はできなくなります(再表示不可のメッセージ画面(後述)を表示)。
- serverArgs … toの設定値がHTMLページのURLである場合に有効。AjaxでのHTMLデータ取得時のパラメーターを指定します。jQuery.ajaxの引数のdataプロパティに相当します。ただし、直下メンバーの各値として配列以外のオブジェクトは設定できません。値の配列については、その要素にオブジェクトは設定できません。
この値は、h5.u.obj.serializeでシリアライズされた後、h5.u.obj.deserializeでデシリアライズされて使用されます。このため、シリアライズ可能である必要があります。(シリアライズの条件についてはこちらを参照してください)
また、前のシーンと次のシーンで、使用するオブジェクトは、完全に別のものとなります。(一方への操作は、他方に影響しない)
"to.html"に遷移させる例
to : 'to.html',
args : {
test : 'TEST'
}
});
<html>
<head><!--省略--></head>
<body>
<h1>TO</h1>
<div data-h5-scene-container="sub" data-h5-controller="SubController"><!-- 表示対象はこの要素 -->
</div>
</body>
</html>
(function(){
'use strict';
var SubToController = {
__name : 'SubToController',
__init : function(context){
var args = context.args || {};
console.debug(args.test); //->'TEST'
},
};
h5.core.expose(SubToController);
})();
シーンコンテナ所属要素からのsceneChangeRequestイベントの発行
シーンコンテナに所属する要素から、自身を別のシーンに遷移させたい場合は、sceneChangeRequestイベントを発行します。
- 第1引数 … 'sceneChangeRequest'
- 第2引数 … 前述navigateメソッドの引数がオブジェクトの場合と同様です。
to : 'to.html'
args : {
test : 'TEST'
}
});
シーンコンテナ要素にてイベントのバブリングが停止されるので、上方直近のシーンコンテナ要素以外には影響ありません。
シーンコンテナ所属コントローラーからのscene.navigateメソッドの実行
シーンコンテナに所属するコントローラーから、自身を別のシーンに遷移させたい場合は、navigateメソッドを実行します。
内部処理で前述sceneChangeRequestイベントを発行します。
- 第1引数 … 前述navigateメソッドの引数がオブジェクトの場合と同様です。
// コントローラはsceneモジュールを持ちます
// sceneモジュールのnavigate()の実行
this.scene.navigate({
to : 'to.html'
args : {
test : 'TEST'
}
});
シーンコンテナ要素にてイベントのバブリングが停止されるので、上方直近のシーンコンテナ要素以外には影響ありません。
メインシーンコンテナの遷移について
メインシーンコンテナ生成時の注意点
メインシーンコンテナの遷移先として、HTMLのURLを指定する場合、メインシーンコンテナの生成は前述の「HTMLの記述に基づいた自動生成」で行うこととし、「スクリプトによる生成」は行わないようにしてください。
内部処理としては、遷移先のHTMLをAjaxで取得、そのうちのメインシーンコンテナ該当部分をDATA属性等により判別していますが、「スクリプトによる生成」だとHTML上にDATA属性がないため、メインシーンコンテナ該当部分を判別することができず、正しく表示できない場合があります。
メインシーンコンテナの場合、通常のシーン遷移だけでなく、ブラウザの戻る・進む、各HTMLでのリロード、ブックマーク等での直接アクセスについても考慮する必要があります。
HTMLベースでの遷移時、メインシーンコンテナ生成を「スクリプトによる生成」で行うと、この点で不適合になる可能性が非常に高くなります。
また、「HTMLの記述に基づいた自動生成」の場合でも、サーバーから取得したHTMLに所定のDATA属性がなく、クライアントサイドで付加している場合は、同様に正しく表示できない場合があります。
サーバーから取得したHTMLに所定のDATA属性が存在するようにしてください。
次のシーンコントローラーに渡されるパラメータについて
メインシーンコンテナでの遷移時、上述のnavigateメソッドのパラメーターは、h5.u.obj.serialize関数を使用してシリアライズされ、URLのクエリパラメータ、またはハッシュに付加されます。
遷移時はこれがh5.u.obj.deserialize関数を使用してデシリアライズされ、シーンに対応するコントローラーに渡されます。
シリアライズ・デシリアライズの仕様
シリアライズの仕様は以下の通りです。
- ドキュメントロード前に設定された以下の設定を読み込む
- h5.settings.scene.clientFWQueryStringPrefix … シーン遷移パラメーター識別用プレフィクス(FW用) (デフォルト値"_h5_")
- h5.settings.scene.clientQueryStringPrefix … シーン遷移パラメーター識別用プレフィクス (デフォルト値""(空文字))
- ※ver1.2.0ではclientQueryStringPrefixはデフォルト値(空文字)では動作しません(bug)
- 以下、clientQueryStringPrefixに"_cl_"を設定した場合について、説明します。
- navigateメソッドのパラメーターの直下のメンバーのうち、args以外のもの
- そのメンバー名にプレフィクス「_h5_」を付加してキー文字列とする。
- 値をh5.u.obj.serializeによりシリアライズし、シリアライズバージョン識別用の先頭「2|」を削除して値文字列とする。
- キー文字列、値文字列をそれぞれencodeURIComponentでエンコードし、「=」で結合する。
- navigateメソッドのパラメーターの直下のargs
- args直下のメンバーについて、そのメンバー名にプレフィクス「_cl_」を付加してキー文字列とする。
- 値をh5.u.obj.serializeによりシリアライズし、シリアライズバージョン識別用の先頭「2|」を削除して値文字列とする。
- キー文字列、値文字列をそれぞれencodeURIComponentでエンコードし、「=」で結合する。
デシリアライズの仕様は以下の通りです。
- 文字列を「&」で分割する。
- 分割した文字列の「=」の前側をキー文字列とし、後ろ側を値文字列とする。それぞれ、decodeURIComponentでデコードする。
- キー文字列がプレフィクス「_h5_」「_cl_」のものを対象とする。キー文字列からプレフィクスを除いたのもをメンバー名とする。
- 各値文字列は、先頭にシリアライズバージョン識別用に「2|」を付加し、h5.u.obj.deserializeによりデシリアライズする。
- プレフィクス「_h5_」の場合、結果オブジェクト直下に上記メンバー名で値をセットする。
- プレフィクス「_cl_」の場合、結果オブジェクト下のargsプロパティのオブジェクトに上記メンバー名で値をセットする。
シーン遷移パラメーター識別用プレフィクスの変更
上述のプレフィクスについては、変更することができます。
それぞれ、以下の変数にドキュメントロード前に設定してください。
- h5.settings.scene.clientFWQueryStringPrefix … シーン遷移パラメーター識別用プレフィクス(FW用)。デフォルト「"_h5_"」
- h5.settings.scene.clientQueryStringPrefix … シーン遷移パラメーター識別用プレフィクス。デフォルト「""(空文字)」
遷移時のURL変更方式の切り替え
デフォルトではHTML5 History APIを使用してURLを変更します。
h5.settings.scene.urlHistoryModeに以下の値を指定することで、動作を変更することができます。
- 'hash' … シーン遷移パラメーターをハッシュに格納する。h5.scene.urlHistoryMode.HASHも同値。
- 'none' … URLを変更しない。h5.scene.urlHistoryMode.NONEも同値。
- 'fullreload' … Ajaxを使用せず、ページ全体を再読み込みする(通常の遷移)。h5.scene.urlHistoryMode.FULLRELOADも同値。
- 'history'(デフォルト) … HTML5 History APIを使用してURLを変更する。History APIが使用できない場合はハッシュを使用する。h5.scene.urlHistoryMode.HISTORYも同値。
- 'historyOrHash' … 'history'と同義。h5.scene.urlHistoryMode.HISTORY_OR_HASHも同値。
- 'historyOrError' … HTML5 History APIを使用してURLを変更する。History APIが使用できない場合はエラーとする。h5.scene.urlHistoryMode.HISTORY_OR_ERRORも同値。
- 'historyOrNone' … HTML5 History APIを使用してURLを変更する。History APIが使用できない場合はURLを変更せずに遷移する。h5.scene.urlHistoryMode.HISTORY_OR_NONEも同値。
- 'historyOrFullreload' … HTML5 History APIを使用してURLを変更する。History APIが使用できない場合はAjaxを使用せずに遷移する(通常遷移)。h5.scene.urlHistoryMode.HISTORY_OR_FULLRELOADも同値。
サイズ制限について
メインシーンコンテナのシーン遷移時、遷移先のURL長(URL全体)が1800を超過した場合、dev版ではエラーとし、min版では警告ログを出力します。
このサイズは、以下の変数をドキュメントロード前に設定することで変更できます。
- h5.settings.scene.urlMaxLength … シーン遷移先URL最大長。デフォルト1800。
遷移時パラメーターをハッシュに格納する場合の動作
シーン間パラメーターにURLのハッシュ使用する場合は、他のハッシュを使用した機能(ページ内移動等)は使用できません。
また、遷移先としてHTMLのURLが指定された場合、パス自体は変更されず、ハッシュ以下にURLを保持する形式になります。
http://sample/from.html#/to.html?_cl_test=sTEST
/*(参考)ハッシュ使用でない場合*/
http://sample/to.html?_cl_test=sTEST
ハッシュ直下には、ドメインルート以下のパスがすべて指定されることになります。
再表示不可のメッセージ画面について
上述のシーン遷移時、navigationType:'once' または method:'post' を指定した場合、遷移先画面から更に遷移後、ブラウザ履歴等で戻った場合、再表示不可のメッセージ画面を表示します。
フレームワーク内部で持つコントローラーにより、以下のようなデフォルトのメッセージを表示します。
シーンコンテナのタイトル
シーンコンテナのタイトルはシーンコンテナのメソッド、setTitle(タイトル)で設定でき、getTitle()で取得できます。
setTitle()で設定する以外にも、シーンコンテナのタイトルは以下の条件(上が優先)で自動で設定されます。
- navigate()で指定されたパラメータのtitleプロパティの値
- toにコントローラ名が指定された場合はそのコントローラのsceneTitleプロパティの値
- toにページURLが指定された場合は以下
- シーン要素のdata-h5-scene-title属性の値
- シーン要素内のtitleタグの内容
メインシーンコンテナのタイトル
シーンコンテナがメインシーンコンテナである場合は、設定されているタイトルがdocument.titleに反映されます。
document.titleへの反映をさせたくない場合は、h5.settings.scene.followTitleにfalseを設定してください(デフォルトはtrue)。
ベースURLの指定
h5.settings.scene.baseUrl を指定することで、シーンの遷移先、およびルーティング指定のベースとなるURLを指定することができます。
指定しない場合、遷移先としては現URLをベースとし、ルーティング指定はドメインルートがベースとなります。
HTML要素の記述に基づいたコントローラの自動バインド
前提として、 リソース管理機能によりコントローラーのソースファイルが読み込めるよう、ソースファイルを記述・配置する必要があります。
タグにdata-h5-controller属性にてコントローラの__name属性を記述し、ドキュメントロード前にh5.settings.scene.autoInitにtrueを設定すると、フレームワークによりコントローラーのソースファイルロード、およびバインドが自動的に行われます。
[ver1.2.1]また、後述のh5.scene.scan()関数を実行することでも同様にできます。
カンマ区切りで複数記述することも可能です。シーンと同時に指定した場合、最初のコントローラーがシーンコントローラーとなります。
(※シーン遷移時のパラメーターを受け取れるのはシーンコントローラーのみです)
別ウィンドウを開いてのポップアップ[ver1.2.1]
別ウィンドウを開き、そのウィンドウ内のシーンと連携したい場合は以下のAPIを使用します。
ポップアップウィンドウなどを使用したい場合に便利です。
controllerName, controllerParamは指定しなくても構いません。
その場合、第一引数で指定されたURLをロードした結果のHTMLおよびJSコードに基づいて動作が決定されます。
なお、urlで読み込むページは、最低限シーン機能モジュールを有効にしたhifiveをロードする必要があります。
戻り値はPromiseで、完了時の値はRemoteWindowインスタンスです。
ウィンドウを開くことができなかった、一定時間内に子ウィンドウとの通信を確立できなかった、などの場合はPromiseがfailします。
/** 別ウィンドウのシーンを含むウィンドウインスタンス */
window: obj,
/** このウィンドウの現在のメインシーンのメソッドを呼び出す。
戻り値としてPromiseが返された場合、invokeの戻り値はそれに連動したPromiseとなる。
ただし、引数、戻り値とも、h5.u.obj.serialize()でシリアライズ可能でなければならない。
該当する名前のメソッドがない場合、例外が発生した場合などはPromiseがfailする。 */
invoke: function(method:String, args:Array) => Promise,
/** 指定されたセレクタにマッチするコントローラのプロキシオブジェクトを取得。
nullの場合は現在のメインシーンのプロキシオブジェクトを取得。 */
getControllerProxy: function(selector) => InvocationProxy (or null),
/** このウィンドウをモーダル扱いするかどうか。なお、openModalDialogは使用しないので
親ウィンドウの操作をブロックすることによる疑似的なモーダルである。
そのため、一度ウィンドウを開いた後もtrue/falseを切り替えることができる。 */
setModal: function(bool) => Promise,
/** ウィンドウを閉じる(※ブラウザにより閉じない場合があるので注意) */
close: function(void) => Promise //このメソッドは非同期
}
また、RemoteWindowはいくつかのイベントを発生させます。
発生するイベント:
- messageReceived: 子ウィンドウからメッセージを受け取った(evArg.data にデータが含まれる)
子ウィンドウから親ウィンドウにメッセージを送る
子ウィンドウ側では、h5.scene.getParentWindow()を呼び出すと、親ウィンドウのRemoteWindowインスタンスを取得できます。
シーンコンテナのnavigateメソッドの実行[ver1.2.1]
シーンコンテナのnavigateについて、ver1.2.0仕様に加えてver1.2.1では以下のプロパティを設定できます。
- transition … [ver1.2.1] 遷移時のアニメーション効果等を指定します。以下の値が設定できます。
- 'default' … アニメーションなしで遷移(デフォルト) ※現状これのみ
- container … [ver1.2.1] 第一引数により取得したHTML要素内で、表示対象とするコンテナのdata-h5-scene-container属性の値を指定します。メインシーンコンテナでは無効となります。
h5.scene.scan関数[ver1.2.1]
前述の通り、h5.settings.scene.autoInitにtrueを設定した場合、ドキュメントロード時にドキュメント全体を対象としてシーンコンテナ・コントローラーの自動生成が行われますが、これを任意のタイミング、もしくは任意の範囲で行いたい場合は、h5.settings.scene.autoInitにtrueを設定せずに、h5.scene.scan関数を実行してください。
- 第1引数 … 処理対象ルート要素。この要素およびその配下の要素を処理対象とします。指定なしの場合、document.bodyを対象とします。
- 第2引数 … バインド対象コントローラー名。バインドするコントローラーを限定する場合に指定。指定しない場合(null)は限定しない(data-h5-controller属性の値すべてを対象とする)
- 第3引数 … シーンに対応するコントローラー生成時に渡すパラメータ。処理対象ルート要素がシーン要素の場合のみ有効。配下要素のシーンには渡されない。
※フレームワークでの使用のみを想定。メインシーンコンテナ下のシーンに直接使用されると、URLとの矛盾が生じる。
遷移先のルーティングについて[ver1.2.1]
ルーティングの指定[ver1.2.1]
h5.settings.scene.routes を指定することで、シーンの遷移先を変更することができます。この場合、メインシーンコンテナではURLは変更されませんが、表示は変更後の画面となります。
h5.settings.scene.routesは、以下の形式のオブジェクトの配列となります。
- testプロパティ … URLチェック用。文字列、正規表現オブジェクト、関数が指定可能です。
- チェック対象は以下となります。
- History使用であればURLのドメインルート以下からクエリパラメーターまで
- Hash使用であれば、Hash以下をドメインルート以下とみなし、クエリパラメーターまで。ただし、Hash値がない場合はURLのドメインルート以下からクエリパラメーターまで(History使用の場合と同様)
- 指定値の型による動作は以下となります。
- 文字列の場合 … 完全一致をチェックします。
- 正規表現オブジェクトの場合 … 正規表現の一致をチェックします。
- 関数の場合 … 第一引数に上述のチェック対象文字列、第二引数に文字列を遷移パラメーター化したもの(前述「シーンコンテナのnavigateメソッドの実行」の引数と同等)を指定して実行、戻り値がtrueの場合に一致とみなします。
- チェック対象は以下となります。
- navigationInfo … 文字列、オブジェクト、null、関数指定可能です。
- 文字列の場合 … 前述「シーンコンテナのnavigateメソッドの実行」の引数と同様
- オブジェクトの場合 … 前述「シーンコンテナのnavigateメソッドの実行」の引数と同様
- nullの場合 … 変換前のURLに対応した画面を表示します。
- 関数の場合 … 第一引数に上述のチェック対象文字列、第二引数に文字列を遷移パラメーター化したもの(前述「シーンコンテナのnavigateメソッドの実行」の引数と同等)を指定して実行、戻り値は上述の3パターンのいずれかを返却します。
※定義がループしないよう注意してください。変更後の画面は、ブラウザのURLは変更されないものの、内部的にはURLをルーティングします。変更後の画面のURLが更にルーティングされることもあり得ます。
h5.settings.scene.routes = [
{
test: 'string.html?param=value', // 文字列で指定する場合はパラメーターも含めてすべて指定
navigationInfo: 'string_r.html'
}, {
test: /^regexp\.html(?:\?|#|$)/,
navigationInfo: {
to: 'regexp_r.html'
}
}, {
test: function(url, navigationInfo) {
return /^function_url\.html(?:\?|#|$)/.test(url);
},
navigationInfo: function(url, navigationInfo) {
return 'function_url_r.html';
}
}, {
test: function(url, navigationInfo) {
return navigationInfo.to === 'function_info.html';
},
navigationInfo: function(url, navigationInfo) {
navigationInfo.to = 'function_info_r.html'; // この方法だと簡単に他のパラメーターを引き継げる
return navigationInfo;
}
}, {
test: /^no_info\.html(?:\?|#|$)/,
navigationInfo: null // nullを指定した場合は変換前のURLが使用される。
}, {
// 以下、straight1.html → straight2.html → straight3.html と連続しており、
// straight1.htmlに遷移するとstraight3.htmlが表示される。(メインシーンコンテナではURLはstraight1.htmlのまま)
test: /^straight1\.html(?:\?|#|$)/,
navigationInfo: 'straight2.html'
}, {
test: /^straight2\.html(?:\?|#|$)/,
navigationInfo: 'straight3.html'
}
];