KatsuYuzuのブログ

.NET の開発をメインとした日記です。

IE10以降でSilverlightでF5押したらフリーズする不具合と対処

IE10とIE11でSilverlightのWebサイトでSilverlightがフォーカスを持った状態で更新ボタンやF5で更新するとフリーズします。IE8は大丈夫。IE9は環境ないからわからないけど使ってるやつおらんやろ……*1

2014/03/24 追記

テストはIEの開発者ツール(F12)の[ドキュメントモード]で行えます。~9までは再現方法でフリーズしませんが、10~既定の場合はフリーズします。
f:id:KatsuYuzu:20140324223514p:plain
また、対処をドキュメントモードを判定するように修正しました。
ドキュメントモードが~8の時に動的にホストすると初回ロード時に確実に(テスト数回だけど)フリーズします。9の場合にも稀にフリーズします。
よって、対処のようにドキュメントモードで判別するとよいです。IE以外の時は該当プロパティがないので実行されません。

再現方法

  1. プロジェクトを作る
    • Webでホストするようにします
  2. わかりやすいようにボタンでもおいとく
  3. 起動する
  4. おいたボタンを押す
  5. F5押す

_人人人人人人_
> 突然の死 <
 ̄Y^Y^Y^Y^Y ̄

ブラウザの更新ボタンでもフリーズします。冒頭にフォーカス云々書いた通りに起動したあとにSilverlight上のボタンを押さずに更新した場合はフリーズしません。

対処

Silverlightを動的にホストさせます。

function loadSilverlight() {
    if (document.documentMode >= 10) {
        var host = document.getElementById("silverlightControlHost");
        host.innerHTML = host.innerHTML;
    }
}
<body onload="loadSilverlight();">

これだけです。id違うとかファイル分離とかは適宜。

参考

参考の中で、メタタグで互換表示を切り替える方法は不完全で、onloadでやりなさいと書かれてる。ただ文字列で挿してるのが嫌だなーと思って紹介してみた。viewでホストしていて初期化パラメーター切り替えたりしてたからviewで実装した内容使いたいよねって。"適宜"の範囲から出てないけども。

*1:今春で8も使用者いなくなったらいいね