CISTポータルのMyPageの時間割リンクを別タブで開けるようにする
実装が完了t6o_o6t.icon
/icons/hr.icon
実装方法の検討
時間割のリンク先の特定
リンクが押下された際、以下のように動作する
3. レスポンス先のページに飛ぶ
同じことをすれば、リンク先の授業ページURLを取得することが可能
1. MyPage内にいる際に、scriptタグのうち、text
MyPageに動作を制約する
2.
ページ遷移時と、再読み込み時で挙動が異なる
再読み込み時
はじめから時間割情報もまとめてレスポンスされる
ページ遷移時
Ajaxを用いて非同期的に時間割のHTMLを取得する
初回のリクエストへのレスポンスでは、時間割の部分が「Loading...」となっている
ロードが完了すると、loadedCallbackが呼ばれる?
evaluateがバックグラウンドに、渡されたJavaScriptを実行している?
デバッガを仕掛けた
以下のような流れかと思っていた
画面ロード -> loadedCallback ->
processHeaderContribution(context, <evaluate />)
processContribution(context, <evaluate />)
processScript(<evaluate />)
実際には、processContributionにはこのevaluate要素が処理されていない
使われているWicketのバージョンが違う?
GitHub上のソースコードを見ながらデバッガを走らせていた
デバッガ上では、loadedCallback内で、processEvaluationが呼び出されている
GitHub内には、processEvaluationが存在しない
このPRで削除されていた
2019年
processEvaluationは、大方eval関数でスクリプトを実行しているように見える ページ遷移時には、Ajax通信で、非同期的に時間割のHTMLと、リンク先設定スクリプトが読み込まれる 読み込まれたスクリプトは、processEvaluationによって実行される
スクリプトが実行されることにより、時間割のリンク先が適切に設定される
初回のリクエストへのレスポンスに、時間割のHTMLもまとめて格納されている
リンク先設定スクリプトは、head要素内に<script type="text/javascript"></script>タグのなかに存在する 案1
通信を監視
Ajax通信の内容を見て、timetablePanelを含むレスポンスが返ってきたら、内容をパース
evaluate内の文字列をパースして、リンク先とページURLの対応関係を計算
案2
Wicket.Ajax.prototype.processEvaluationに変更を加える
案3
リンク先は決まって、以下の形式
MyPage?nonce.IBehaviorListener.0-timetablePanel-content-timetableAxisListView-1-timetableBeanListList-{row}-cource-{column}
このリンクにさえ飛ばせれば問題ない
案4
授業タブの内容を取得し、授業名が一致する授業のページにリンクする
code:idea.js
const getURL = (day, hour) => ${document.URL}-2.IBehaviorListener.0-timetablePanel-content-timetableAxisListView-${hour}-timetableBeanListList-${day}-course-0-lectureLink;
const attachHrefToTds = () => {
const rows = document.querySelectorAll("table > tbody > tr");
cells.forEach((tr, x) => {
tr.forEach((td, y) => {
const a = td.querySelector("div > a");
if (a != null) a.href = getURL(x, y);
});
});
}
attachHrefToTds();
これを動くようにするt6o_o6t.icon
特に意図していなかったが、変数、条件分岐、繰り返し、配列をすべて含んでいる
授業がないために動作を検証できないt6o_o6t.icon
できたt6o_o6t.icon
-2.IBehaviorではなく-.IBehaviorとした方が良さそう
前者は動作が安定しなかった