jQuery で AJAX ポーリングを使用して、ASP.NET MVC3 の razor MasterPage のスパン要素を更新しようとしています。このページでは、単純なビューの変更 (/home から /about への移動など) をある種の「遷移」アニメーションで装飾する jQuery Mobile 1.0 フレームワークを使用しています。
これはポーリングを行う Javascript コードであり、"unreadBubble" スパンは本体に配置されています。どちらも MasterPage で定義されています。
<script type="text/javascript">
$(document).bind("pageinit", function poll() {
setTimeout(function () {
$.ajax({ url: "/Notification/GetUnreadNotificationsCount",
dataType: "json",
success: function (data) {
$('#unreadBubble').text(data.UnreadCount);
poll();
}
});
}, 1000);
});
したがって、MasterPage を使用し、Index ビューを提供する HomeController と NotificationController があるとします。AJAX ポーリングは両方のビューで機能し、期待どおりに毎秒スパンを更新します。ただし、あるビューから別のビューに移動するとすぐに、スパンは MasterPage のデフォルト値 (空) で再初期化され、更新されなくなります。興味深いことに、非同期の GetUnreadNotificationsCount メソッドはまだ NotificationsController で繰り返し呼び出されています。スパンは更新されません。また、JS で span タグを警告しようとしましたが、null などではありませんでした。
ドキュメントによると、jQuery Mobile は AJAX を使用して新しいページも読み込み、この手の込んだ「SWOOSH」遷移アニメーションを挿入します。これは、何らかの形で JS/DOM の初期化を妨げているようです。
これを解決する方法はありますか?別のイベントにバインドする必要がありますか、またはどうにかしてスパン タグを強制的に更新できますか?
解決策: キャッシュの問題でした。以下はトリックを行いました: class="command-no-cache"をページ div に追加します 次の JavaScript を MasterPage に追加します:
$(":jqmData(role=page)").live('pagehide', function (event, ui) {
if ($(this).children("div[data-role*='content']").is(".command-no-cache"))
$(this).remove();
});