jQueryMobileを使用して最近のモバイル アプリケーションの 1 つにすばらしい写真スワイプ ライブラリを実装しましたが、それを iOS 5 と併用して小さな問題に遭遇しました (他の可能性もありますが、私は iOS 5 デバイスしか持っていません)。
以下は、実装されたjavascriptです
<script type="text/javascript">
(function (window, $, PhotoSwipe) {
$(document).ready(function () {
$('div.gallery-page')
.live('pageshow', function (e) {
var
currentPage = $(e.target),
options = {},
photoSwipeInstance = $("ul.gallery a", e.target).photoSwipe(options, currentPage.attr('id'));
photoSwipeInstance.show(0);
return true;
})
.live('pagehide', function (e) {
var
currentPage = $(e.target),
photoSwipeInstance = PhotoSwipe.getInstance(currentPage.attr('id'));
if (typeof photoSwipeInstance != "undefined" && photoSwipeInstance != null) {
PhotoSwipe.detatch(photoSwipeInstance);
}
console.log($(e.target));
history.back();
return true;
});
});
} (window, window.jQuery, window.Code.PhotoSwipe));
</script>
上記の例は、実装ガイドに記載されているのとほぼ同じですが、1 つの違いがあります。pageshow イベントが発生し、インスタンスがアタッチされている場合、「photoSwipeInstance.show(0);」を呼び出しています。ギャラリーをすぐに表示するようにします。
ツールバーからギャラリーを閉じると、呼び出し元のページではなく静的ページに戻ることを除いて、これはすべて正常に機能します。
私が最初に考えたのは、イベント「onHide」に対するメソッドを実装し、「history.back();」を実行することでした。声明:
photoSwipeInstance.addEventHandler(PhotoSwipe.EventTypes.onHide, function (e) {
history.back();
});
これは Android では魔法のように機能しましたが、iOS では何も起こらなかったため、iOS デバイスの二重の歴史について考えてみました。
photoSwipeInstance.addEventHandler(PhotoSwipe.EventTypes.onHide, function (e) {
console.log(navigator.appVersion);
if ((/iphone|ipod|ipad.*os 5/gi).test(navigator.appVersion)) {
history.go(-2);
} else {
history.back();
}
});
しかし、それでもうまくいきません.iOSはただそこに座って私を笑っています. 実際のhtmlページに戻るのではなく、写真スワイプインスタンスを添付したページにリダイレクトする最良の方法を知っている人はいますか? 最終的な JS マークアップの例を次に示します。
<script type="text/javascript">
(function (window, $, PhotoSwipe) {
$(document).ready(function () {
$('div.gallery-page')
.live('pageshow', function (e) {
var
currentPage = $(e.target),
options = {},
photoSwipeInstance = $("ul.gallery a", e.target).photoSwipe(options, currentPage.attr('id'));
// onHide event wire back to previous page.
photoSwipeInstance.addEventHandler(PhotoSwipe.EventTypes.onHide, function (e) {
console.log(navigator.appVersion);
if ((/iphone|ipod|ipad.*os 5/gi).test(navigator.appVersion)) {
history.go(-2);
} else {
history.back();
}
});
photoSwipeInstance.show(0);
return true;
})
.live('pagehide', function (e) {
var
currentPage = $(e.target),
photoSwipeInstance = PhotoSwipe.getInstance(currentPage.attr('id'));
if (typeof photoSwipeInstance != "undefined" && photoSwipeInstance != null) {
PhotoSwipe.detatch(photoSwipeInstance);
}
return true;
});
});
} (window, window.jQuery, window.Code.PhotoSwipe));
</script>