7
7

More than 5 years have passed since last update.

iOS8でwindow.close()が動かないバグについて

Last updated at Posted at 2014-12-08

※2014年11月のiOS 8.1.1アップデートで修正されています。(よかった…)
しかし、社内にも、アップデートしていない人がいたりしたので、メモを残します。

iOS 8.0.x, 8.1.0 のSafariでは、window.close()が動かないバグがあります。

EC-CUBEを使った案件で、このバグの対応をしました。

いろいろ調べてみたけれど、どうやらwindow.close()の使い方がおかしいのではなく、iOS8のSafariで、動かないようになっているみたいでした。

Appleの人は

This is a known bug. There isn’t a workaround, sorry.
(あー知ってる。回避策はない。すまん。)

と、言っています。。。

そっか、まじで閉じる方法ないんや…
待つしかないやん。でも、どう見てもおかしい!って感じるよね…

ってことで、なんとか頭ひねりました。

解決策(EC-CUBEスマホ)

不具合内容

  • お届け先編集のページで、登録ボタンを押すと、エラーメッセージは出ず、編集画面が表示される。(画面が閉じない。)
  • 親画面を見てみると、編集は正常に完了している。

対象ページ

  • /mypage/delivery.phpのページのお届け先編集ボタンを押して開かれる、/mypage/delivery_addr.phpのページ

ページの仕様

  • /mypage/delivery_addr.phpのページだけで完結する(完了用などの他ファイルはない)

ページ遷移方法

①編集画面
 ↓
②登録するボタンを押す
 ↓
③裏でチェックが走る(エラーあり)
 ↓
④エラー表示を追加し編集画面を表示する
 ↓
⑤裏でチェックが走る(エラーなし)
 ↓
⑥編集画面が表示されるが、裏で生成されたjsにより、画面が閉じる。親画面が更新されている。

  • ⑥で生成されるjsに、window.close()が記載してあり、通常であれば、ユーザーの体験は、登録ボタンを押すと(エラーがなければ)、画面が閉じる。

解決方法

  • ⑥でjsが生成されていた場合、編集画面ではなく、「登録が完了しました。画面を閉じてください。」などの文言を表示する。
  • つまり、
    window.close()が正常に動くデバイスは、ボタンを押したら画面が閉じ、
    window.close()が動かないデバイスは、ボタンを押したら、上記の文言が表示され、デバイスを操作して画面を閉じる。

編集ファイル

/mypage/delivery_addr.tpl

<!--{if $tpl_onload}-->
    登録が完了しました。<br>
    この画面を閉じ、元の画面を更新してください。
<!--{else}-->
    (編集画面のコード)
<!--{/if}-->

補足すると、<!--{$tpl_onload}-->で生成されるjsは、popup_header.tplのファイルの中に表示されます。

7
7
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
7
7