解決
実例は次のとおりです:http://jsfiddle.net/Gajotres/5zZzz/
// Detect click on a li element and store its coordinate, change page to another
$(document).on('pagebeforeshow', '#index', function(){
$('#test-list li').on('click', function(){
storePosition.topCoordinate = $(this).offset().top;
$.mobile.changePage('#second');
});
});
// If there's a stored position use silentscroll function and scroll to correct location
$(document).on('pageshow', '#index', function(){
if(storePosition.topCoordinate !== null) {
$.mobile.silentScroll(storePosition.topCoordinate);
}
});
// Store position location
var storePosition = {
topCoordinate : null
}
イントロ
理解する必要のある他の解決策を説明する前に、これはエラーではなく、完璧な解決策もありません。問題は、別のページへの遷移をアニメーション化するには、現在のページと遷移するページが垂直に並ぶように、ビューポートをページの上部に配置する必要があることです。
1ページの長いリスト(たとえば1000px)の途中で、転送先のページの高さが数百ピクセルしかない場合、現在のページは画面から適切にアニメーション化されますが、新しいページは次のように表示されません。ビューポートの上になります。
2つの実際に実行可能なソリューションがあります。
1.iScrollとそのjQueryMobile派生iScrollview
iScrollホームページ:http ://cubiq.org/iscroll-4
iScrollviewホームページ:https ://github.com/watusi/jquery-mobile-iscrollview
iScrollは、iPhoneやAndroidなどのモバイルデバイスでのネイティブスクロールと非常によく似た動作で、Webブラウザ内のウィンドウ内のコンテンツをスクロールできるJavaScriptです。これは、ネイティブのようなスクロールバーと物理演算を使用して、ブラウザ内でウィンドウをスクロールできることを意味します。
それは私たちの現在の問題の解決策でもあります。iScrollの実装により、リストビューがどこまでスクロールされても、ページはページの高さの100%を占めます。これは、リターン時にリストビューが同じ位置にとどまる理由でもあります。
もちろん、このソリューションを実装する場合は、iScrollviewの実装を選択する必要があります。それでもiScrollを実装することはできますが、もっと時間がかかります。
2.サイレントスクロール
私の一番上の例のように:
公式ドキュメント: http: //jquerymobile.com/demos/1.1.0-rc.1/docs/api/methods.html
このjQueryMobileの機能も、そもそもこの問題が発生するのと同じ理由です。ページ遷移がトリガーされる前に、元のページが静かに一番上にスクロールされます。
この場合、リストビューを選択するときは、ページを変更する前に、その位置を覚えておく必要があります(ここでは、ページ遷移中に保存されるデータ/パラメーターのソリューションを見つけることができます。「ページ遷移間のデータ/パラメーター操作」の章を検索してください)。その場合、前のページに戻るときに、pagebefpreshowイベントを使用して、ページが表示される前にサイレントに一番下までスクロールできます。
//scroll to Y 100px
$.mobile.silentScroll(100);
そして、これがサイレントスクロールの実用的な例です:http://jsfiddle.net/Gajotres/2xfrM/
より詳しい情報
このトピックについて詳しく知りたい場合は、この記事を参照してください。実際の例もあります。