前提・実現したいこと
IEで動いていたアプリのChrome・Edge対応を行っています。
onShowModalDialogが廃止となっているため、window.openをコールバック関数を使用して子画面を開くよう修正しました。
うまく動いたと思ったのですが、ボタン押下前の状態が特定のときだけ子画面が閉じなくなりました。
デバッガーを開いたところ、Failed to loadとUncaught TypeErrorのメッセージが出ていました。
探したところFailed to loadはbootstrap.jsのGETのところで赤線が引かれ、上記エラーとXMLHttpRequestの非推奨警告(これもどうにかしないといけない)が出ていました。
2つ目のエラーはどこで発生したのか辿れていませんが、1つ目のメッセージの箇所までは出てきていない&load時には消えているため、404エラー由来のものではないかと思っています。(functionがないって言ってるんだろうなと思っています)
Failed to loadエラーが解決しなくても、IEと同様の動作をChromeでもすることが最優先となっています。
JSF1.2からバージョンを上げる等の構成を変える回避策は取れません。(私にその権限がないです)
回避すら無理な場合は、その理由もしくはこの辺りを調べるといいというのを教えていただきたく思います。
発生している問題・エラーメッセージ
Failed to load resource: the server responded with a status of 404 (プロジェクト名/theme/com/sun/webui/jsf/suntheme4_2-08320/javascript/theme/nls/ja-jp/suntheme.js) Uncaught TypeError: window.opener[callback_id] is not a function at 画面名.jsp at HTMLInputElement.eval (eval at webui.suntheme4.2.widget.widgetBase setEventProps (webui.js)
該当のソースコード
実際のソースを持ってくるわけにはいかないため、当ソースコードは概要でしかないことを悪しからずご了承ください。
(ダミーを作ろうにも実行環境が投稿時になく、メモと記憶を頼りに省略もありで書いてあります)
JSFのタグについても正確な記述ではありません。
処理の流れとしては以下の通りです。
1.親画面にて「ボタン」を押下し、モーダルで子画面を開く。
2.子画面で「テキストボックス3」に値を入力し「子ボタン」を押下し親画面に値を引き渡すとともに画面を閉じる
3.親画面にて子画面から受け取った値をテキストボックス1に設定、サーバでの処理後テキストボックス2にフォーカスを当てる
■□■親画面■□■ [テキストボックス1][ボタン][テキストボックス2] <script> function funcBlur() { // 下準備してサーバに処理を移譲 } funcOpenWindow(param) { // callback関数を利用してonShowModalWindow()をwindow.openで開くよう修正 } </script> <h:inputText value='#{bean.id}' onblur='funcBlur()'/> <!-- <h:commandButton onclick='funcOpenWindow(引数の設定);return false;' value="ボタン" /> --> <h:commandButton onmousedown='funcOpenWindow(引数の設定);return false;' value="ボタン" /> <h:inputText value='#{bean.id}'/> ■□■子画面■□■ [テキストボックス3][子ボタン] <script> function funcReturnVal(param) { var callback_id = window.name; window.opener[callback_id](param); window.close(); } </script> <h:inputText value='#{bean.id}'/> <h:commandButton onmousedown='funcReturnVal("テキストボックス3の値");return false;' value="子ボタン" />
試したこと
IEとChromeで比較実行した際は以下の通りになりました。
1.テキストボックス1未入力&フォーカステキストボックス1で「ボタン」押下し処理開始→正常
2.フォーカステキストボックス2で「ボタン」押下し処理開始→正常
3.テキストボックス1入力済み&フォーカステキストボックス1で「ボタン」押下し処理開始→異常
同じ処理でも開始時の条件によって結果が異なり、IEとChromeで差異があった3.では
子画面・funcReturnVal(param)のwindow.openercallback_id;の箇所→F11
bootstrap.jsのGETにてエラーによりJavaScript停止
子画面がリロードされる
となりました。
エラーの原因となっているbootstrap.jsにブレークポイントを置いて1~3のパターン時にエラー個所を通っているか調べようともしたのですが、メモリの関係上bootstrap.jsで応答待ちになってしまい正確なところはわかりませんでした。
しかし、onloadとwindow.closeの箇所においたものについては、正常に終了した1と2は止まったものの、3はwindow.closeでは止まらずonloadのブレークポイントにて止まりました。
いろいろ調べてみたのですが、JSFの使用は初めてかつ既存プロジェクトのため勝手がわからず、上記の404エラーがIEとChrome間差異の原因なのかすら分かりません。
404エラーは……/ja-jp/suntheme.jsファイルが存在しないということは理解しデバッガーでも存在していなかったため、そりゃ出るわなぁという気持ちではあります。
ライブラリもsuntheme.jarとsuntheme_ja.jarしか登録しておりません。
インターネットでsuntheme_ja-jp.jarがないか探してみたのですが、見当たりませんでした。
(そもそも存在しないのかもしれませんが)
またIEでは404エラーが出ていなかったのにChromeでは起動初期表示画面から出ているので、ブラウザ差なのかなと思っています。
jspファイルのjsp:rootタグ内にあるlangが"ja-JP"だったので、それを"ja"に変えて実行してみましたが変わりませんでした。(変更したのが1画面だけだったのもあるかもしれません)
langはja-JPのはずなのにFailed to loadエラーがIEでは出ない理由もまるで分かりません。
長々と質問してしまい申し訳ありません。
どうか問題解決の糸口を見つけるご協力をよろしくお願いいたします。
補足情報(FW/ツールのバージョンなど)
JSF1.2
GlassFish v2.1
NetBeans IDE 6.5.1
JavaEE JDK 1.6.0_13
Chrome80.0.3987.163 officalBuild 32ビット
(この構成おかしい、というのがあれば教えてください。メモが誤っている可能性が高いです)
あなたの回答
tips
プレビュー