問題
Liferay 6.2からDXP 7.4にアップグレードしました。
いくつかのページに問題があり、直接リンクを開くと正しく読み込まれますが、ページを切り替えると空白のまま読み込まれます。
この問題は、ウェブコンテンツ、ページフラグメント、ページコンフィギュレーションにdocument.writeコードを呼び出すjavascriptコードが含まれている場合にのみ発生します。
なぜこのような問題が生じるのか? どうすれば解決できますか?
環境
- 任意のLiferay DXP 7.xバージョン
- あらゆる四半期リリース
解像度
document.write命令は、ページが正常にロードされる場合には問題を引き起こさないが、ページがシングル・ページ・アプリケーション(SPA)機能でロードされる場合にはエラーを発生させる。
document.writeが シングル・ページ・アプリケーション(SPA)で問題を引き起こす理由は、以下の通りである:
- ページを変更するとき、この機能はバックグラウンドで新しいページのHTMLをロードし、メモリ内のページのDOM構造を変更することでコンテンツをロードする。
- 欠点は、ロード後、この機能は更新されたページのすべてのJavascriptコードを処理し、それらのフラグメントを強制的に実行しなければならないことである。
-
問題は、その時点でドキュメント・ストリームはすでに閉じられており、ストリームが閉じられているときに
document.writeを使うと、内部でdocument.open()が実行されることになり、ドキュメントがクリアされてしまうことだ。
document.writeメソッドを使用することで発生するこれらの問題については、以下のドキュメントを参照してください: https://developer.mozilla.org/en-US/docs/Web/API/Document/writeに、この方法が強く推奨されないことと、ドキュメントがクリアされる理由が説明されています。
報告されている問題を回避するためには、2つの選択肢がある:
-
オプション 1:システムのウェブコンテンツを見直し、
document.writeの使用をすべて排除する。 -
オプション2:
javascript.single.page.application.enabled=true(詳細はSPAを無効にするを参照してください。)
最初の選択肢を選ぶことをお勧めする。
追加情報
DXP 7.4以降で、document.write行で削除するウェブコンテンツを検出したい場合は、以下のSQLを使用します:
SELECT * FROM JournalArticle WHERE (articleId, version) IN (SELECT articleId, MAX(version) AS version FROM JournalArticle WHERE id_ IN (SELECT DISTINCT storageId FROM DDMFieldAttribute WHERE largeAttributeValue LIKE '%document.write%') GROUP BY articleId);