Вызов jquery/jqtouch getJSON вызывает бесконечный цикл?

Пишу свое первое приложение JQTouch. Когда я перехожу от #login к #home, ajax-вызов JSON происходит успешно, но событие 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
                });

            });

        });

Войти POST-вызов, который JQuery перехватывает и превращает в AJAX:

  <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);
                });

             });
        });

person Mark    schedule 06.08.2010    source источник
comment
Я думаю, что это довольно окольное решение. Опять же, как я уже упоминал ниже, я бы избегал всеобъемлющего вызова ajaxComplete (по крайней мере, из-за проблем с производительностью, поскольку он вызывается при КАЖДОМ вызове ajax) и просто предоставлял бы обратный вызов для начального вызова ajax #login (где бы он ни существовал)   -  person brad    schedule 06.08.2010


Ответы (2)


Я. это определенно вызовет бесконечный цикл. Предполагая, что начальный pageAnimationEnd каким-то образом срабатывает, вот что вы делаете:

Анимация заканчивается, поэтому ваш метод привязки выполняет вызов ajax. Этот вызов ajax имеет обратный вызов, зарегистрированный по завершении ajaxComplete(), который говорит «иди домой». Это возвращение домой, по-видимому, делает какую-то анимацию, которая по завершении запускает ваш вызов ajax. Этот вызов ajax имеет обратный вызов, зарегистрированный по завершении ajaxComplete(), который говорит «иди домой» ... и так далее.

Скорее всего, вам нужен не общий ajaxComplete(), который вызывается для всех запросов ajax, а конкретный код вашего входа в систему, который выполняет один вызов. Я не совсем уверен, чего вы пытаетесь достичь, поэтому трудно дать вам решение проблемы. Это должно быть достаточным объяснением вашей проблемы, хотя, если я все правильно понимаю

person brad    schedule 06.08.2010
comment
Спасибо, Брэд. Да, ты определенно прав. Я добавил условную логику, но не уверен, что это масштабируемый способ решения большего количества таких потоков в будущем. Есть ли .ajaxComplete, который будет срабатывать только для определенных элементов? Что я хочу сделать, так это иметь специальный обработчик для каждого элемента в JQTouch. - person Mark; 06.08.2010
comment
Я не знаком с jqTouch. Мне также трудно понять, где происходит вызов ajax для входа в систему, можете ли вы опубликовать больше кода? - person brad; 06.08.2010
comment
Извините, я пропустил это для краткости. Я только что обновил страницу. Это стандартная форма POST, но jquery, конечно, перехватывает это и делает вызов AJAX. - person Mark; 06.08.2010
comment
где код, который фактически перехватывает вход в форму? т.е. $("#login form").submit(function(){ // do SOmeting }); - person brad; 06.08.2010
comment
Когда я отлаживал его с помощью firefox, казалось, что он находится в самой библиотеке jquery.js. Мой минимизирован, поэтому не читается. - person Mark; 06.08.2010

Я не очень хорошо разбираюсь в JQuery, но я думаю, что вы могли бы использовать $(selector).one(function(){...} для предотвращения цикла.

http://api.jquery.com/one/

person user413087    schedule 06.08.2010