AJAX経由でフォームをロードするJquery Mobileページがあります。プラグインを使用してページのサイズを設定しています。プラグインは、Ajax が実行され、レイアウトが更新された後にサイズを計算します (少なくとも、以下のコンソールは後で取得されます)。
コンテンツを受け取った要素の高さを取得する必要がありますが、何をしようとしても、ゴミになります(1200pxではなく〜169px)
これが私のコードです:
(inside plugin)
some: function(){
var self = this,
o = self.options,
wrap = $('div:jqmData(wrapper="true").ui-page-active').last(),
// elements
panels = wrap.find('.ui-panel.ui-panel-active').filter(':not(.ui-popover)'),
pages = panels.find('.ui-page'),
contents = pages.find('.ui-content');
// maxHeight contents
for ( var i = 0; i < contents.length; i++){
ct = contents.eq(i);
console.log( ct );
console.log( ct.css("height") )
console.log( ct.height() );
console.log( ct.outerHeight() );
// max
if ( ct.css("height") > parseFloat( o._iPadFixHeight ) ){
o._iPadFixHeight = parseFloat( ct.css("height") ) + parseFloat( ct.css('padding-top')) + parseFloat( ct.css('padding-bottom')) ;
};
}
...
AJAX を使用していない場合、これは正しく機能します。AJAX を介して動的にコンテンツを追加している場合、コンソールはすべて AJAX の後に起動しますが、それでも false 値しか返しません。
質問:
AJAX の更新後にコンテンツ要素の高さを確実に取得するにはどうすればよいですか? すべてがそこにあるまで待つために、Ajaxの後に10秒のタイムアウトを設定しようとしました。違いはありません.10秒後、コンテンツ要素の高さはまだ正しくありません.
手伝ってくれてありがとう!
編集:
コンソールはAJAXのロード後にログを記録しますが、関数は前に起動していると思うので、AJAX以前のディメンションに基づいて計算しています。これを使用して再起動することを考えています:
$(window).on('dimensionchange', function(){
self.ome();
})
そしてトリガー
$(window).trigger('dimensionchange')
私のAJAX成功ハンドラーで。完璧ではありませんが、これで十分だと思います。
EDIT2:
動作するようになりました。@HolgerDSchaufは正しかった。最初の関数の実行時に false の値を設定しましたが、AJAX が導入された後も false の値が設定されていました。私は今、次のように修正しています:
アヤックスの成功:
...
// cleanup dimensions
$(window).trigger( 'dimensionclear');
...
window.setTimeout(function() {
target.removeClass('.fade.in');
// recalculate
$(window).trigger('dimensionchange');
},250);
私のプラグインでは:
$(window).on('dimensionchange', function(){
self.ome();
});
$(window).on('dimensionclear', function(){
self.ome("clear");
});
そしてOME関数では:
// cleanup
if ( from == "clear") {
contents.css({'height':'', 'max-height':''})
return;
}
魅力のように機能します。