jquery / jqtouch getJSON呼び出しが無限ループを引き起こす?
質問
初めての JQTouch アプリを作成します。から行くとき #login
に #home
, 、JSON ajax 呼び出しは正常に行われますが、 pageAnimationEnded
イベントが無限ループになっているようです。
$(function(){
$('#login').ajaxComplete(function (e, xhr, settings) {
jQT.goTo('#home', 'flip');
});
$('#home').bind('pageAnimationEnd', function(e, info){
alert('animation ended'); //infinite loop happens in here
$.getJSON('/test', function(data) {
alert('json: ' + data); //this returns data successfully
});
});
});
JQuery がインターセプトして AJAX に変換するログイン POST 呼び出し:
<div id="login" class="current">
<div class="toolbar">
<h1>testapp</h1>
<a class="button slideup" id="infoButton" href="#about">About</a>
</div>
<form:form commandName="user" action="/login/authenticate">
<ul class="edit rounded">
<li><form:input path="email"/></li>
<li><form:password path="password" /></li>
<li>Remember Me<span class="toggle"><input type="checkbox" /></span></li>
</ul>
<a style="margin:0 10px;color:rgba(0,0,0,.9)" href="" class="submit whiteButton">Login</a>
</form:form>
</div>
何かヒントがあれば幸いです。よろしくお願いします。:-)
アップデート
どうやら .ajaxComplete は他の要素のイベントも受け取ります。必要なイベントをフィルターするガードを追加しました。
$(document).ready(function(e){
alert('document ready');
$('#login').ajaxComplete(function (e, xhr, settings) {
if(settings.url == '/login/authenticate') { //add check to prevent infinite loop
alert('jqt goto ' + settings.url);
jQT.goTo('#home', 'flip');
}
});
$('#home').bind('pageAnimationEnd', function(e, info){
alert('animation ended');
$.getJSON('/test', function(data) {
alert('json: ' + data);
});
});
});
解決
ああ、これは間違いなく無限ループを引き起こします。初期だと仮定すると、 pageAnimationEnd
何らかの方法でトリガーされます。次のことを行っています。
アニメーションが終了するので、bind メソッドは ajax 呼び出しを実行します。その ajax 呼び出しには完了時にコールバックが登録されています ajaxComplete()
それは「家に帰りなさい」ということです。この go home はおそらくある種のアニメーションを実行し、完了すると ajax 呼び出しをトリガーします。その ajax 呼び出しには完了時にコールバックが登録されています ajaxComplete()
それは「家に帰りなさい」ということです...そしてずっと。
あなたが望んでいるのはジェネリックではない可能性があります ajaxComplete()
これはすべての ajax リクエストで呼び出されますが、ログイン コードで 1 回の呼び出しを行う特定のリクエストだけが呼び出されます。ただし、何を達成しようとしているのか正確にはわからないので、問題の解決策を提供するのは困難です。私がすべてを正しく理解していれば、これで問題を十分に説明できるはずです
他のヒント
私は JQuery があまり得意ではありませんが、次のものを使用できると思います。 $(selector).one(function(){...}
ループを防ぐため。