2012-02-27 5 views
1

Прошу прощения, что я очень новичок в javascript. У меня есть некоторые поднятые аспекты JQuery, чтобы расширить дизайн моего сайта, но я никогда не изучал основы или синтаксис.Удалите старый контент, загружайте новый контент, анимируйте новый контент с помощью JQuery

Вот что я хочу сделать: когда пользователь нажимает на ссылку в списке #nav, div #content будет анимироваться вверху экрана по высоте #content. Тогда #content будет скрыт. Затем #content будет заменен новым содержимым, загруженным со страницы, на которую ссылается ссылка, на которую пользователь нажал #nav. #content должен оставаться скрытым, а затем перемещаться под экраном по высоте окна просмотра. Затем #content будет видимым и анимированным обратно в исходное местоположение. Ниже приведен код, который я издевался, но он работает неправильно.

Спасибо!

$(document).ready(function() { 

$('#nav li a').click(function(){ 

    var toLoad = $(this).attr('href')+' #content'; 

    var oldHeight = $('#content').css("height"); 

    var viewportHeight = $(window).height(); 

    $('#content').animate({ 
     top: "-" + oldHeight 
    }, 'slow'); 

    $('#content').hide(); 

    $('#content').load(toLoad); 

    $('#content').animate({ 
     top: viewportHeight + "px" 
    }); 

    $('#content').show(); 

    $('#content').animate({ 
     top: "0px" 
    }, 'slow'); 

    return false; 

}); 

}); 
+0

Объясните, что не работает, если возможно, настройте JSFiddle с вашим текущим решением, так как ваше объяснение того, что вам нужно, кажется сложным –

ответ

1

Что вы просите его, чтобы выполнить все после load() только тогда, когда он загружает что-то ...

load() является асинхронным, и вы можете увидеть полную подпись метода в jQuery website, где он говорит: что вы можете добавить function, который будет срабатывать при завершении загрузки.

из вашего примера просто положить все после вашей load() внутри этого метода ...

конечный результат должен выглядеть следующим образом:

var clickedAnchors = []; 

$(document).ready(function() { 

    $('#nav li a').click(function() { 

     var toLoad = $(this).attr('href')+' #content';   
     var oldHeight = $('#content').css("height");   
     var viewportHeight = $(window).height(); 

     $('#content').animate({ 
      top: "-" + oldHeight 
     }, 'slow', function() { 

      $('#content').hide();   
      $('#content').load(toLoad, function() { 


      $('#content').animate({ 
       top: viewportHeight + "px" 
      }); 

      $('#content').show();   
      $('#content').animate({ 
       top: "0px" 
      }, 'slow'); 

      }); // close load 

     }); // close animate 

     return false; 

    }); // close selector 
}); // close document.ready 

Помните, что один из самых приятных особенностей JQuery является каскадным, так ваш код может на самом деле выглядеть так:

+0

У меня есть следующий вопрос. Как бы я установил, чтобы это не выполнялось, если пользователь нажимает ссылку для загрузки содержимого, которое уже отображается? Например, если пользователь нажимает ссылку на «страницу», он будет запускать эту функцию, делать всю анимацию и отображать новое содержимое. Но если пользователь второй раз щелкнет ссылку на «страницу», она снова запустит анимацию, даже если контент для «страницы» уже отображается. – MJR

+0

, поэтому вы хотите запускать только один раз ... тогда вам просто нужно ** отделить ** щелчок даже от этого тега привязки (ссылка) ... Я обновлю код, представляющий, что каждый якорь имеет уникальный 'id' , – balexandre

+0

Обновленный код, который вы предоставили, работает хорошо, но я хочу иметь возможность запускать функцию более одного раза, просто не загружайте одно и то же содержимое дважды подряд.Извините, я не знал, что мне нужно для кода. Если это помогает сделать его более понятным, то, что я создаю, является страницей портфолио, где пользователь может вытягивать разные проекты, нажимая на элементы на nav. Я хочу, чтобы пользователь мог загружать «проект 1», затем загружать «проект 2», а затем загружать «проект 1», если они того пожелают. Я просто не хочу перезагружать «проект 1», если это уже содержимое, загруженное на страницу. – MJR

1

Вы хотите использовать функцию обратного вызова для своих анимаций, заказ:

$(function() { 

    $('#nav li a').click(function(){ 

     //notice I used commas to separate the variable declarations, and I cached the `#content` selection since it will be used several times 
     var toLoad   = $(this).attr('href') + ' #content', 
      oldHeight  = $('#content').css("height"), 
      viewportHeight = $(window).height(), 
      $content  = $('#content'); 

     //animate the element out-of-view 
     $content.animate({ 
      top : "-" + oldHeight 
     }, 'slow', function() { 

      //once the animation is complete, load the new data via AJAX 
      $content.load(toLoad, function() { 

       //once the AJAX request is complete, then animate the element back into view 
       $content.animate({ 
        top : "0px" 
       }, 'slow'); 
      }); 
     }); 

     return false; 

    }); 

}); 

Когда вы сделаете это:

$('#content').animate({ 
     top: "-" + oldHeight 
    }, 'slow'); 

    $('#content').hide(); 

Вы говоривший принять как 750ms анимировать элемент вне зрения, но вы сразу же, говоря, «дать элемент display : none» , поэтому элемент скрывается с .hide() перед завершением вызова .animate(). Вот почему мы используем обратные вызовы.

Кроме того, если вы собираетесь использовать два или более функций на объекте JQuery, то вы должны приковать вызовов функций вместо повторного выбора элемента (ов):

$('#content').animate({ 
     top: "-" + oldHeight 
    }, 'slow').css({ color : '#fff' }); 
+0

Большое спасибо за то, что нашли время ответить ! – MJR

Смежные вопросы