【SharePointアプリ】iFrame追加
SharePointアプリはサーバーサイドロジックを使用しないSharePointホスト型アプリであっても裏側でサーバーサイド用のポストバック用Scriptやformなどを吐き出しています。
これが悪さをするらしく、画面の縦位置が正しく取れなかったりするようです。
これにより外部のライブラリ(jquery.validationEngine等)が正しく動作しなくなります。
jquery.validationEngineの場合
・デフォルトのformと追加したformがネスト状態になり動作しない。デフォルトformを指定することで逃げられるが、formを二つ配置できない。
・オブジェクトの正しい相対位置が取れないため、バルーンの描画位置がずれる。
これらのフレームワークに付随した不具合を極力回避するために、iFrameを使用してコンテンツ自体はhtml化することにしました。
考慮点はそこそこあるのですが、大きくはまず以下の2点。
iFrameの高さを再計算する。
下記サイトを参考にさせていただきましたが、そのままではSharePointアプリ上では動作しないため、若干変更しています。
iframe の高さを内容に応じて自動で調節する JS 他 | ヨモツネット
<asp:Content ContentPlaceHolderID="PlaceHolderMain" runat="server"> <script> // iFrame高さ計算 var iframeHeight = function () { var iframe = document.getElementById('frmMain'); if (iframe.contentDocument == undefined) { return false; } var childDiv = document.getElementById('frmMain').contentDocument.getElementsByTagName('div')[0]; if (childDiv != null) { iframe.style.height = (childDiv.scrollHeight + 50) + 'px'; } setTimeout('iframeHeight()', 750); } try { window.addEventListener('load', iframeHeight, false); } catch (e) { window.attachEvent('onload', iframeHeight); } </script> <div> <iframe id="frmMain" name="frmMain" src="./ChildPage.html" style="width:800px;" seamless/> </div> </asp:Content>
親画面からCSSをコピーする。
親画面にはテンプレートで追加されたスタイルシートがあり、コンテンツ自体もこの変更に追従する必要があるため、親画面からコピーすることにしました。
function copyParentCss() { var link = window.parent.document.head.getElementsByTagName('link'); for (var i = 0; i < link.length; i++) { $("head").append(link[i].outerHTML); }; }
とりあえずASP.NET系のWebフォームはJavaScript系ライブラリと相性が悪すぎ。
せめて必要のないコードをつらつら吐くのは止めて欲しい。。
本家はASP.NET MVCに移行する気満々で、今後ライブラリとの親和性が改善されるはずもないので、SharePointアプリもそっちに寄せて欲しいです(続ける気があるのなら。。)